Python3で録音してwavファイルに書き出すプログラム

 2018/02/13    Python    

当記事では、Python3を使って録音し、その音声をwavファイルとして書き出し、保存するプログラムをご紹介いたします。

録音のサンプルプログラム

以下のプログラムで録音とファイルへの出力が可能です。

import pyaudio  #録音機能を使うためのライブラリ
import wave     #wavファイルを扱うためのライブラリ

RECORD_SECONDS = 10 #録音する時間の長さ(秒)
WAVE_OUTPUT_FILENAME = "sample.wav" #音声を保存するファイル名
iDeviceIndex = 0 #録音デバイスのインデックス番号

#基本情報の設定
FORMAT = pyaudio.paInt16 #音声のフォーマット
CHANNELS = 1             #モノラル
RATE = 44100             #サンプルレート
CHUNK = 2**11            #データ点数
audio = pyaudio.PyAudio() #pyaudio.PyAudio()

stream = audio.open(format=FORMAT, channels=CHANNELS,
        rate=RATE, input=True,
        input_device_index = iDeviceIndex, #録音デバイスのインデックス番号
        frames_per_buffer=CHUNK)

#--------------録音開始---------------

print ("recording...")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)


print ("finished recording")

#--------------録音終了---------------

stream.stop_stream()
stream.close()
audio.terminate()

waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
waveFile.setnchannels(CHANNELS)
waveFile.setsampwidth(audio.get_sample_size(FORMAT))
waveFile.setframerate(RATE)
waveFile.writeframes(b''.join(frames))
waveFile.close()

出力ファイル名や、録音する長さ、録音デバイスのインデックス番号を調整して実行すれば、録音されます。

録音デバイスのインデックス番号の確認方法

先ほどのプログラムの

iDeviceIndex = 0 #録音デバイスのインデックス番号

の部分で誤ったインデックス番号を入力してしまうと次のようなエラーが出るかもしれません。

OSError: [Errno -9998] Invalid number of channels

これは、マイクではないデバイスを指定して録音をしようとしているために起こります。そのため、今回はここで0と指定している部分を1や2に変えたりすることでエラーが解消されるはずです。

また、以下のようなプログラムでマイクの番号を直接確認することもできます。

import pyaudio  #録音機能を使うためのライブラリ

#オーディオデバイスの情報を取得、マイクのインデックス番号を入手する。
iAudio = pyaudio.PyAudio()
for x in range(0, iAudio.get_device_count()): 
    print(iAudio.get_device_info_by_index(x))

これを実行するとコンソール画面では、

{'index': 0, 'structVersion': 2, 'name': 'Built-in Microphone', 'hostApi': 0, 'maxInputChannels': 2, 'maxOutputChannels': 0, 'defaultLowInputLatency': 0.0029478458049886623, 'defaultLowOutputLatency': 0.01, 'defaultHighInputLatency': 0.04793650793650794, 'defaultHighOutputLatency': 0.1, 'defaultSampleRate': 44100.0}
{'index': 1, 'structVersion': 2, 'name': 'Built-in Output', 'hostApi': 0, 'maxInputChannels': 0, 'maxOutputChannels': 2, 'defaultLowInputLatency': 0.01, 'defaultLowOutputLatency': 0.010408163265306122, 'defaultHighInputLatency': 0.1, 'defaultHighOutputLatency': 0.02056689342403628, 'defaultSampleRate': 44100.0}
{'index': 2, 'structVersion': 2, 'name': 'DisplayPort', 'hostApi': 0, 'maxInputChannels': 0, 'maxOutputChannels': 2, 'defaultLowInputLatency': 0.01, 'defaultLowOutputLatency': 0.0024375, 'defaultHighInputLatency': 0.1, 'defaultHighOutputLatency': 0.011770833333333333, 'defaultSampleRate': 48000.0}

などと表示され、それぞれのデバイスのインデックス番号を確認できます。こちらの例だと、'index': 0 がマイクとなっているのがわかります。

  • スポンサーリンク

  • 関連コンテンツ

  • コメントを残す

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

    CAPTCHA