ValueError: mmap закрыт или недействителен - PullRequest
1 голос
/ 08 июля 2020

Я получаю сообщение об ошибке

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, но не могу.

изменить: поместить пробелы кода в нужное место

1 Ответ

0 голосов
/ 09 июля 2020

Это потому, что вы закрываете 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(), он работает нормально. Вам нужно будет запрограммировать другой способ обработки загрузки / воспроизведения. Вам действительно нужна оптимизация скорости 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 во время воспроизведения звука.

...