我正在尝试使用 gTTS 作为个人助理项目的真实文本到语音模块。当查询谷歌服务时,我可以保存 mp3 文件并使用 pygame 运行它。
from pygame import mixer
from gtts import gTTS
def speak(data):
tts = gTTS(text=data, lang='en')
tts.save('speech.mp3')
mixer.init()
mixer.music.load('speech.mp3')
mixer.music.play()
运行该函数后,一旦成功输出,就会“说话”,但是当再次运行它时,它会失败并出现错误。
Traceback (most recent call last):
File "C:\Users\user1\Desktop\project_ai\assistant.py", line 7, in <module>
text_to_speech.main('hello')
File "C:\Users\user1\Desktop\project_ai\modules\speech_text_synthesis\text_to_speech.py", line 8, in main
tts.save('speech.mp3') File "C:\Users\user1\AppData\Local\Programs\Python\Python36\lib\site-packages\gtts\tts.py", line 246, in save
with open(savefile, 'wb') as f: PermissionError: [Errno 13] Permission denied: 'speech.mp3'
尝试再次将文本保存到另一个 mp3 时发生错误。因此 pygame 无法玩它。我知道我可以简单地更改文件名来保存它,但我不想这样做。我怎样才能做到这一点?
最佳答案
终于...成功了...
我已经研究这个问题几个小时了。除了 PyGame 之外,我还尝试了多种不同的声音播放器(pyaudio、playsound、pyglet,...)。我走上了其他人都走过的路。
然后...它击中了我...一条不同的路...使用两个文件名。(一种称为双缓冲的技术)。
虽然我没有使用这个特定的代码,但我想我应该使用您的代码给出答案......
from pygame import mixer
from gtts import gTTS
count = 0
def speak(data):
global count
tts = gTTS(text=data, lang='en')
tts.save(f'speech{count%2}.mp3')
mixer.init()
mixer.music.load(f'speech{count%2}.mp3')
mixer.music.play()
count += 1
它起作用的原因是 TTS 库在切换到新文件时会释放前一个文件。当尝试使用 1 个文件名时,我们面临的问题是我们很难找到一种方法来释放文件资源。当您切换到其他文件名时,此方法会释放它。
享受互联网的乐趣!去制作一些很酷的程序吧!
关于python - gTTS 无法保存文件两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51741201/