首頁>技術>

/前言/

平時我們聊天的時候,也許會想著錄製一些自己的聲音,而且還想有點特色,也就是所謂的變聲,今天我們要說的就是這個變聲器的製作,說的高大上點就是語音合成系統。

這個語音合成系統,能實現個性化語音的錄製與儲存。

/軟體依賴/

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

/具體實現/

1、開啟百度開放這平臺建立一個應用拿到關鍵引數,如圖所示:

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

3、找到之後可以看看它的使用說明。

4、然後建立一個應用,步驟依次如下圖所示:

5、之後如下圖所示:

6、再按照下圖所示進行操作:

7、這樣就拿到了三個重要的引數:

APP_ID:應用id

API_KEY:應用鑰匙

SECRET_KEY:安全碼

拿到以上關鍵引數之後,接下來就可以開始淦了!

/下載和配置百度語音客戶端/

1、下載百度Python api

pip install  baidu-aip
2、配置百度語音客戶端,具體步驟如下。

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)

4、配置AipSpeech。如果使用者需要配置AipSpeech的網路請求引數(一般不需要配置),可以在構造AipSpeech之後呼叫介面設定引數,目前只支援以下引數:

介面說明setConnectionTimeoutInMillis建立連線的超時時間(單位:毫秒setSocketTimeoutInMillis透過開啟的連線傳輸資料的超時時間(單位:毫秒)

5、建立連結,生成音訊檔案,如下圖所示。

6、可以看出,成功生成音訊檔案會返回二進位制檔案流。這樣還只是生成一個最簡單的音訊檔案,我們還可以將他生成多種聲音,引數如下表所示:

引數型別描述是否必須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,只用了幾分鐘,就完成了一年的開發量。

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

1)錯誤返回格式

若請求錯誤,伺服器將返回的JSON文字包含以下引數:

error_code:錯誤碼。error_msg:錯誤描述資訊,幫助理解和解決發生的錯誤。

2)錯誤碼

錯誤碼含義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("<<ComboboxSelected>>",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、一起來看下它長啥樣,如下圖所示:

小夥伴們,是不是覺得很簡潔大氣呢?

3、繫結下拉列表框事件

在這裡,我們需要對如何獲取下拉列表框的選項要了解。言歸正傳,直接上程式碼:

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

4、判斷內容的大小並生成檔案

百度語音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='檔名已存在') #有這個檔案就提示

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

play()

6、當我輸入一段話後,大家可以看到它就生成了一個音訊檔案。而且讀取的時候和我們輸入的內容一模一樣,比如我輸入一段程式碼,見下圖:

7、之後會得到下圖所示的情形。

8、最後的效果如下圖所示。

完美收工,哈哈哈!

/小結/

11
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • JS程式碼加密平臺,JShaman的保留字功能演示