python - gTTS 无法保存文件两次

标签 python python-3.x pygame text-to-speech

我正在尝试使用 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/

相关文章:

python - 在 Django REST Framework 中覆盖 serializer.data

python - 使用 StringVar 的跟踪条目对标签没有影响

python - Pygame alpha 仅在多边形中

python - pygame 中的记分板没有将玩家按顺序排列,甚至没有显示他们

python - 函数不打印所有偶数?

python - 对整个句子应用 NLP WordNetLemmatizer 显示错误且位置未知

python - 如何避免 Matplotlib 圆环图上重叠的楔形下降标签?

python-3.x - 在 Python (3.x) 中以 UTC 时间获取今天凌晨 12 点的简单方法?

python - Pandas :计算时间范围内的平均值

python - Pygame.错误: file is not a WINDOWS BMP file (mac osx)