我正在制作一个简单重复您输入的任何文本的程序,并且在我第一次测试它时似乎正在工作。问题是,我第二次尝试键入任何内容时,它会崩溃,并说我正在录制的声音文件被拒绝。我相信这是因为文件已经打开,但我不知道如何解决它。我正在使用gTTS和Pygame模块。
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 :(得分:2)
想出来。我添加了这个功能:
def delete():
sleep(2)
mixer.music.load("Holder.mp3")
os.remove("Speech.mp3")
并在.play()
之后调用它,所以它现在只需在文件完成时删除该文件,然后在您需要使用它时重新创建它。
答案 1 :(得分: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()
但是第二次修复可能会导致听不到任何回放的结果。
答案 2 :(得分: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
我进行了一次测试,我输入了一个很长的句子,然后是另一个句子,而第一个句子正在播放,一切仍然有效。