Python gTTS无法保存文件两次

Python gTTS无法保存文件两次,python,python-3.x,pygame,text-to-speech,Python,Python 3.x,Pygame,Text To Speech,我试图使用GTT作为一个个人助理项目的真实文本到语音模块。当查询谷歌服务时,我能够保存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') m

我试图使用GTT作为一个个人助理项目的真实文本到语音模块。当查询谷歌服务时,我能够保存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()
在成功输出后运行函数“speak”时,再次运行时会出现错误

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'
回溯(最近一次呼叫最后一次):
文件“C:\Users\user1\Desktop\project\u ai\assistant.py”,第7行,在
text-to-speech.main('hello')
文件“C:\Users\user1\Desktop\project\u ai\modules\speech\u text\u synthesis\text\u to\u speech.py”,主文件第8行
保存('speech.mp3')文件“C:\Users\user1\AppData\Local\Programs\Python36\lib\site packages\gtts\tts.py”,保存中第246行
将open(savefile,'wb')作为f:PermissionError:[Errno 13]权限被拒绝:“speech.mp3”

再次尝试将文本保存到另一个mp3时,会发生此错误。因此pygame无法玩它。我知道我可以简单地更改文件名来保存它,但我不想这样做。我如何才能做到这一点?

这似乎是pygame的一个常见问题,至少我发现了一些关于这个主题的删除问题

保存后,尝试通过内存映射文件加载文件,而不是仅使用文件名,如下所示:

import mmap
...
def speak(data):
    tts = gTTS(text=data, lang='en')
    tts.save('speech.mp3')
    with open('speech.mp3') as f: 
        m = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) 

    pygame.mixer.music.load(m) 
    pygame.mixer.music.play() 

    m.close() 
使用上下文管理器可确保文件在复制到内存后实际上已关闭,
pygame.mixer.music.load
将根本不会触及该文件。

最后。。。成功

我已经研究这个问题好几个小时了。除了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文件名时遇到的问题是,我们很难找到释放文件资源的方法。当您切换到其他文件名时,此方法将释放它


享受互联网!去做一些很酷的节目吧

我想是因为门还锁着。在
tts.save
之前,您是否尝试调用
pygame.mixer.music.stop()
?是的,但是程序仍然返回权限错误