【Python】録音と再生(SoundCard, SoundFile)
はじめに
pythonでマイクとスピーカーを扱いたいなー
(PyAudioより)軽そうなライブラリを見つけた!
ついでにwav書き出しと読み込んで再生までメモしとこ~、って感じです
0. PCスペック
1. 導入(SoundCard)
SoundCardというライブラリを使用します(詳細は公式サイト見てください)
pip install で入ります
python -m pip install soundcard
2. 使い方
公式サイト(https://pypi.org/project/SoundCard/)を見れば大体わかりますが、print文など追加して確認していきましょう
2.1 マイク・スピーカーの取得
all_speakers():接続されているスピーカーのlistを取得
default_speaker():PCが現在使用してるスピーカーを取得
all_microphones():接続されているマイクのlistを取得
default_microphone():PCが現在使用してるマイクを取得
import soundcard as sc
# get a list of all speakers:
speakers = sc.all_speakers()
print("-----------------------\n")
print(type(speakers))
print(speakers)
# get the current default speaker on your system:
default_speaker = sc.default_speaker()
print("-----------------------\n")
print(type(default_speaker))
print(default_speaker)
# get a list of all microphones:
mics = sc.all_microphones()
print("-----------------------\n")
print(type(mics))
print(mics)
# get the current default microphone on your system:
default_mic = sc.default_microphone()
print("-----------------------\n")
print(type(default_mic))
print(default_mic)
2.2 マイク・スピーカーの指定
使用するマイク・スピーカーを指定したい場合は、名称(str型)で指定できる
get_speaker( スピーカー名 ):使用するスピーカーを取得
get_microphone( マイク名 ):使用するマイクを取得
one_speaker = sc.get_speaker('Realtek High Definition Audio')
print("-----------------------\n")
print(type(one_speaker))
print(one_speaker)
one_mic = sc.get_microphone('Realtek High Definition Audio')
print("-----------------------\n")
print(type(one_mic))
print(one_mic)
2.3 録音と再生
先ほど取得したマイク、およびスピーカーのメソッドを使う
mic.record():録音する
samplerate:サンプリング周波数(int)
numframes:録音するフレーム数(int)
speaker.play():音を出力する
(第1引数):音のデータ(numpy.array)
samplerate:再生時のサンプリング周波数(int)
import soundcard as sc
import numpy
fs = 48000
recording_sec = 5
default_speaker = sc.default_speaker()
default_mic = sc.default_microphone()
# record and play back one second of audio:
print("Recording...")
data = default_mic.record(samplerate=fs, numframes=fs*recording_sec)
print("Playing...")
default_speaker.play(data/numpy.max(data), samplerate=fs)
print("Done.")
ちなみに下記のようなwith文を使った方法もある(recorder, player)
import soundcard as sc
fs = 48000
default_speaker = sc.default_speaker()
default_mic = sc.default_microphone()
with default_mic.recorder(samplerate=fs) as mic, \
default_speaker.player(samplerate=fs) as sp:
for _ in range(100):
print("Recording...")
data = mic.record(numframes=1024)
print("Playing...\n")
sp.play(data)
3. wav書き出し&wav読み込み(with SoundFile)
録音→wav書き出しと、wav読み込み→再生 のサンプルも記載しておきます
SoundFileを使います(詳細は公式サイトへ)
3.0 導入(SoundFile)
pipで入ります
python -m pip install soundfile
3.1 マイク録音→wav書き出し
recording_sec秒毎に、連番でwavファイルを書き出すサンプル
import soundcard as sc
import soundfile as sf
fs = 48000
recording_sec = 5
default_mic = sc.default_microphone()
with default_mic.recorder(samplerate=fs) as mic:
for i in range(3):
print("Recording...")
data = mic.record(numframes=fs*recording_sec)
print("Saving...\n")
sf.write(f'./{i:02}.wav', data, fs)
3.2 wav読み込み→再生
import soundcard as sc
import soundfile as sf
fs = 48000
read_wave_path = './00.wav'
default_speaker = sc.default_speaker()
with default_speaker.player(samplerate=fs) as sp:
print(f"Reading...({read_wave_path})")
data, fs = sf.read(read_wave_path)
print("Playing...\n")
sp.play(data)
3.3 PCスピーカー出力の録音→wav書き出し
SoundCardはPCが出力する音も録音可能です
(get_microphoneの引数loopback=True に設定)
※'23/3/30現在は、record実行時に無音の場合、
録音が勝手に終了するバグがあるそうです。
import soundcard as sc
import soundfile as sf
fs = 48000
recording_sec = 5
default_mic = sc.get_microphone(id=sc.default_speaker().name, include_loopback=True)
with default_mic.recorder(samplerate=fs) as mic:
for i in range(10):
print("Recording...")
data = mic.record(numframes=fs*recording_sec)
print("Saving...\n")
sf.write(f'./pc_out_{i:02}.wav', data, fs)
参考URL
SoundCard - PyPI
https://pypi.org/project/SoundCard/SoundFile - PyPI
https://pypi.org/project/soundfile/Qiita - 【8行】Pythonでシステム音を録音する方法
https://qiita.com/3998/items/fe7bf6f0a3be20cafdd8
以上。
この記事が気に入ったらサポートをしてみませんか?