最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 惊!Python 居然可以读故事了

    正文概述 掘金(TrueDei)   2020-12-23   480

    惊!Python 居然可以读故事了

    最近工作较忙,回家闲下来只想闭目休息,一分钟屏幕都不想再看,然而我又想追更之前看的小说,于是,需求来了——我需要一个给我讲故事的机器人!

    浏览器或者阅读器 App 里其实也有朗读功能,但是比较僵硬,总是将引人入胜的情节念成流水账,分分钟让人弃坑,所以我考虑自己使用爬虫定时下载更新的章节,而后将文字合成存储到音频文件,这样不仅可以选择一个靠谱的语音合成工具来处理文字,而且保存下来的音频还能反复收听,一举两得。

    文本整合容易,但是如何将其快速转换成音频呢?难道要自己训练模型 “炼丹” 解决?no no ,费力不讨好,毕竟自己手头这点算法知识非常浅显,而且硬件条件也不允许,本着 “能用就行” 的原则,我决定先使用市面上开放平台的产品来解决。经过对比,发现有道智云的语音合成还不错(此处可体验),决定使用有道智云的语音合成 API 进行开发。

    效果先睹为快:

    我拿来朱自清先生的《荷塘月色》的其中两段作为实验素材,开发了简单的 demo,走通了从加载文本到生成音频文件的逻辑,下面我来详细介绍开发过程。

    惊!Python 居然可以读故事了

    需要语音合成的文本:

    惊!Python 居然可以读故事了

    合成结果(第一段):

    合成结果(第二段):

    很可惜,这里不能上传 mp3 格式的音乐文件

    惊!Python 居然可以读故事了

    调用 API 接口的准备工作

    首先,是需要在有道智云的个人页面上创建实例、创建应用、绑定应用和实例,获取到应用的 id 和密钥。具体个人注册的过程和应用创建过程详见文章分享一次批量文件翻译的开发过程。

    惊!Python 居然可以读故事了

    开发过程详细介绍

    下面介绍具体的代码开发过程。

    首先根据文档分析有道智云的 API 输入输出规范。语音合成 API 调用十分简单,该 API 采用 https 方式通信,所需参数如下表:

    字段名类型含义必填备注
    qtext待合成音频文件的文本字符串True比如:您好langTypetext合成文本的语言类型True支持语言appKeytext应用 IDTrue可在 应用管理 查看salttextUUIDTrueUUIDsigntextTrueMD5(应用 ID+q+salt + 应用密钥)voicetext翻译结果发音选择,0 为女声,1 为男声,默认为女声false0formattext目标音频格式,支持 mp3falsemp3speedtext合成音频的语速false比如:"1" 为正常速度volumetext合成音频的音量false正常为 "1.00", 最大为 "5.00", 最小为 "0.50"

    简单概括,组织好自己的语言(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

      特别提示: 1、运行 demo 时,需要替换 synthesistool.py 模块中的 APP_KEY 、 APP_SECRET 为你自己生成的 APP_KEY、APP_SECRET 哦 2、该工程默认存放结果存在./result 文件夹下,你需要手动在项目路径下创建该目录。或者修改为任意你想存放的位置

    总结

    以上就是我的开发过程,有道智云的语音合成 API 文档清晰,调用过程全程无坑,开发体验和合成效果都令人感到舒适。

    我有故事,我把它交给机器人来讲,闭目养神不枯燥,真是一件美事!

    欢迎关注我,一块来履行我之前的承诺连更一个月之内,把几篇写完。

    序号预计完成时间开发 dome 名字以及功能 & 发布文章内容是否已写完文章链接
    19 月 3文本翻译,单文本翻译,批量翻译 demo。已完成CSDN:点我直达 微信公众号:点我直达29 月 11OCR-demo,完成批量上传识别; 在一个 demo 中可选择不同类型的 OCR 识别《包含手写体 / 印刷体 / 身份证 / 表格 / 整题 / 名片),然后调用平台能力,具体实现步骤等。已完成CSDN:点我直达 微信公众号:310 月 27语音识别 demo,demo 中上传—段视频,并截取视频中短语音识别 - demo 的一段音频进行短语音识别CSDN:点我直达 微信公众号:49 月 17智能语音评测 - demoCSDN: 微信公众号:59 月 24作文批改 - demoCSDN: 微信公众号:69 月 30语音合成 - demoCSDN: 微信公众号:710 月 15单题拍搜 - demoCSDN: 微信公众号:810 月 20图片翻译 - demoCSDN: 微信公众号:

    关注我微信公众号第一时间推送给你哦:

    回复菜单,更有好礼,惊喜在等着你。

    惊!Python 居然可以读故事了


    起源地下载网 » 惊!Python 居然可以读故事了

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元