python - 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 并且无法做到。
编辑:将代码空间放在正确的位置
解决方案
这是因为您在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
在播放音频时删除。
推荐阅读
- git - git branch -r --merged 抛出错误:致命:不明确的参数'origin/HEAD -> origin/master':未知修订或路径不在工作树中
- laravel - Maatwebsite\Excel\Validators\ValidationException:给定的数据在 Laravel 中无效
- mysql - 如何使用对同一数据库表的查询结果更新 MYSQL 表中的字段?
- node.js - Mongoose `Promise.all()` 事务错误
- javascript - 如何从 JavaScript 中的两个二维数组中获取唯一值
- django - Django importError(无法导入名称“六”)
- javascript - 如何在不改变原始数组的情况下将数组传递给函数?
- android - Xamarin Android 如何正确声明 Intent Filter 以匹配自定义文件类型?
- javascript - Gulp 不是 comile sass 文件并重新加载页面
- mariadb - MySQL Workbench 无法转发工程,错误 1064