安基網 首頁 編程 Python 查看內容

Python 打造一個語音合成系統

2020-5-19 12:23| 投稿: xiaotiger |來自: 互聯網


免責聲明:本站系公益性非盈利IT技術普及網,本文由投稿者轉載自互聯網的公開文章,文末均已注明出處,其內容和圖片版權歸原網站或作者所有,文中所述不代表本站觀點,若有無意侵權或轉載不當之處請從網站右下角聯系我們處理,謝謝合作!

摘要: Python 打造一個語音合成系統平時我們聊天的時候,也許會想著錄制一些自己的聲音,而且還想有點特色,也就是所謂的變聲,今天我們要說的就是這個變聲器的制作,說的高大上點就是語音合成系統。它能實現個性化語音的錄制與存儲。開發需求申請百度開放平臺賬號,使用sublime text 3 開發。開發步驟1.打開 ...

Python 打造一個語音合成系統

平時我們聊天的時候,也許會想著錄制一些自己的聲音,而且還想有點特色,

也就是所謂的變聲,今天我們要說的就是這個變聲器的制作,

說的高大上點就是語音合成系統。它能實現個性化語音的錄制與存儲。

開發需求

申請百度開放平臺賬號,使用sublime text 3 開發。

開發步驟

1.打開百度開放這個平臺創建一個應用拿到關鍵參數,如圖:



因為我們使用Python開發一款智能語音合成系統,所以需要PythonSDK ,可以在下圖中找到:



找到之后可以看看他的使用說明:



然后創建一個應用:





這樣就拿到了三個重要的參數:

APP_ID:應用id

API_KEY:應用鑰匙

SECRET_KEY:安全碼

2.下載百度Python api

pip install  baidu-aip

3.配置百度語音客戶端

新建AipSpeech

from aip import AipSpeech
?
""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'
?
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

配置AipSpeech

如果用戶需要配置AipSpeech的網絡請求參數(一般不需要配置),可以在構造AipSpeech之后調用接口設置參數,目前只支持以下參數:

