音響測定でDAWで録音→書き出し→Pythonで分析の流れが非常に面倒だったので、なんとかワークフローを自動化できないかなと思っていたところ、sounddeviceという再生、録音をPython上で簡単に行えるモジュールを見つけたので、メモしておきます。
インストール
anacondaを使っている場合
conda install -c conda-forge python-sounddevice
pipの場合
python3 -m pip install sounddevice --user
でインストールできます。
使い方
まずはじめにインポートします。
import sounddevice as sd
デバイス設定
ターミナルから以下のコマンドを打つと、使えるデバイスの一覧が出てきます。
python3 -m sounddevice
>>>
0 Scarlett 2i2 USB, Core Audio (2 in, 2 out)
1 MacBook Proのマイク, Core Audio (1 in, 0 out)
2 MacBook Proのスピーカー, Core Audio (0 in, 2 out)
Pythonのスクリプト上で、 sounddevice.default.device
にデバイス番号をアサインすると使うデバイスを設定することができます。
import sounddevice as sd
sd.default.device = 0 #Scarlet 2i2の入出力を使う
# sd.default.device = [in, out]のように、入出力で別々にアサインすることも可能
例:sd.default.device = [1, 2]
再生
例えば440Hzの正弦波を3秒再生したい場合、 sounddevice.play()
を使うことで行なえます。
import numpy as np
import sounddevice as sd
fs = 48000 #サンプリング周波数
f0 = 440 #周波数
duration = 3 #再生時間
t = np.linspace(0, duration, duration * fs, endpoint=False)
x = np.sin(2*np.pi*f0*t)
sd.play(x, fs)
sd.wait()
#sd.stop()で再生停止もできます
録音
録音はsounddevice.rec()
で行えます。録音している間に他の処理を行いたい場合は、sounddevice.rec()
の下に処理をかけば良いですが、そうではなくて、録音が終わってから処理を行いたい場合はsounddevice.wait()
を使って次の処理に進ませないようにする必要があります。
import sounddevice as sd
fs = 48000
duration = 5 # seconds
myrecording = sd.rec(int(duration * fs), samplerate=fs, channels=1)
sd.wait() #
'''
何らかの処理
'''
再生と同時に録音
これは個人的に一番使うことになると思うのですが、再生と同時に録音も行いたい場合はsounddevice.playrec()
を使います。
例えばスピーカに先程の正弦波を入力して、スピーカからの出力をマイクで録音する処理は場合は以下のコードで行えます。
import numpy as np
import sounddevice as sd
fs = 48000 #サンプリング周波数
f0 = 440 #周波数
duration = 3 #再生時間
t = np.linspace(0, duration, duration * fs, endpoint=False)
x = np.sin(2*np.pi*f0*t)
recording = sd.playrec(x, fs)
sd.wait()
注意点
きちんと同期がとれるかはまだ未確認なので利用時は自己責任でお願いします。
また確認次第追記します。
参考