2018/02/13
2020/04/14
Python3で録音してwavファイルに書き出すプログラム
当記事では、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 がマイクとなっているのがわかります。
(totalcount 21,530 回, dailycount 12回 , overallcount 16,849,021 回)








Recommended