見出し画像

【Python】録音と再生(SoundCard, SoundFile)

はじめに

  • pythonでマイクとスピーカーを扱いたいなー

  • (PyAudioより)軽そうなライブラリを見つけた!

  • ついでにwav書き出しと読み込んで再生までメモしとこ~、って感じです

0. PCスペック

いつもの
pythonとライブラリのバージョン

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.")
record、およびplay実行時には、その行で処理が一時停止する

ちなみに下記のような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)
一定秒毎に連番でwavファイルとして書き出しされる

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)
ちなみにfsの値を2倍にしたり半分にしたりすると、
ボイチェンみたいな声になって面白いです

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

以上。


この記事が気に入ったらサポートをしてみませんか?