Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
14
Help us understand the problem. What is going on with this article?
@tmtakashi_dist

sounddeviceでPythonを使って録音する

More than 1 year has passed since last update.

音響測定で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()

注意点

きちんと同期がとれるかはまだ未確認なので利用時は自己責任でお願いします。
また確認次第追記します。

参考

14
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
tmtakashi_dist
音響、機械学習、Webを勉強しています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
14
Help us understand the problem. What is going on with this article?