Это потому, что вы закрываете 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
во время воспроизведения звука.