在python中重新打开声音文件时出错

时间:2016-06-23 17:26:34

标签: python pygame mp3

我正在制作一个简单重复您输入的任何文本的程序,并且在我第一次测试它时似乎正在工作。问题是,我第二次尝试键入任何内容时,它会崩溃,并说我正在录制的声音文件被拒绝。我相信这是因为文件已经打开,但我不知道如何解决它。我正在使用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)

3 个答案:

答案 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

我进行了一次测试,我输入了一个很长的句子,然后是另一个句子,而第一个句子正在播放,一切仍然有效。