百度智能云实现文字转语音

tkinter写的界面,需要自己申请百度智能云的APP_ID、API_KEY 、SECRET_KEY 效果图如下:
在这里插入图片描述

实现代码如下:

import tkinter as tk
import tkinter.ttk as ttk
import tkinter.filedialog
import tkinter.messagebox
import requests
from pygame import mixer 
from aip import AipSpeech




class Application:
    def __init__(self,master):
        self.master = master
        # 变量名
        self.network_status = tk.StringVar()
        self.file_path = tk.StringVar()
        # self.filename = ""
        # 文字
        self.data = ""
        # 语速
        self.spd = tk.StringVar()
        self.spd.set("5")
        # 音调
        self.pit = tk.StringVar()
        self.pit.set("5")
        # 音量
        self.vol = tk.StringVar()
        self.vol.set("5")
        # 发音人
        self.per = tk.StringVar()
        self.per_dict={
                "女生":"0",
                "男生":"1",
                "度逍遥":"2",
                "度丫丫":"3",
                }
        self.per.set("女生")
		# 需要自己申请百度智能云的APP_ID、API_KEY 、SECRET_KEY 然后替换下面对应的******
        self.APP_ID = ******
        self.API_KEY = ******
        self.SECRET_KEY = ******
        self.client = AipSpeech(self.APP_ID, self.API_KEY, self.SECRET_KEY)
       
        # 画界面
        self.initWidgets()


    def initWidgets(self):
        self.master.title("TextToSpeech")

        tk.Button(self.master,text="测试网络",command=self.isConnected).grid(row=0,column=0,padx=5,pady=5,sticky=tk.W+tk.E)
        tk.Entry(self.master,textvariable=self.network_status,state="readonly",width=8).grid(row=0,column=1,padx=5,pady=5,columnspan=6,sticky=tk.W+tk.E)
        tk.Button(self.master,text="设置",command=self.set_dialog).grid(row=0,column=7,padx=5,pady=5,sticky=tk.W+tk.E)
        tk.Button(self.master,text="关闭",command=self.master.destroy,width=8).grid(row=0,column=8,padx=5,pady=5,sticky=tk.W+tk.E)
        
        
        tk.Button(self.master,text="选择文件",command=self.get_file_path).grid(row=1,column=0,padx=5,pady=5,sticky=tk.W+tk.E)
        tk.Entry(self.master,textvariable=self.file_path,state="readonly",width=56).grid(row=1,column=1,padx=5,columnspan=6,sticky=tk.W+tk.E)
        tk.Button(self.master,text="生成mp3",command=self.product_mp3,width=8).grid(row=1,column=7,padx=5,pady=5,sticky=tk.W+tk.E)
        tk.Button(self.master,text="播放",command=self.playback,width=8).grid(row=1,column=8,padx=5,pady=5,sticky=tk.W+tk.E)


        tk.Label(self.master,text="语 速:",relief="groove").grid(row=2,column=0,padx=5,pady=5,sticky=tk.W+tk.E)
        tk.Label(self.master,textvariable=self.spd,relief="sunken",width=6).grid(row=2,column=1,padx=5,pady=5,sticky=tk.W+tk.E)

        tk.Label(self.master,text="音 调:",relief="groove").grid(row=2,column=3,padx=5,pady=5,sticky=tk.W+tk.E)
        tk.Label(self.master,textvariable=self.pit,relief="sunken",width=6).grid(row=2,column=4,padx=5,pady=5,sticky=tk.W+tk.E)

        tk.Label(self.master,text="音 量:",relief="groove").grid(row=2,column=5,padx=5,pady=5,sticky=tk.W+tk.E)
        tk.Label(self.master,textvariable=self.vol,relief="sunken",width=6).grid(row=2,column=6,padx=5,pady=5,sticky=tk.W+tk.E)

        tk.Label(self.master,text="发音人:",relief="groove",width=8).grid(row=2,column=7,padx=5,pady=5,sticky=tk.W+tk.E)
        tk.Label(self.master,textvariable=self.per,relief="sunken",width=8).grid(row=2,column=8,padx=5,pady=5,sticky=tk.W+tk.E)

    

    def playback(self):
        top = tk.Toplevel(self.master)
        mixer.init()
        mixer.music.load('audio.mp3')
        top.title("播放mp3")
        tk.Button(top,text="播放",command=lambda:mixer.music.play()).grid(row=0,column=0,padx=5,pady=5,sticky=tk.W+tk.E)
        tk.Button(top,text="暂停",command=lambda:mixer.music.pause()).grid(row=0,column=1,padx=5,pady=5,sticky=tk.W+tk.E)
        tk.Button(top,text="恢复",command=lambda:mixer.music.unpause()).grid(row=0,column=2,padx=5,pady=5,sticky=tk.W+tk.E)
        tk.Button(top,text="停止",command=lambda:mixer.music.stop()).grid(row=0,column=3,padx=5,pady=5,sticky=tk.W+tk.E)
        tk.Button(top,text="关闭",command=top.destroy).grid(row=0,column=4,padx=5,pady=5,sticky=tk.W+tk.E)

        
        
    def set_dialog(self):
        top = tk.Toplevel(self.master)
        top.title("设置")

        tk.Label(top,text="语速:").grid(row=0,column=0,padx=5,pady=5)
        cb_spd = ttk.Combobox(top,textvariable=self.spd)
        cb_spd["value"] = ("0","1","2","3","4","5","6","7","8","9")
        cb_spd.grid(row=0,column=1,padx=5,pady=5)

        tk.Label(top,text="音调:").grid(row=1,column=0,padx=5,pady=5)
        cb_pit = ttk.Combobox(top,textvariable=self.pit)
        cb_pit["value"] = ("0","1","2","3","4","5","6","7","8","9")
        cb_pit.grid(row=1,column=1,padx=5,pady=5)
        
        tk.Label(top,text="音量:").grid(row=2,column=0,padx=5,pady=5)
        cb_vol = ttk.Combobox(top,textvariable=self.vol)
        cb_vol["value"] = ("0","1","2","3","4","5","6","7","8","9")
        cb_vol.grid(row=2,column=1,padx=5,pady=5)

        tk.Label(top,text="发音:").grid(row=3,column=0,padx=5,pady=5)
        cb_per = ttk.Combobox(top,textvariable=self.per)
        cb_per["value"] = ( "女生", "男生", "度逍遥", "度丫丫")
        cb_per.grid(row=3,column=1,padx=5,pady=5)

        tk.Button(top,text="关闭",command=top.destroy).grid(row=4,columnspan=2,padx=5,pady=5,sticky=tk.W+tk.E)


    def get_file_path(self):
        _file_path = tk.filedialog.askopenfilename()
        if _file_path.endswith('.txt'):
            self.file_path.set(_file_path)
            # self.filename = _file_path.split("/")[-1].split('.')[0]
        else:
            tk.messagebox.showinfo(title="文件格式不对",message="请选择记事本格式的文件!")


    def isConnected(self):
        try:
            requests.get("http://www.baidu.com",timeout=2)
        except:
            self.network_status.set("无网络连接!")
        else:
            self.network_status.set("网络连接正常")

    def _get_file_content(self):
        if self.file_path.get() == "":
            tk.messagebox.showinfo(title="无文本",message="请先选择记事本格式的文件!")
        else:
            with open(self.file_path.get(),'r',encoding='utf-8') as f:
                self.data = f.read()
        

    def product_mp3(self):
        self._get_file_content()
        flag = True
        if len(self.data) < 1024:
            result  = self.client.synthesis(self.data, 'zh', 1, { 
                'spd':self.spd.get(),
                'pit':self.pit.get(),
                'vol':self.vol.get(),
                'per':self.per_dict[self.per.get()]
                })
            # 识别正确返回语音二进制 错误则返回dict 参照下面错误码
            if not isinstance(result, dict):
                with open('audio.mp3', 'wb') as f:
                    f.write(result)   
        else:
            while self.data:
                if flag:
                    flag=False
                    result  = self.client.synthesis(self.data[:1023], 'zh', 1, { 
                        'spd':self.spd.get(),
                        'pit':self.pit.get(),
                        'vol':self.vol.get(),
                        'per':self.per_dict[self.per.get()]
                        })
                    # 识别正确返回语音二进制 错误则返回dict 参照下面错误码
                    if not isinstance(result, dict):
                        with open('audio.mp3', 'wb') as f:
                            f.write(result)   
                        self.data = self.data[1023:]
                else:
                    result  = self.client.synthesis(self.data[:1023], 'zh', 1, { 
                        'spd':self.spd.get(),
                        'pit':self.pit.get(),
                        'vol':self.vol.get(),
                        'per':self.per_dict[self.per.get()]
                        })
                    # 识别正确返回语音二进制 错误则返回dict 参照下面错误码
                    if not isinstance(result, dict):
                        with open('audio.mp3', 'ab') as f:
                            f.write(result)   
                        self.data = self.data[1023:]
                
        tk.messagebox.showinfo(title="生成mp3中",message="生成mp3成功!")            
            
    def run(self):
        
        self.master.mainloop()


if __name__ == "__main__":
    root = tk.Tk()
    display = Application(root)
    display.run()


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值