はじめに
書籍 Pythonで学ぶ音源分離 の2章で録音する場面があるのですが、ちょっと詰まったのでメモしておきます。
環境
sounddevice
は pip install sounddevice
が必要です。wave
は組み込みなので必要ありません。
macOS 10.15.6
Python 3.7.8
sounddevice 0.4.1
録音+保存
import numpy as np
import sounddevice as sd
import wave
FILE_NAME = './test.wav' # 保存するファイル名
wave_length = 2 # 録音する長さ(秒)
sample_rate = 16_000 # サンプリング周波数
# 録音開始(wave_length秒間録音。wait で録音し終わるまで待つ)
data = sd.rec(int(wave_length * sample_rate), sample_rate, channels=1)
sd.wait()
# ノーマライズ。量子化ビット16bitで録音するので int16 の範囲で最大化する
data = data / data.max() * np.iinfo(np.int16).max
# float -> int
data = data.astype(np.int16)
# ファイル保存
with wave.open(FILE_NAME, mode='wb') as wb:
wb.setnchannels(1) # モノラル
wb.setsampwidth(2) # 16bit=2byte
wb.setframerate(sample_rate)
wb.writeframes(data.tobytes()) # バイト列に変換
- 書籍と異なり、ここでは
with
文を使いました -
wave.open
はwb
で開くので、writeframes
の中身もバイト列にします- numpy配列は
tobytes()
でバイト列に変換になります -
sd.rec
はfloat
を返すので、data
を整数型(16bitの場合はnp.int16
)に変換する必要があります
- numpy配列は
自分は整数型に変換するのを忘れていて、何を録音してもホワイトノイズのような音になっていました。
ご参考になれば幸いです。
参考
-
wave
ドキュメント https://docs.python.org/3.7/library/wave.html -
sounddevice
ドキュメント https://python-sounddevice.readthedocs.io/en/0.4.1/usage.html#recording