Pythonでのリアルタイムマイク音声録音とWAVE保存方法[Windows音声録音]

前回から引き続いて、Windowsでのマイク音声の制御について記載します。
今回は、録音です。今回フーリエ変換しようかと思っていましたが、まずは音声を録音してそれを解析するような形の方がよいのかもと思って録音にしてみました。
今後は、フーリエ変換による周波数の取り方や音声レベルの取得なんかをしていきたいと思います。

2021/11/18追記

本記事では、とにかくファイルを保存することを焦点においています。

より実用的にリアルタイムでファイルにWabeデータを書き込む方法を以下で紹介していますので、以下も参考にしてみてください。

Pyaudio 実行結果

今回も前回に続いて、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関数で行っています。

  • audiostart Audioのインスタンスを取得
  • audiostop Audioインスタンスの解放
  • read_plot_data データの読みだし

この3関数については、前回の記事で記載していますのでそちらを確認ください。

Wave保存

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について勉強したい人は以下がおすすめです。私も持っていてたまに眺めて勉強していますものですのでぜひ購入して学習してみてください。

にいやん

出身 : 関西 居住区 : 関西 職業 : 組み込み機器エンジニア (エンジニア歴13年) 年齢 : 38歳(2022年11月現在) 最近 業務の効率化で噂もありPython言語に興味を持ち勉強しています。 そこで学んだことを記事にして皆さんとシェアさせていただければと思いブログをはじめました!! 興味ある記事があれば皆さん見ていってください!!