基于Python怎么编写一个语音合成系统
发表于:2025-11-15 作者:千家信息网编辑
千家信息网最后更新 2025年11月15日,这篇文章主要介绍了基于Python怎么编写一个语音合成系统的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于Python怎么编写一个语音合成系统文章都会有所收获,下面我们
千家信息网最后更新 2025年11月15日基于Python怎么编写一个语音合成系统
这篇文章主要介绍了基于Python怎么编写一个语音合成系统的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于Python怎么编写一个语音合成系统文章都会有所收获,下面我们一起来看看吧。
背景
一直对语音合成系统比较感兴趣,总想能给自己合成一点内容,比如说合成小说,把我下载的电子书播报给我听等等。
语音合成系统
其实就是一个基于语音合成的工具,但是这个东西由于很多厂家都提供了API的形式,因此开发难度大大降低,只需要调用几个API即可实现属于自己的语音合成工具;麻雀虽小,五脏俱全。往大了说,这就是一个小型的语音合成系统。
准备工作
首先我们电脑上需要安装
Anaconda
Python 3.7
visual studio code
步骤
这里我们选用讯飞开放平台的WebAPI接口。
首先我们到控制台创建一个应用
创建好了之后,点击该应用进入,有该应用的详细栏目。
点击左侧的语音合成,再到下一级在线语音合成(流式版)
在右上侧,我们需要拿到3个东西:
APPID
APISecret
APIKey
代码实现
好了接下来进行代码实现了,首先安装我们需要的两个库。
pip install websocket-clientpip install playsound
接下来我们定义一个类play,包含4个函数
class play: def __init__(self): #初始化函数 def play_sound(self):#播放音频函数 def select_vcn(self,*arg):#选择下拉框设置发音人 def xfyun_tts(self):#进行语音合成
在这里,大家需要填上刚才从讯飞开放平台控制台获取到的appid、appkey以及appsecret
def __init__(self): self.APP_ID = 'xxx' #请填上自己的appid self.API_KEY = 'xxx' #请填上自己的appkey self.SECRET_KEY = 'xxx' #请填上自己的appsecret self.root=tk.Tk() #初始化窗口 self.root.title("语音合成系统") #窗口名称 self.root.geometry("600x550") #设置窗口大小 self.root.resizable(0,0) #self.root.resizable(width=True,height=True)#设置窗口是否可变,宽不可变,高可变,默认为True self.lb=tk.Label(self.root,text='请选择语音发音人')#标签 self.tt=tk.Text(self.root,width=77,height=30) #多行文本框 self.cb=ttk.Combobox(self.root, width=12) #下拉列表框 #设置下拉列表框的内容 self.cb['values']=("甜美女声-小燕","亲切男声-许久","知性女声-小萍", "可爱童声-许小宝","亲切女声-小婧") self.cb.current(0) #将当前选择状态置为0,也就是第一项 self.cb.bind("<>", self.select_vcn) self.tk_tts_file=tk.Label(self.root,text='生成文件名') self.b1=tk.Button(self.root, text='进行语音合成', width=10,height=1,command=self.xfyun_tts) #按钮 self.tk_play=tk.Button(self.root, text='播放', width=10,height=1,command=self.play_sound) #按钮 #各个组件的位置 self.tk_tts_file.place(x=30,y=500) self.b1.place(x=300,y=500) self.tk_play.place(x=400,y=500) self.lb.place(x=30,y=30) self.cb.place(x=154,y=30) self.tt.place(x=30,y=60) self.root.mainloop() 当选择了下拉列表,设置对应的发音人
def select_vcn(self,*arg): if self.cb.get()=='甜美女声-小燕': self.vcn="xiaoyan" elif self.cb.get()=='亲切男声-许久': self.vcn="aisjiuxu" elif self.cb.get()=='知性女声-小萍': self.vcn="aisxping" elif self.cb.get()=='可爱童声-许小宝': self.vcn="aisbabyxu" elif self.cb.get()=='亲切女声-小婧': self.vcn="aisjinger" print(self.vcn)
接下来我们来魔改讯飞自带的Python demo为从而更加方便的来使用
# -*- coding:utf-8 -*-## author: iflytek## 本demo测试时运行的环境为:Windows + Python3.7# 本demo测试成功运行时所安装的第三方库及其版本如下:# cffi==1.12.3# gevent==1.4.0# greenlet==0.4.15# pycparser==2.19# six==1.12.0# websocket==0.2.1# websocket-client==0.56.0# 合成小语种需要传输小语种文本、使用小语种发音人vcn、tte=unicode以及修改文本编码方式# 错误码链接:https://www.xfyun.cn/document/error-code (code返回错误码时必看)# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #import websocketimport datetimeimport hashlibimport base64import hmacimport jsonfrom urllib.parse import urlencodeimport timeimport sslfrom wsgiref.handlers import format_date_timefrom datetime import datetimefrom time import mktimeimport _thread as threadimport osimport waveSTATUS_FIRST_FRAME = 0 # 第一帧的标识STATUS_CONTINUE_FRAME = 1 # 中间帧标识STATUS_LAST_FRAME = 2 # 最后一帧的标识PCM_PATH = "./demo.pcm"class Ws_Param(object): # 初始化 def __init__(self): pass def set_tts_params(self, text, vcn): if text != "": self.Text = text if vcn != "": self.vcn = vcn # 业务参数(business),更多个性化参数可在官网查看 self.BusinessArgs = {"bgs":1,"aue": "raw", "auf": "audio/L16;rate=16000", "vcn": self.vcn, "tte": "utf8"} #使用小语种须使用以下方式,此处的unicode指的是 utf16小端的编码方式,即"UTF-16LE"" #self.Data = {"status": 2, "text": str(base64.b64encode(self.Text.encode('utf-16')), "UTF8")} self.Data = {"status": 2, "text": str(base64.b64encode(self.Text.encode('utf-8')), "UTF8")} def set_params(self, appid, apiSecret, apiKey): if appid != "": self.APPID = appid # 公共参数(common) self.CommonArgs = {"app_id": self.APPID} if apiKey != "": self.APIKey = apiKey if apiSecret != "": self.APISecret = apiSecret # 生成url def create_url(self): url = 'wss://tts-api.xfyun.cn/v2/tts' # 生成RFC1123格式的时间戳 now = datetime.now() date = format_date_time(mktime(now.timetuple())) # 拼接字符串 signature_origin = "host: " + "ws-api.xfyun.cn" + "\n" signature_origin += "date: " + date + "\n" signature_origin += "GET " + "/v2/tts " + "HTTP/1.1" # 进行hmac-sha256进行加密 signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'), digestmod=hashlib.sha256).digest() signature_sha = base64.b64encode(signature_sha).decode(encoding='utf-8') authorization_origin = "api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"" % ( self.APIKey, "hmac-sha256", "host date request-line", signature_sha) authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8') # 将请求的鉴权参数组合为字典 v = { "authorization": authorization, "date": date, "host": "ws-api.xfyun.cn" } url = url + '?' + urlencode(v) return urldef on_message(ws, message): try: #print(message) try: message =json.loads(message) except Exception as e: print("111",e) code = message["code"] sid = message["sid"] audio = message["data"]["audio"] audio = base64.b64decode(audio) status = message["data"]["status"] print(code, sid, status) if status == 2: print("ws is closed") ws.close() if code != 0: errMsg = message["message"] print("sid:%s call error:%s code is:%s" % (sid, errMsg, code)) else: with open(PCM_PATH, 'ab') as f: f.write(audio) except Exception as e: print("receive msg,but parse exception:", e)# 收到websocket错误的处理def on_error(ws, error): print("### error:", error)# 收到websocket关闭的处理def on_close(ws): print("### closed ###")# 收到websocket连接建立的处理def on_open(ws): def run(*args): d = {"common": wsParam.CommonArgs, "business": wsParam.BusinessArgs, "data": wsParam.Data, } d = json.dumps(d) print("------>开始发送文本数据") ws.send(d) if os.path.exists(PCM_PATH): os.remove(PCM_PATH) thread.start_new_thread(run, ())def text2pcm(appid, apiSecret, apiKey, text, vcn, fname): wsParam.set_params(appid, apiSecret, apiKey) wsParam.set_tts_params(text, vcn) websocket.enableTrace(False) wsUrl = wsParam.create_url() ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close) ws.on_open = on_open ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE}) pcm2wav(PCM_PATH, fname)def pcm2wav(fname, dstname): with open(fname, 'rb') as pcmfile: pcmdata = pcmfile.read() print(len(pcmdata)) with wave.open(dstname, "wb") as wavfile: wavfile.setparams((1, 2, 16000, 0, 'NONE', 'NONE')) wavfile.writeframes(pcmdata)wsParam = Ws_Param()最终一个语音合成系统就这样实现了。
关于"基于Python怎么编写一个语音合成系统"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"基于Python怎么编写一个语音合成系统"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。
语音
系统
女声
内容
参数
文本
语种
下拉
选择
接下来
函数
方式
标识
知识
错误
讯飞
可变
处理
应用
生成
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
access数据库读写
自然资源清查数据库结构
法律数据库收费吗
海康威视服务器软件盒子
武警网络技术士官
软件开发计算机编程语言学习
kettle连接新的数据库
文件复制服务器
网络安全硕士排名
易探云韩国服务器
我的世界服务器有人却连接不到服务器
科技公司简介软件开发
查询数据库的7个标准步骤是什么
常熟大数据软件开发活动
网络安全保障措施的实施方案
警院网络安全知识
共筑网络安全文字
网络安全认证网上授课视频
网络技术解决方案拓扑图是否合理
甘肃服务器维修维保虚拟主机
济南贝思网络技术
阳者软件开发有限公司广州
奥维互动地图企业服务器登录
登陆王者怎么知道在哪个服务器
传达落实网络安全防护
闲鱼软件开发破解
美容软件开发教程
在数据库中投影运算的含义
三旺串口服务器管理工具
ipad服务器ip地址怎么查