Pythonでwavファイルを再生しようとする場合、pyaduioを使って以下のようなコードで再生すると思います。
#file name is open.py import wave import pyaudio #開きたいWavファイルを引数 def openWave(name): #開きたいファイルをここに wf = wave.open(name, "r") # ストリームを開く p = pyaudio.PyAudio() stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True) # チャンク単位でストリームに出力し音声を再生 chunk = 1024 data = wf.readframes(chunk) while data != b'': stream.write(data) data = wf.readframes(chunk) stream.close() p.terminate()
しかし音声が終了するまでwhile data != b'':文が閉じてくれないので、停止再生が任意に行えません。そこで、以下のようなサブプロセス実行用のファイルsub.pyを作り、main.pyからサブプロセスで実行する方法を考えました。
#file name is sub.py #サブプロセスで実行されるファイル #CMD上で python sub.py name というコマンドでname.wavファイルが再生される import sys import wave import pyaudio args = sys.argv wf = wave.open(str(args[1])+".wav", "r") p = pyaudio.PyAudio() stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True) # チャンク単位でストリームに出力し音声を再生 chunk = 1024 data = wf.readframes(chunk) while data != b'': stream.write(data) data = wf.readframes(chunk) stream.close() p.terminate()
上記のsub.pyを下記のmain.pyからサブプロセスで動かします。
#file name is main.py from msvcrt import getch#キーボード入力用 import subprocess def main(name): while True: key = ord(getch())#キーボード入力を受け付けます if key == 72: #上矢印ならnameファイルを再生 cmd = "python sub.py "+str(name) pro = subprocess.Popen(cmd)#Popenならサブプロセス中も、次のメインプロセスが実行される elif key == 13:#エンターなら終了 pro.terminate() break
サブプロセスで再生を実行することで、main側から任意に再生停止をするコードを書くことができました。 本日は以上です、お疲れ様でした。