ValueError: mmap closed or invalid

ValueError: mmap closed or invalid

我收到错误

ValueError: mmap closed or invalid

每当我尝试播放音频时。似乎是错误的代码是

def speak(audioString):
    print(audioString)
    tts = gTTS(text=audioString, lang='en')
    tts.save("audio.mp3")
    with open("audio.mp3") as f: 
        m = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) 

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

m.close()

我想要帮助,因为我正在尝试执行 textToSpeach 但无法执行。

编辑:将代码空间放在正确的位置

这是因为您在播放声音时关闭了 mmap m

def speak(audioString):
    print(audioString)
    tts = gTTS(text=audioString, lang='en')
    tts.save("audio.mp3")
    with open("audio.mp3") as f: 
        m = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) 

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

        # wait for audio to finish playing
        while ( pygame.mixer.music.get_busy() ):
            pygame.event.pump()                    # <-- a bit dodgey

        m.close()

一个快速测试是注释掉 m.close() 使其工作正常。您将需要编写一些其他方式来处理 loading/playing。你真的需要 mmap 的速度优化吗?

另一种方法可能是使用 io 模块 StringIO 并且从不将音频流写回磁盘:

理论上是这样的:

import io

...

memfile = io.StringIO()
tts.write_to_fp( memfile )
pygame.mixer.music.load( memfile )   # <<-- NOTE: untested
pygame.mixer.music.play()
# wait for audio to finish playing
while ( pygame.mixer.music.get_busy() ):
    do_something_useful_and_handle_events()
memfile = None

但您仍然可能无法在播放音频时删除 memfile