2016-06-23 12 views
2

入力したテキストを単純に繰り返すプログラムを作成中で、最初にテストしたときに動作していたようです。問題は、もう一度タイプしようとするとクラッシュし、録音していたサウンドファイルに許可が拒否されたということです。私はファイルがすでに開かれているからだと信じていますが、それを修正する方法がわからないほどです。私はgTTSとPygameモジュールを使用しています。pythonでサウンドファイルを再オープンしているときにエラーが発生しました

from gtts import gTTS 
from tempfile import TemporaryFile 
from pygame import mixer 

#Plays Sound 
def play(): 
    mixer.init() 
    mixer.music.load("Speech.mp3") 
    mixer.music.play() 
#Voice 
def voice(x): 
    text = gTTS(text= x, lang= 'en') 
    with open("Speech.mp3", 'wb') as f: 
     text.write_to_fp(f) 
     f.close() 
    play() 

#Prompts user to enter text for speech 
while True: 
    voice_input = input("What should Wellington Say: ") 
    voice(voice_input) 
+0

コンテキストマネージャが開いているので、手動で 'f'を閉じる必要はありません。コンテキストマネージャを終了すると、ファイルは自動的に閉じられます。 – nbryans

+0

ありがとう、それを知らなかったが、それは同じ時点でまだクラッシュしている。 –

+0

クラッシュする行を教えてくれますか?保護されたディレクトリで実行していますか? – nbryans

答えて

0

this threadからの助けを借りて)上記の私のコメントに展開するには、私はplay()は、ファイルをロックすることができると思います。

def play(): 
    mixer.init() 
    mixer.music.load("Speech.mp3") 
    mixer.music.play() 
    while pygame.mixer.music.get_busy(): 
     pygame.time.Clock().tick(10) 

または

def play(): 
    mixer.init() 
    mixer.music.load("Speech.mp3") 
    mixer.music.play() 
    mixer.music.stop() 

しかし、この第二の修正が再生され、何も聞いていないの結果を持っているかもしれません:あなたは、手動で次のことを試すことができます。

+0

2番目の方法ではサウンドが再生されずクラッシュし、最初の方法でクラッシュするとクラッシュするだけです。 –

1

説明しました。私はこの機能を追加しました:

def delete(): 
    sleep(2) 
    mixer.music.load("Holder.mp3") 
    os.remove("Speech.mp3") 

そして、それが終わった後、あなたは次のそれを使用する必要があるときにそれを再作成されたとき、それは今、単にファイルを削除しますので、.play()後にそれを呼び出します。

0

私は、一時ファイルへの書き込みやos.renameを使用して問題を修正:

from gtts import gTTS 
from pygame import mixer 
import os 

play_name = 'Speech.mp3' 
save_name = "%s.%s" % (play_name, '.tmp') 

def play(): 
    mixer.music.load(play_name) 
    mixer.music.play() 

def voice(x): 
    text = gTTS(text=x, lang='en') 
    with open(save_name, 'wb') as tmp_file: 
     text.write_to_fp(tmp_file) 
    os.rename(save_name, play_name) 

try: 
    mixer.init() 
    while True: 
     voice_input = raw_input("What should Wellington Say: ") 
     voice(voice_input) 
     play() 
except KeyboardInterrupt: 
    pass 

を最初のものはまだ遊んで、すべてしている間、私は、私は非常に長い文で入力されたテストを実行し、別の文働いた。

関連する問題