ASIOなオーディオデバイスで同時録音・再生(python)

・したいこと

-python環境でKOMPLETE AUDIO6というオーディオインタフェースにて音声の再生と録音を同時に行う.


・環境

-think padX270(Lenovo)

-pyhton3.6.3

-KOMPLETE AUDIO6

・問題点

-windowsにてKOMPLETE AUDIO6をフルに使うには

ASIOに対応させる必要がある.

-同時に再生と録音を行うには並列処理とか?が

必要かもしれないがめんどくさい

これらの問題点を解決できる素晴らしいpythonモジュールがあります。

その名もsounddevice

皆さんpythonといえば標準モジュールのwaveやpyaudioを使ったことがあるかもしれません。でもこれらには再生と録音それぞれの機能を持った関数があるんですが同時にしてくれるものがないです。(間違ってたらスミマセン)

ですがこのsounddeviceにはplayrec()というメソッドがありまして簡単に同時録音・再生が可能です。

これから皆さんに使い方をシェアしたいと思います。

とはいっても基本的に公式ページに沿っていつも通り

python3 -m pip install sounddevice --user
import sounddevice as sd

導入を済ませて次にデフォルト設定

sd.default.samplerate = 96000#サンプリングレート
sd.default.channels = 1#チャネル数
dev = [18,18]#デバイスのインデックス.左がインプット、右がアウトプット
sd.default.device = dev

デバイスのインデックスですが下記のquery_devices()で

print(sd.query_devices())
下記のようにPCに接続されているデバイス一覧が出ますので
ASIOを指してる18番を指定します。公式ページとデバイスの設定の方法が微妙に違いますが、僕の環境ではこの書き方でないとエラーが出たのでこういう記述になってます。
後は音源をarray配列にしてsd.playrec()に渡せば完了です。
以下に正弦波(4.4kHz)をサンプリングレート96kHzで鳴らして録音、プロットしたコードと結果です。
import sounddevice as sd
import matplotlib.pyplot as plt
import numpy as np

""""現在の取得可能なデバイスの一覧を表示"""
#print("query devices")
#print(sd.query_devices())

fs = 96000#サンプリングレート
a = 1#sin波の振幅
f = 4400#sin波の周波数
sec = 3#sin波の時間
swav = []#sin波を入れるリスト

"""sounddeviceの初期設定"""
sd.default.samplerate = fs
sd.default.channels = 1
dev = [18,18]
sd.default.device = dev

if __name__ == '__main__':
#サイン波の生成
for n in np.arange(fs * sec):
    s = a * np.sin(2.0 * np.pi * f * n / fs)
swav.append(s)

record = sd.playrec(np.array(swav))#再生・録音を同時に行うメソッド
sd.wait()#playrec()の処理が終わるまでまつ

"""可視化"""
plt.subplot(2, 1, 1)
plt.plot(swav[0:10000],label="played sin wave")#再生した信号
plt.legend()
plt.subplot(2, 1, 2)
plt.plot(record[0:10000],label="recorded sin wave")#録音された信号
plt.legend()
plt.show()
上が最初から約0.1秒分(10000サンプル)の再生した波形(上)と録音された波形(下)です.波形全体に波が見られますがこれは録音マイクの性能が原因と思われます。問題は下の約2500サンプル分がおかしいですね。これはおそらく最初のタイムラグだと思われまして毎回約0.02秒ほど録音がとれていません。ですのでそこらへんは調整が必要です。
さらに拡大したのが下の図です。
振幅値はマイクの特性によりますので気にしないでほしいのですが周波数自体はしっかりあっていますし、だいたいきれいに録音できています。
以上pythonで録音・再生を同時に行う方法をまとめてみました。
シンプルで扱いやすいですしとても重宝しているので皆さんもぜひ使ってみてください。
またPCで音源を扱うにはオーディオインタフェースは必須ですので、皆さんも自分に合ったものを買いましょう。
Sponsored Link
Tagged on: , ,

3 thoughts on “ASIOなオーディオデバイスで同時録音・再生(python)

  1. Pingback: 耳内部の音を録音する_実験編(ヒアラブルデバイス) – pythonで生きていく

  2. Pingback: pythonでインパルス応答測定 – pythonで生きていく

  3. Pingback: pythonでインパルス応答測定②[Swept-Sine法]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です