pyaudio マイク音声 リアルタイムデータ保存 [ マルチスレッドの使用方法]

この記事は約4分で読めます。

こんばんは。
ちょっと前の記事↓でPythonでマイク録音の入力音声をパソコンに保存する方法を記載しました。

前回のものはメモリに書き込み用のデータを積み上げていって最後に書き出すようなことをしていました。
ですが、このやり方には欠陥があります。
実は、これではアプリを終了(データを保存する直前)するまでパソコン内のメモリを一定周期で消費していき、パソコンの動作を重くし かつ いつかはパソコンがメモリ不足で落ちてしまいます。

で、これではまずいと思い、今回は一定のメモリ消費で入力音声データをリアルタイムにファイルに書き込んでいくプログラムを作成してみましたので、共有したいと思います。

サンプルコード

ではまずは、いつも通りコード全体を記載します。

import sys
import pyaudio
import wave 
import time
import threading
from logging import NullHandler

wave_f = NullHandler
streamstop = False

def readaudio(filepath):
    global wave_f
    global streamstop
    # Audio インスタンス取得
    audio = pyaudio.PyAudio() 
    stream = audio.open( format = pyaudio.paInt16,
                        rate = 44100,
                        channels = 1, 
                        input_device_index = 1,
                        input = True, 
                        frames_per_buffer = 4096,
                    )
    wave_f = wave.open(filepath, 'wb')
    wave_f.setnchannels(1)
    wave_f.setsampwidth(2)
    wave_f.setframerate(44100 )
    
    print("Start")
    while True:
        if streamstop == False:
            data = stream.read(4096)
            rec_exec(data)
        else:
            break
          
    # 音声を読み出し    
    wave_f.close()
    # Audio デバイスの解放
    stream.stop_stream()
    stream.close()
    audio.terminate()

def main_func(filepath):
    global streamstop
    thread1 = threading.Thread(target=readaudio, args=(filepath,))
    thread1.start()
    
    while True:
        try:
            time.sleep(1)
        except KeyboardInterrupt:
            print("stop")
            streamstop = True
            break
        
    thread1.join()
        
def rec_exec(data):
    global wave_f
    #print(data)
    wave_f.writeframes( (data) )


if __name__ == '__main__':
    args = sys.argv
    if len(args) != 1:
        filepath = args[1]
        main_func( filepath )
    else:
        print("please input rec file")

基本的な、音声の入力とWaveファイルの保存方法は、前回のものとほとんど変わらないので、割愛します。
そもそも、Audioの保存の方法がわからんないよって方は上のページから見てみてください。

今回、ファイルをリアルタイムで書き出しするために、挑戦したのではマルチスレッドです。

マルチスレッドについてと、プログラム解説は自ページに記載します。

コメント

タイトルとURLをコピーしました