とある大学生の勉強メモ

Python, C#, UWP, WPF, 心理実験関連の開発備忘録

Pythonで音声ファイルを任意に再生・停止させる

 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側から任意に再生停止をするコードを書くことができました。 本日は以上です、お疲れ様でした。