接口說明setConnectionTimeoutInMillis建立連接的超時時間(單位:毫秒setSocketTimeoutInMillis通過打開的連接傳輸數據的超時時間(單位:毫秒)

4.建立鏈接,生成音頻文件



可以看出,成功生成音頻文件會返回二進制文件流。這樣還只是生成一個最簡單的音頻文件,

我們還可以將它生成多種聲音,參數如下:

參數類型描述是否必須textString合成的文本,使用UTF-8編碼, 請注意文本長度必須小于1024字節是cuidString用戶唯一標識,用來區分用戶, 填寫機器 MAC 地址或 IMEI 碼,長度為60以內否spdString語速,取值0-9,默認為5中語速否pitString音調,取值0-9,默認為5中語調否volString音量,取值0-15,默認為5中音量否perString發音人選擇, 0為女聲,1為男聲, 3為情感合成-度逍遙,4為情感合成-度丫丫,默認為普通女否

這就是人工智能中的語音合成技術,調用百度的SDK,只用了幾分鐘。就完成了一年的開發量。

當然有失敗就避免不了成功,一般請求失敗會有這幾種情況:

錯誤返回格式

若請求錯誤,服務器將返回的JSON文本包含以下參數:

  • error_code:錯誤碼。
  • error_msg:錯誤描述信息,幫助理解和解決發生的錯誤。

錯誤碼

錯誤碼含義500不支持的輸入501輸入參數不正確502token驗證失敗503合成后端錯誤

看到上面這些參數是不是想躍躍欲試了了。哈哈,那就趕緊解放我們的雙手吧。

程序實現

因為我們是要將他打造成一個語音合成的系統,所以當然得有界面才好看啦,

1.編寫程序主界面:

class play:
def __init__(self):
self.root=tk.Tk()#初始化窗口
self.root.title("語音合成系統")#窗口名稱
self.root.geometry("700x700")#設置窗口大小
       self.root.resizable(width=True,height=True)#設置窗口是否可變,寬不可變,高可變,默認為True
self.lb=tk.Label(self.root,text='請選擇語音類型')#標簽
self.tt=tk.Text(self.root,width=80,height=30)#多行文本框
self.cb=ttk.Combobox(self.root, width=12)#下拉列表框
#設置下拉列表框的內容  
self.cb['values']=('請選擇-----','甜美型','蘿莉型','大叔型','精神小伙型')
self.cb.current(0)#將當前選擇狀態置為0,也就是第一項
self.cb.bind("<>",self.go)#綁定go函數,然后觸發事件
self.lb1=tk.Label(self.root,text='請輸入文件名:')
self.e=tk.Entry(self.root,width=30,show=None, font=('Arial', 12))#文本框
self.b1=tk.Button(self.root, text='生成音頻文件', width=10,height=1,command=self.sc)#按鈕
#各個組件的位置
self.b1.place(x=200,y=520)
self.lb.place(x=30,y=30)
self.cb.place(x=154,y=30)
self.e.place(x=130,y=490)
self.lb1.place(x=30,y=490)
self.tt.place(x=30,y=60)
self.root.mainloop()#啟動主頁面

這樣就算完成了程序的主界面了,是不是很簡單了,一起來看下它長啥樣吧:



怎么樣,是不是很簡潔大氣了。

2.綁定下拉列表框事件

在這里,我們需要對如何獲取下拉列表框的選項要了解,廢話少說。

直接上代碼:

def go(self,*arg):  # *arg是為了接受多個如同列表的參數,還有個**kwarg能接受如同字典的參數
       #百度api
self.APP_ID = '18386899'  
self.API_KEY = 'OcPQ4cGoGBRtW23jemKvgmU5'
self.SECRET_KEY = 'n2rGtvq9HmOGxgxG8H9a5kqFOes8ggHx'
self.client = AipSpeech(self.APP_ID,self.API_KEY,self.SECRET_KEY)#初始化端口建立連接
if self.cb.get()=='請選擇-----':
self.tt.delete('1.0','end')#清除多行文本框的內容
elif self.cb.get()=='甜美型': #獲取下拉列表框的選項來設置不同的音,下同
self.res=self.client.synthesis(self.tt.get('0.0','end'),'zh',1,{'vol':3,'spd':3,'pit':4,'per':0})
return self.res #返回音頻信息,下同
elif self.cb.get()=='蘿莉型':
self.res=self.client.synthesis(self.tt.get('0.0','end'),'zh',1,{'vol':2,'spd':2,'pit':3,'per':0})
return self.res
elif self.cb.get()=='大叔型':
self.res=self.client.synthesis(self.tt.get('0.0','end'),'zh',1,{'vol':5,'spd':7,'pit':6,'per':1})
return self.res
elif self.cb.get()=='精神小伙型':
self.res=self.client.synthesis(self.tt.get('0.0','end'),'zh',1,{'vol':7,'spd':8,'pit':8,'per':1})
return self.res

3.判斷內容的大小并生成文件

百度語音api里有個限制,就是單個音頻生成是有限制的,不能超過1024字節,

所以我在這里做個判斷:

def sc(self):
self.go()#引入go函數,不然下面的self.res 沒法調用
aa=self.tt.get('0.0','end') #多行文本框內容為空
ab=os.path.dirname(sys.argv[0])+os.sep+self.e.get()+'.mp3'#文件名的地址,與程序同目錄
if len(aa)>=1024: #判斷長度是否超過1024
messagebox.showerror(title = '出錯了!',message='^_^最多不超過1024個字節^_^')
else:
if not os.path.exists(ab):#如果沒有這個文件則創建
with open(ab,'wb') as f:
f.write(self.res)#將音頻信息寫入到文件
                   #生成結束給一個提示
                   messagebox.showinfo(title = '完畢!',message='生成完畢,文件在程序目錄下')
else:
messagebox.showerror(title='出錯了!',message='文件名已存在')#有這個文件就提示

接下來,我們只需將這幾個功能寫入到一個類中即可,然后啟動這個類。

play()

當我輸入一段話后,大家可以看到它就生成了一個音頻文件,

而且讀取的時候和我們輸入的內容一模一樣,比如我輸入一段代碼,見下圖:





怎么樣,是不是很完美了,哈哈哈。!其實,有時候我們在寫代碼的時候

完全可以想到什么寫什么,這樣你才能學的更快更好。



小編推薦:欲學習電腦技術、系統維護、網絡管理、編程開發和安全攻防等高端IT技術,請 點擊這里 注冊賬號,公開課頻道價值萬元IT培訓教程免費學,讓您少走彎路、事半功倍,好工作升職加薪!

本文出自:https://www.toutiao.com/a6827803110912557579/

免責聲明:本站系公益性非盈利IT技術普及網,本文由投稿者轉載自互聯網的公開文章,文末均已注明出處,其內容和圖片版權歸原網站或作者所有,文中所述不代表本站觀點,若有無意侵權或轉載不當之處請從網站右下角聯系我們處理,謝謝合作!


鮮花

握手

雷人

路過

雞蛋

相關閱讀

最新評論

 最新
返回頂部
洗衣店赚钱联系澳洁 陕西快乐10分钟开奖结果 北京11选五直选遗漏 辽宁体育彩票十一选五 ipad2急速赛车6 甘肃十一选五开奖询结果 福建快3下载安装 股票k线图 快三1到18的顺口溜 潍坊 股票配资 今日海南4十1开奖