PyQt5编译生成的exe无法找到语音引擎问题求助
PyQt5文本转语音打包exe后下拉框无引擎问题解决
这不是版权问题,核心原因是打包工具(如PyInstaller)默认不会自动收集QTextToSpeech依赖的语音引擎插件,导致exe运行时无法找到可用引擎。以下是具体解决步骤:
1. 定位PyQt5语音引擎插件路径
在你的Python环境中,找到texttospeech插件目录,路径一般为:你的Python安装目录\Lib\site-packages\PyQt5\Qt5\plugins\texttospeech
该目录下包含对应平台的引擎文件(Windows下是qtexttospeech_sapi.dll)。
2. 打包时手动包含插件
以PyInstaller为例,有两种方式添加插件:
命令行方式:
执行打包命令时添加--add-data参数:pyinstaller --add-data "C:\PythonXX\Lib\site-packages\PyQt5\Qt5\plugins\texttospeech;texttospeech" your_script.py(注意:Windows用分号分隔路径,Linux/macOS用冒号)
.spec文件方式:
先生成.spec文件:pyinstaller your_script.py打开生成的
.spec文件,在datas列表中添加插件路径:datas=[ ('C:/PythonXX/Lib/site-packages/PyQt5/Qt5/plugins/texttospeech', 'texttospeech') ]再用.spec文件打包:
pyinstaller your_script.spec
3. 验证打包结果
打包完成后,检查dist目录下exe的同级文件夹,确认存在texttospeech目录,且里面有对应的引擎文件。
代码优化建议(可选)
原代码中无引擎时的逻辑有误,建议修改为:
else: self.pushButton.setEnabled(False) self.comboBox.addItem("无可用语音引擎")
原问题代码(整理后)
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtTextToSpeech import QTextToSpeech class Ui_MainWindow(object): def setupUi(self, MainWindow): self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setObjectName("pushButton") self.lineEdit = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit.setObjectName("lineEdit") self.comboBox = QtWidgets.QComboBox(self.centralwidget) self.comboBox.setObjectName("comboBox") self.horizontalSlider = QtWidgets.QSlider(self.centralwidget) self.horizontalSlider.setObjectName("horizontalSlider") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setObjectName("label") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setObjectName("label_2") self.label_3 = QtWidgets.QLabel(self.centralwidget) self.label_3.setObjectName("label_3") self.pushButton.clicked.connect(self.say) MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.engine = None engineNames = QTextToSpeech.availableEngines() if len(engineNames) > 0: engineName = engineNames[0] self.engine = QTextToSpeech(engineName) self.engine.stateChanged.connect(self.stateChanged) self.voices = [] for voice in self.engine.availableVoices(): self.voices.append(voice) self.comboBox.addItem(voice.name()) else: self.pushButton.setEnabled(True) def say(self): self.pushButton.setEnabled(True) self.engine.setVoice(self.voices[self.comboBox.currentIndex()]) self.engine.setVolume(float(self.horizontalSlider.value() / 100)) self.engine.say(self.lineEdit.text()) def stateChanged(self, state): if(state == QTextToSpeech.State.Ready): self.pushButton.setEnabled(True) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label.setText(_translate("MainWindow", "Read")) self.label_2.setText(_translate("MainWindow", "Select An Available Voice")) self.label_3.setText(_translate("MainWindow", "Volume")) self.pushButton.setText(_translate("MainWindow", "Read Aloud!"))
内容的提问来源于stack exchange,提问作者Pyx Sara
相关产品推荐
相关产品推荐

