前回から引き続いて、Windowsでのマイク音声の制御について記載します。
今回は、録音です。今回フーリエ変換しようかと思っていましたが、まずは音声を録音してそれを解析するような形の方がよいのかもと思って録音にしてみました。
今後は、フーリエ変換による周波数の取り方や音声レベルの取得なんかをしていきたいと思います。
2021/11/18追記
本記事では、とにかくファイルを保存することを焦点においています。
より実用的にリアルタイムでファイルにWabeデータを書き込む方法を以下で紹介していますので、以下も参考にしてみてください。
今回も前回に続いて、Pyaudioを使って音声の取得をします。
pyaudioってどうやって使うのって方は、↓を見てみてください。
じゃあ保存方法の説明の前にコードを全部を張り付けておきます。
import sys
import pyaudio
import wave
def audiostart():
audio = pyaudio.PyAudio()
stream = audio.open( format = pyaudio.paInt16,
rate = 44100,
channels = 1,
input_device_index = 1,
input = True,
frames_per_buffer = 1024)
return audio, stream
def audiostop(audio, stream):
stream.stop_stream()
stream.close()
audio.terminate()
def read_plot_data(stream):
data = stream.read(1024)
return data
def rec_exec(file_path):
# 録音データをファイルに保存
wave_f = wave.open(file_path, 'wb')
wave_f.setnchannels(1)
wave_f.setsampwidth(2)
wave_f.setframerate(44100 )
wave_f.writeframes(b''.join(rec_data))
wave_f.close()
if __name__ == '__main__':
args = sys.argv
if len(args) != 1:
# Audio インスタンス取得
(audio,stream) = audiostart()
rec_data = []
print("Start")
# 音声を読み出し
while True:
try:
data = read_plot_data(stream)
rec_data.append(data)
except KeyboardInterrupt:
print("stop")
break
# Audio デバイスの解放
audiostop(audio,stream)
#保存実行
rec_exec( args[1] )
では実行してみましょう。
今回は引数で、ファイル名を与えるようにしていますので、実行するファイルの後ろにファイルパスを指定します。
実行結果は以下です。
ためしに、WindowsMediaPlayerで再生してみるとしっかり再生できました。
続いてはプログラムの解説ですが、解説は次ページにて記載します。
では解説していきます。
まず、マイク音声の入力については、以下の3関数で行っています。
この3関数については、前回の記事で記載していますのでそちらを確認ください。
Wave音声の保存については以下の通りです。
まず、使用するライブラリは「wave」です。そのままですね。
使用するために以下の通り記載してインポートしてください。
import wave
そして保存処理は以下です。
この関数 引数として保存先のファイルパスを渡すようにしています。
def rec_exec(file_path): # 録音データをファイルに保存 wave_f = wave.open(file_path, 'wb') <- ファイルをオープン wave_f.setnchannels(1) <- チャネルを指定 wave_f.setsampwidth(2) <- サンプル幅を指定(16bitなので2Byteです) wave_f.setframerate(44100 ) <- フレームレートを指定 wave_f.writeframes(b''.join(rec_data)) <- データの書き込み wave_f.close() <- ファイルのクローズ
20211121追記
上記の、フレームレートやサンプル幅っていうのが分からないって方は、↓でデジタルオーディオについて纏めてみましたので参考にしてください。
保存しているrec_dataについては、以下の処理でデータの作成をしています。
rec_data = [] <- 空のリストを生成 print("Start") # 音声を読み出し while True: try: data = read_plot_data(stream) rec_data.append(data) <- 読み出ししたデータをしていく except KeyboardInterrupt: print("stop") break
これでマイクの音声をファイルに保存することができました。
これで、音声を色々とチェックしたり、加工するための準備ができました。
次回は、いよいよフーリエ変換を用いて、周波数測定をしてみようと思います。
Pythonについて勉強したい人は以下がおすすめです。私も持っていてたまに眺めて勉強していますものですのでぜひ購入して学習してみてください。