使用pyttsx3循环生成带mp3后缀文件名 保存后无扩展名问题求助
问题原因
你可以按以下顺序排查问题来源:
- 系统显示问题
Windows系统默认开启「隐藏已知文件类型的扩展名」设置,你看到的文件缺少.mp3后缀只是系统没有显示,实际文件本身已经携带了后缀,只是被隐藏了。 - 文件名包含非法字符
你的业务代码中生成的文件名包含半角冒号:,这是Windows系统禁止出现在文件名中的特殊字符,系统遇到这类字符时会自动截断冒号之后的内容,自然就丢失了后面的.mp3后缀。 - pyttsx3引擎复用bug
pyttsx3全局复用同一个引擎实例多次调用save_to_file方法时,会出现文件名解析异常,底层的语音驱动会自动忽略或截断传入的文件名后缀。 - 底层引擎兼容性问题
pyttsx3本身只是语音引擎的上层封装,Windows下默认调用SAPI5、macOS下调用NSSpeechSynthesizer、Linux下调用eSpeak,部分版本的底层驱动不支持直接指定mp3后缀,会自动覆盖你传入的文件名规则。
解决方法
- 排查系统显示问题:打开文件资源管理器顶部的「查看」选项卡,勾选「文件扩展名」,确认文件是否真的缺少后缀,如果是系统隐藏的话无需修改代码。
- 替换非法文件名:把业务代码文件名中的半角冒号替换为合法字符,比如全角冒号
:、横杠-等,示例修改:
# 把原来的冒号替换为横杠 name = "Step " + str(first[j]) + "- " + words[5] + ".mp3"
- 每次循环重新初始化引擎:不要全局复用同一个pyttsx3实例,每次生成音频前重新初始化,用完后销毁实例,修改后的简化复现代码如下:
import pyttsx3 names = ["this", "is", "a", "list", "of", "file", "names"] for index in range(0, len(names)): textSpeech = pyttsx3.init() fileName = names[index] + ".mp3" textSpeech.save_to_file(names[index], fileName) textSpeech.runAndWait() del textSpeech
- 后缀补全方案:如果上述方法都无效,可以先保存为临时无后缀文件,之后通过os模块重命名补全后缀,示例代码:
import pyttsx3 import os names = ["this", "is", "a", "list", "of", "file", "names"] for name in names: textSpeech = pyttsx3.init() # 先保存为临时文件名 textSpeech.save_to_file(name, name) textSpeech.runAndWait() del textSpeech # 重命名补全mp3后缀 os.rename(name, f"{name}.mp3")
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

