惊!Python居然可以读故事了 分手后的思念是犯贱 2022-12-18 00:45 122阅读 0赞 # 我有故事,让机器人来读 # 最近工作较忙,回家闲下来只想闭目休息,一分钟屏幕都不想再看,然而我又想追更之前看的小说,于是,需求来了——我需要一个给我讲故事的机器人! 浏览器或者阅读器App里其实也有朗读功能,但是比较僵硬,总是将引人入胜的情节念成流水账,分分钟让人弃坑,所以我考虑自己使用爬虫定时下载更新的章节,而后将文字合成存储到音频文件,这样不仅可以选择一个靠谱的语音合成工具来处理文字,而且保存下来的音频还能反复收听,一举两得。 文本整合容易,但是如何将其快速转换成音频呢?难道要自己训练模型“炼丹”解决?no no ,费力不讨好,毕竟自己手头这点算法知识非常浅显,而且硬件条件也不允许,本着“能用就行”的原则,我决定先使用市面上开放平台的产品来解决。经过对比,发现有道智云的语音合成还不错([此处][Link 1]可体验),决定使用有道智云的语音合成API进行开发。 ### 效果先睹为快: ### 我拿来朱自清先生的《荷塘月色》的其中两段作为实验素材,开发了简单的[demo][],走通了从加载文本到生成音频文件的逻辑,下面我来详细介绍开发过程。 ![在这里插入图片描述][2020102415012635.gif_pic_center] 需要语音合成的文本: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE3NjIzMzYz_size_16_color_FFFFFF_t_70_pic_center] 合成结果(第一段): 合成结果(第二段): 很可惜,这里不能上传mp3格式的音乐文件 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE3NjIzMzYz_size_16_color_FFFFFF_t_70_pic_center 1] ### 调用API接口的准备工作 ### 首先,是需要在有道智云的个人页面上创建实例、创建应用、绑定应用和实例,获取到应用的id和密钥。具体个人注册的过程和应用创建过程详见文章[分享一次批量文件翻译的开发过程][Link 2]。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE3NjIzMzYz_size_16_color_FFFFFF_t_70_pic_center 2] ### 开发过程详细介绍 ### 下面介绍具体的代码开发过程。 首先根据[文档][Link 3]分析有道智云的API输入输出规范。语音合成API调用十分简单,该API采用https方式通信,所需参数如下表: <table> <thead> <tr> <th>字段名</th> <th>类型</th> <th>含义</th> <th>必填</th> <th>备注</th> </tr> </thead> <tbody> <tr> <td>q</td> <td>text</td> <td>待合成音频文件的文本字符串</td> <td>True</td> <td>比如:您好</td> </tr> <tr> <td>langType</td> <td>text</td> <td>合成文本的语言类型</td> <td>True</td> <td><a href="https://ai.youdao.com/DOCSIRMA/html/%E8%AF%AD%E9%9F%B3%E5%90%88%E6%88%90TTS/API%E6%96%87%E6%A1%A3/%E8%AF%AD%E9%9F%B3%E5%90%88%E6%88%90%E6%9C%8D%E5%8A%A1/%E8%AF%AD%E9%9F%B3%E5%90%88%E6%88%90%E6%9C%8D%E5%8A%A1-API%E6%96%87%E6%A1%A3.html#section-9" rel="nofollow">支持语言</a></td> </tr> <tr> <td>appKey</td> <td>text</td> <td>应用 ID</td> <td>True</td> <td>可在 <a href="https://ai.youdao.com/appmgr.s" rel="nofollow">应用管理</a> 查看</td> </tr> <tr> <td>salt</td> <td>text</td> <td>UUID</td> <td>True</td> <td>UUID</td> </tr> <tr> <td>sign</td> <td>text</td> <td>签</td> <td>True</td> <td>MD5(应用ID+q+salt+应用密钥)</td> </tr> <tr> <td>voice</td> <td>text</td> <td>翻译结果发音选择,0为女声,1为男声,默认为女声</td> <td>false</td> <td>0</td> </tr> <tr> <td>format</td> <td>text</td> <td>目标音频格式,支持mp3</td> <td>false</td> <td>mp3</td> </tr> <tr> <td>speed</td> <td>text</td> <td>合成音频的语速</td> <td>false</td> <td>比如:"1"为正常速度</td> </tr> <tr> <td>volume</td> <td>text</td> <td>合成音频的音量</td> <td>false</td> <td>正常为"1.00",最大为"5.00",最小为"0.50"</td> </tr> </tbody> </table> 简单概括,组织好自己的语言(utf-8编码文本),辅以签名等必要参数,并告诉API所需要的音频特征,即可得到一份令人满意的合成音频。 接口输出中,如果合成成功,正常返回为二进制语音文件,具体header信息 Content-type: audio/mp3,如果合成出现错误,则会返回json结果,具体header信息为:Content-type: application/json,可据此判断运行情况。 #### Demo开发: #### 这个demo使用python3开发,包括maindow.py,synthesis.py,synthesistool.py三个文件,分别为demo的界面、界面逻辑处理和语音合成接口调用工具封装。 1. ##### 界面部分: ##### 界面部分代码如下,比较简单。 root=tk.Tk() root.title("youdao speech synthesis test") frm = tk.Frame(root) frm.grid(padx='50', pady='50') # 文件选取按钮 btn_get_file = tk.Button(frm, text='选择待合成文件', command=get_files) btn_get_file.grid(row=0, column=0, ipadx='3', ipady='3', padx='10', pady='20') # 所选文件列表展示框 text1 = tk.Text(frm, width='40', height='10') text1.grid(row=0, column=1) # 启动按钮 btn_sure=tk.Button(frm,text="合成",command=synthesis_files) btn_sure.grid(row=1,column=1) 其中启动按钮btn\_sure的绑定事件synthesis\_files()来收集带所有的文本文件,启动合成,并打印运行结果: def synthesis_files(): if syn_m.file_paths: message=syn_m.get_synthesis_result() tk.messagebox.showinfo("提示", message) os.system('start' + '.\\result') else : tk.messagebox.showinfo("提示","无文件") 2. ##### synthesis.py ##### 这里主要是配合界面实现一些文本读取和请求接口处理返回值的逻辑。首先定义一个Synthesis\_model class Synthesis_model(): def __init__(self,file_paths,result_root_path,syn_type): self.file_paths=file_paths # 待合成文件路径 self.result_root_path=result_root_path # 结果路径 self.syn_type=syn_type # 合成类型 get\_synthesis\_result()方法实现了批量读取文件并调用合成方法、处理返回信息的逻辑: def get_synthesis_result(self): syn_result="" for file_path in self.file_paths: # 读取文件 file_name=os.path.basename(file_path).split('.')[0] file_content=open(file_path,encoding='utf-8').read() # 调用合成方法 result=self.synthesis_use_netease(file_name,file_content) # 处理返回消息 if result=="1": syn_result=syn_result+file_path+" ok !\n" else: syn_result=syn_result+file_path+result return syn_result 单独定义了方法synthesis\_use\_netease()具体实现调用API的方法,这样增加了demo的扩展性,实现了一种合成模块可插拔的松耦合形式: def synthesis_use_netease(self,file_name,text): result=connect(text,'zh-CHS') print(result) if result.headers['Content-Type']=="audio/mp3": millis = int(round(time.time() * 1000)) filePath = "./result/" + file_name+"-"+str(millis) + ".mp3" fo = open(filePath, 'wb') fo.write(result.content) fo.close() return "1" else: return "error:"+result.content 3. ##### synthesistool.py ##### 1. synthesistool.py中是和请求有道智云API直接相关的一些方法,最核心的是connect()方法,整合了API所要求的各个参数,并调用执行请求的方法do\_request(),并返回API处理结果。 def connect(text,lang_type): q = text data = { } data['langType'] = lang_type salt = str(uuid.uuid1()) signStr = APP_KEY + q + salt + APP_SECRET sign = encrypt(signStr) data['appKey'] = APP_KEY data['q'] = q data['salt'] = salt data['sign'] = sign response = do_request(data) return response 需要体验一下的小伙伴,请下载我的代码自行尝试或去官网体验 : P。项目地址:https://github.com/LemonQH/SpeechSynthesis <table> <tbody> <tr> <td>特别提示:<br> 1、运行demo时,需要替换synthesistool.py模块中的 APP_KEY 、 APP_SECRET为你自己生成的 APP_KEY、APP_SECRET哦<br> 2、该工程默认存放结果存在./result 文件夹下,你需要手动在项目路径下创建该目录。或者修改为任意你想存放的位置</td> </tr> </tbody> </table> ### 总结 ### 以上就是我的开发过程,有道智云的语音合成API文档清晰,调用过程全程无坑,开发体验和合成效果都令人感到舒适。 我有故事,我把它交给机器人来讲,闭目养神不枯燥,真是一件美事! 欢迎关注我,`一块来履行我之前的承诺`,`连更一个月之内`,把几篇写完。 <table> <thead> <tr> <th>序号</th> <th>预计完成时间</th> <th>开发dome名字以及功能&发布文章内容</th> <th>是否已写完</th> <th>文章链接</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>9月3</td> <td>文本翻译,单文本翻译,批量翻译demo。</td> <td>已完成</td> <td>CSDN:<a href="https://blog.csdn.net/qq_17623363/article/details/108511541" rel="nofollow">点我直达</a> <br>微信公众号:<a href="https://mp.weixin.qq.com/s/6AMzkTtPKf4JcATHD-_yAg" rel="nofollow">点我直达</a></td> </tr> <tr> <td>2</td> <td>9月11</td> <td>OCR-demo,完成批量上传识别;在一个demo中可选择不同类型的OCR识别《包含手写体/印刷体/身份证/表格/整题/名片),然后调用平台能力,具体实现步骤等。</td> <td>已完成</td> <td>CSDN:<a href="https://blog.csdn.net/qq_17623363/article/details/108588629" rel="nofollow">点我直达</a><br>微信公众号:</td> </tr> <tr> <td>3</td> <td>10月27</td> <td>语音识别demo,demo中上传—段视频,并截取视频中短语音识别-demo的一段音频进行短语音识别</td> <td></td> <td>CSDN:<a href="https://truedei.blog.csdn.net/article/details/109153738" rel="nofollow">点我直达</a><br>微信公众号:</td> </tr> <tr> <td>4</td> <td>9月17</td> <td>智能语音评测-demo</td> <td></td> <td>CSDN:<br>微信公众号:</td> </tr> <tr> <td>5</td> <td>9月24</td> <td>作文批改-demo</td> <td></td> <td>CSDN:<br>微信公众号:</td> </tr> <tr> <td>6</td> <td>9月30</td> <td>语音合成-demo</td> <td></td> <td>CSDN:<br>微信公众号:</td> </tr> <tr> <td>7</td> <td>10月15</td> <td>单题拍搜-demo</td> <td></td> <td>CSDN:<br>微信公众号:</td> </tr> <tr> <td>8</td> <td>10月20</td> <td>图片翻译-demo</td> <td></td> <td>CSDN:<br>微信公众号:</td> </tr> <tr> <td></td> <td></td> <td></td> <td></td> <td></td> </tr> </tbody> </table> **`关注我微信公众号第一时间推送给你哦:`** 回复`菜单`,更有好礼,惊喜在等着你。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE3NjIzMzYz_size_16_color_FFFFFF_t_70_pic_center 3] **欢迎扫码加入我创建的社区群哦,可以与我更进一步的交流,群里还有很多大佬等着你,一起玩耍,一起进步!!!** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE3NjIzMzYz_size_16_color_FFFFFF_t_70_pic_center 4] [Link 1]: https://ai.youdao.com/product-tts.s [demo]: https://github.com/LemonQH/SpeechSynthesis [2020102415012635.gif_pic_center]: /images/20221122/a5796dfd05ee432481f294476b0cb097.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE3NjIzMzYz_size_16_color_FFFFFF_t_70_pic_center]: /images/20221122/e2b33762c4174756a0a8d6257a89cffe.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE3NjIzMzYz_size_16_color_FFFFFF_t_70_pic_center 1]: /images/20221122/c11ce25519d640cd86b6ae91a7e06318.png [Link 2]: https://blog.csdn.net/qiedabeng8686/article/details/108416385 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE3NjIzMzYz_size_16_color_FFFFFF_t_70_pic_center 2]: /images/20221122/2b53d246077c40598225714558196fb3.png [Link 3]: https://ai.youdao.com/DOCSIRMA/html/%E8%AF%AD%E9%9F%B3%E5%90%88%E6%88%90TTS/API%E6%96%87%E6%A1%A3/%E8%AF%AD%E9%9F%B3%E5%90%88%E6%88%90%E6%9C%8D%E5%8A%A1/%E8%AF%AD%E9%9F%B3%E5%90%88%E6%88%90%E6%9C%8D%E5%8A%A1-API%E6%96%87%E6%A1%A3.html [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE3NjIzMzYz_size_16_color_FFFFFF_t_70_pic_center 3]: /images/20221122/385ec37c44ef4a2da5a65117325cf3ee.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE3NjIzMzYz_size_16_color_FFFFFF_t_70_pic_center 4]: /images/20221122/a74980503c4b4e7eb19b8fc2276274d9.png
还没有评论,来说两句吧...