首页 > 解决方案 > ValueError:mmap 关闭或无效

问题描述

我得到错误

ValueError:mmap 关闭或无效

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

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 并且无法做到。

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

标签: pythonpython-3.xpygametext-to-speechgtts

解决方案


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

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()它可以正常工作。您将需要编写一些其他方式来处理加载/播放。你真的需要速度优化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在播放音频时删除。


推荐阅读