【TTS】如何使用pyinstaller将一个写好的python项目打包成exe可执行文件
目录
前言
这篇文章的是上一篇【TTS】文本转语音?如何不调用第三方api来实现,使用pyttsx3,的后续扩展部署。
在使用pyttsx3实现了文本转语音之后,接下来就是部署了,不过可惜的是服务器是centos的,会导致项目里面的pyttsx3无法使用。
所以只能退而求之,使用window系统算了。本次就是记录一下如何把源码打成不需要python环境依赖的exe文件(当然liunx也行的,大家可以查一查,只不过本次因为项目原因只能使用window了)
开始发车 ,呸!,发代码咯
一、项目代码
因为接口非常非常少,所以也就没细分模块了,一个py文件就可以解决了
app.py
from flask import Flask
import win32api,win32con
from threading import Timer
import pyttsx3
import time
import os
from flask import Flask, send_file,request
app = Flask(__name__)
"""
启动时提示
"""
win32api.MessageBox(0, "成功启动语音合成服务", "成功提示", win32con.MB_OK)
"""
定时删除static文件下的数据
"""
# 删除函数
def delDir(inc):
if os.path.exists('.\static') is True:
deal_list = os.listdir(".\static")
# 清空static下面的文件
for list in deal_list :
if os.path.isfile(f'.\static\{list}') is True:
os.remove(f'.\static\{list}')
t = Timer(inc, delDir, (inc,))
t.start()
# 10s
delDir(10)
"""
调用接口
"""
@app.route('/voice')
def Text_To_Speek():
# 判断该目录下是否存在有static文件
if os.path.exists('.\static') is False:
os.mkdir('.\static')
print(".\static创建成功")
str = request.args['str'];
t = time.time()
engine = pyttsx3.init()
# 设置新的语音速率
engine.setProperty('rate', 200)
# 设置新的语音音量,音量最小为 0,最大为 1
engine.setProperty('volume', 1.0)
# 获取当前语音声音的详细信息
voices = engine.getProperty('voices')
print(f'语音声音详细信息:{voices}')
# # 设置当前语音声音为女性,当前声音不能读中文
# engine.setProperty('voice', voices[1].id)
# 设置当前语音声音为男性,当前声音可以读中文
engine.setProperty('voice', voices[0].id)
# 语音播报内容
content = str
# 输出文件格式
outFile = f'.\static\{t}.mp3'
engine.save_to_file(content, outFile)
engine.runAndWait()
engine.stop()
return send_file(f".\static\{t}.mp3");
@app.route('/')
def hello_world():
return "hello world";
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
二、项目打包
(1)打包前提-创建hook-pytts3.py
这个是处理pytts3打包时会出现的错误的:
ModuleNotFoundError: No module named ‘pyttsx3.drivers’
1、创建hooks
2、hook-pytts3.py的内容
#-----------------------------------------------------------------------------
# Copyright (c) 2013-2017, PyInstaller Development Team.
#
# Distributed under the terms of the GNU General Public License with exception
# for distributing bootloader.
#
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------
"""
pyttsx3 imports drivers module based on specific platform.
Fount at https://github.com/nateshmbhat/pyttsx3/issues/6
"""
hiddenimports = [
'pyttsx3.drivers',
'pyttsx3.drivers.dummy',
'pyttsx3.drivers.espeak',
'pyttsx3.drivers.nsss',
'pyttsx3.drivers.sapi5',
]
(2)打包命令
在根目录下使用命令:
pyinstaller -F -w app.py --additional-hooks-dir hooks
在–additional-hooks-dir 后面是我们刚刚创建好的hooks文件夹。
若是出现其他问题请参考:
http://www.lolpzili.com/index.php/archives/20/#comment-2
(3)项目打包-发现exe文件所在
(4)项目打包-创建unapp.bat关闭脚本
查看进程:
tasklist |findstr app
创建一个txt文件,然后填写命令,最后改成bat后缀即可
unapp.bat
taskkill -f -im app.exe -t
@mshta vbscript:msgbox("语言合成服务关闭成功",64,"关闭提示")(window.close)
三、项目演示
双击exe文件,然后输入:
localhost:5000/voice?str=内容
后言
如果对服务器没什么极大要求的话,这个方法就足以满足语音合成的需要了
至于为什么要搞这个呢,还不是搞个线下的api,如果可以的话,大可使用那些大厂的在线api,简单方便粗暴。
嘿嘿
参考资料:
PyInstaller使用教程
Python 实现定时任务
python中对文件、文件夹,目录的基本操作
Pyinstaller IntFlag、vcruntime140.dll及pyttsx3错误的解决办法
上一篇: re 正则表达式
下一篇: 安装kali遇到问题及解决