LoginSignup
3
3

More than 3 years have passed since last update.

Python で録音→ファイル保存 (sounddevice+wave)

Last updated at Posted at 2020-10-03

はじめに

書籍 Pythonで学ぶ音源分離 の2章で録音する場面があるのですが、ちょっと詰まったのでメモしておきます。

環境

sounddevicepip 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.openwb で開くので、writeframesの中身もバイト列にします
    • numpy配列はtobytes()でバイト列に変換になります
    • sd.recfloatを返すので、dataを整数型(16bitの場合はnp.int16)に変換する必要があります

自分は整数型に変換するのを忘れていて、何を録音してもホワイトノイズのような音になっていました。
ご参考になれば幸いです。

参考

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3