こんばんは。
ちょっと前の記事↓で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の保存の方法がわからんないよって方は上のページから見てみてください。
今回、ファイルをリアルタイムで書き出しするために、挑戦したのではマルチスレッドです。
マルチスレッドについてと、プログラム解説は自ページに記載します。
コメント