99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀python語音合成指北(一)
python語音合成指北(一)
2020-08-10
收藏


小編今天跟大家分享的這篇文章是關(guān)于python語音識(shí)別的,語音識(shí)別是人工智能研究的重要領(lǐng)域。希望這篇文章能對(duì)大家python學(xué)習(xí)和使用有所幫助。

文章來源: 飯飯的Python學(xué)習(xí)之路

作者: 一粒米飯

語音合成概述

總的來說,語音合成是通過機(jī)械的、電子的方法產(chǎn)生人造語音的技術(shù)。其中TTS,是Text-To-Speech縮寫,即“從文本到語音”,是人機(jī)對(duì)話的一部分。它屬于語音合成,是將計(jì)算機(jī)自己產(chǎn)生的、或外部輸入的文字信息轉(zhuǎn)變?yōu)榭梢月牭枚?、流利的語音輸出的技術(shù)。本文中提到的語音合成是指TTS。生活中用到的林志玲導(dǎo)航、郭德綱導(dǎo)航等就是基于TTS實(shí)現(xiàn)。

語音合成方法

這里簡(jiǎn)單論述下語音合成的傳統(tǒng)方法以及近年來基于深度學(xué)習(xí)的合成方法,對(duì)這部分不感興趣的同學(xué)可以直接跳過,不影響后面閱讀。

傳統(tǒng)方法

語音合成的傳統(tǒng)方法可分為拼接和參數(shù)化兩種。

  • 拼接,拼接方法是指從語音數(shù)據(jù)庫中選擇需要的語音片段來合成完整的語音。這種方法需要大量的語音數(shù)據(jù),靈活性較差,且不能合成新的語音片段。
  • 參數(shù)化,參數(shù)化方法是指用一條記錄下的人的聲音以及一個(gè)含參函數(shù),通過調(diào)節(jié)函數(shù)參數(shù)來改變語音。這種傳統(tǒng)的方法工作量比較大。

基于深度學(xué)習(xí)的方法

今年來隨著神經(jīng)網(wǎng)絡(luò)的不斷發(fā)展,深度學(xué)習(xí)技術(shù)在語音合成方面也有著廣泛的應(yīng)用,大致包含以下幾個(gè)方向:

  • WaveNet: 原始音頻生成模型,WaveNET是基于PixelCNN的音頻生成模型,它能夠產(chǎn)生類似于人類發(fā)出的聲音。論文地址
  • Tacotron:端到端的語音合成,Tacotron是一個(gè)seq2seq模型,該模型包括一個(gè)編碼器、一個(gè)基于注意力的解碼器以及一個(gè)后端處理網(wǎng)絡(luò)。論文鏈接
  • Deep Voice 1: 實(shí)時(shí)神經(jīng)文本語音轉(zhuǎn)換,它是一個(gè)利用深度神經(jīng)網(wǎng)絡(luò)開發(fā)的文本到語音的系統(tǒng)。論文鏈接
  • Deep Voice 2: 多說話人神經(jīng)文本語音轉(zhuǎn)換,它與DeepVoice 1類似,但它在音頻質(zhì)量上卻有顯著的提高。該模型能夠從每個(gè)說話人不到半個(gè)小時(shí)的語音數(shù)據(jù)中學(xué)習(xí)數(shù)百種獨(dú)特的聲音。論文鏈接
  • Deep Voice 3: 帶有卷積序列學(xué)習(xí)的尺度文本語音轉(zhuǎn)換,作者提出了一種全卷積字符到譜圖的框架,可以實(shí)現(xiàn)完全并行計(jì)算。該框架是基于注意力的序列到序列模型。這個(gè)模型在LibriSpeech ASR數(shù)據(jù)集上進(jìn)行訓(xùn)練。論文鏈接
  • Parallel WaveNet: 快速高保真語音合成,該模型來自谷歌,它引入了一種叫做概率密度蒸餾的方法,它從一個(gè)訓(xùn)練過的WaveNet中訓(xùn)練一個(gè)并行前饋網(wǎng)絡(luò)。該方法是通過結(jié)合逆自回歸流(IAFS)和波形網(wǎng)(WaveNet)的最佳特征構(gòu)建的。這些特征代表了WaveNet的有效訓(xùn)練和IAF網(wǎng)絡(luò)的有效采樣。論文鏈接
  • 利用小樣本的神經(jīng)網(wǎng)絡(luò)語音克隆,該模型來自百度,它引入了一個(gè)神經(jīng)語音克隆系統(tǒng),它可以通過學(xué)習(xí)從少量音頻樣本合成一個(gè)人的聲音。論文鏈接
  • VoiceLoop: 通過語音循環(huán)進(jìn)行語音擬合與合成,該論文來自Facebook,它引入了一種神經(jīng)文本到語音(TTS)技術(shù),可以將文本從野外采集的聲音轉(zhuǎn)換為語音。論文鏈接
  • 利用梅爾圖譜預(yù)測(cè)上的條件WaveNet進(jìn)行自然TTS合成,該論文來自谷歌和加州大學(xué)伯克利分校。他們引入了Tacotron 2,這是一種用于文本語音合成的神經(jīng)網(wǎng)絡(luò)架構(gòu)。它由一個(gè)循環(huán)的的序列到序列特征預(yù)測(cè)網(wǎng)絡(luò)組成,該網(wǎng)絡(luò)將字符嵌入到梅爾標(biāo)度圖譜中。然后是一個(gè)修改后的WaveNet模型,這個(gè)模型充當(dāng)聲碼器,利用頻譜圖來合成時(shí)域波。論文鏈接

Python的語音合成

用Python來進(jìn)行語音合成的方法有很多,這里通過比較幾個(gè)典型的開源庫和國內(nèi)語音平臺(tái)供同學(xué)們參考。由于谷歌的服務(wù)無法直接使用,故不在比較列表中,另外windows上特有的語音合成方法也不在范圍內(nèi)。

  1. 開源庫, pyttsx3pyttsx3

是一個(gè)開源的離線語音合成庫,只要用pip安裝后即可使用,安裝命令如下:

$ pip install pyttsx3

優(yōu)點(diǎn):免費(fèi),使用簡(jiǎn)單

缺點(diǎn):合成語音效果一般

2.科大訊飛科大訊飛提供豐富的發(fā)音類別來合成有特殊的語音,通過api接口進(jìn)行語音合成,并且可以對(duì)多音字、靜音停頓、數(shù)字、英文讀法等提供了控制標(biāo)記。

優(yōu)點(diǎn):語音合成效果較好,可以靈活控制多音字、靜音、英文等讀法。缺點(diǎn):免費(fèi)使用接口有500次的限制,在實(shí)際使用經(jīng)常不夠用。

3.騰訊

騰訊有多個(gè)平臺(tái)在提供語音合成接口,包括騰訊AI實(shí)驗(yàn)室、騰訊優(yōu)圖、騰訊云。其中騰訊AI開放平臺(tái)合成效果一般;騰訊優(yōu)圖目前免費(fèi)試用,且不限制請(qǐng)求次數(shù),但不保證QPS;騰訊云語音合成效果也不錯(cuò),合成免費(fèi)額度為每月100萬字符,相當(dāng)于一本《西游記》的字?jǐn)?shù)。每月1日重置免費(fèi)額度,一般情況下也夠用了。

優(yōu)點(diǎn):選擇多,其中騰訊優(yōu)圖和騰訊云語音合成效果較好

缺點(diǎn):無法控制多音字讀法、數(shù)字讀法、英文讀法和停頓

4.阿里云阿里云語音合成接口當(dāng)前改成了websocket請(qǐng)求方式,按次數(shù)進(jìn)行收費(fèi)。

優(yōu)點(diǎn):語音合成效果較好,語音模型豐富。

缺點(diǎn):正式產(chǎn)品使用的話還是要花錢。

5.百度

支持在線語音合成和離線語音合成。離線語音合成在個(gè)人認(rèn)證后只能在兩臺(tái)終端上使用,在線語音合成有QPS和有效期限制,詳情如下:

優(yōu)點(diǎn):合成語音效果還行,使用較為簡(jiǎn)單,開發(fā)測(cè)試的話免費(fèi)額度夠用了。

缺點(diǎn):正式產(chǎn)品使用的話還是要花錢。

實(shí)例開發(fā)

這里以騰訊云的語音合成為例實(shí)現(xiàn)一個(gè)簡(jiǎn)單的語音合成腳本。

  1. 登錄,登錄騰訊云官網(wǎng),若還未注冊(cè)的話先注冊(cè)一個(gè)賬號(hào)。
  2. 實(shí)名認(rèn)證,若未進(jìn)行過實(shí)名認(rèn)證,在騰訊云賬號(hào)中心進(jìn)行實(shí)名認(rèn)證。
  3. 開通語音合成服務(wù),進(jìn)入語音合成控制臺(tái)開通語音合成功能。

4.進(jìn)入密鑰管理界面,單擊新建密鑰,生成 SecretId 與 SecretKey,用于 API 調(diào)用時(shí)生成簽名。

5.用Python調(diào)用接口進(jìn)行語音合成,其中APP_ID、SECRET_ID、SECRET_KEY在上一步中獲得,代碼如下:


# coding=UTF-8

import requests

import wave

import json

import

import time

import collections

import urllib

import

import hmac

import hashlib

import uuid

import os

TCLOUD_APP_ID = XXXX

TCLOUD_SECRET_ID = "XXXX"

TCLOUD_SECRET_KEY = "XXXX"

OUTPUT_PATH = "./audio"

def generate_sign(request_data):

url = "tts.cloud.tencent.com/stream"

sign_str = "POST" + url + "?"

sort_dict = sorted(request_data.keys())

for key in sort_dict:

sign_str = sign_str + key + "=" + urllib.parse.unquote(str(request_data[key])) + '&'

sign_str = sign_str[:-1]

sign_bytes = sign_str.encode('utf-8')

key_bytes = TCLOUD_SECRET_KEY.encode('utf-8')

authorization = .b64encode(hmac.new(key_bytes, sign_bytes, hashlib.sha1).digest())

return authorization.decode('utf-8')

def text2wav(content):

request_data = {

"Action": "TextToStreamAudio",

"AppId": TCLOUD_APP_ID,

#返回音頻格式:Python SDK只支持pcm格式

#pcm:返回二進(jìn)制 pcm 音頻,使用簡(jiǎn)單,但數(shù)據(jù)量大。

"Codec": "pcm",

"Expired": int(time.time()) + 3600,

#模型類型,1:默認(rèn)模型

"ModelType": 1,

#主語言類型:

#1:中文(默認(rèn))

#2:英文

"PrimaryLanguage": 1,

#項(xiàng)目 ID,用戶自定義,默認(rèn)為0。

"ProjectId": 0,

#音頻采樣率:

#16000:16k(默認(rèn))

#8000:8k

"SampleRate": 16000,

"SecretId": TCLOUD_SECRET_ID,

"SessionId": str(uuid.uuid1()),

#語速,范圍:[-2,2],分別對(duì)應(yīng)不同語速:

#-2代表0.6倍

#-1代表0.8倍

#0代表1.0倍(默認(rèn))

#1代表1.2倍

#2代表1.5倍

#輸入除以上整數(shù)之外的其他參數(shù)不生效,按默認(rèn)值處理。

"Speed": 0,

"Text": content,

"Timestamp": int(time.time()),

#音色:

#0:親和女聲(默認(rèn))

#1:親和男聲

#2:成熟男聲

#3:活力男聲

#4:溫暖女聲

#5:情感女聲

#6:情感男聲

"VoiceType": 5,

#音量大小,范圍:[0,10],分別對(duì)應(yīng)11個(gè)等級(jí)的音量,默認(rèn)值為0,代表正常音量。沒有靜音選項(xiàng)。

"Volume": 5,

}

signature = generate_sign(request_data)

# print(f"signature: {signature}")

header = {

"Content-Type": "application/json",

"Authorization": signature

}

url = "https://tts.cloud.tencent.com/stream"

# print(request_data)

r = requests.post(url, headers=header, data=json.dumps(request_data), stream = True)

# print(r)

i = 1

t = int(time.time() * 1000)

output_file = os.path.join(OUTPUT_PATH, f"{t}.wav")

print(f"generate audio file: {output_file}")

wavfile = wave.open(output_file, 'wb')

wavfile.setparams((1, 2, 16000, 0, 'NONE', 'NONE'))

for chunk in r.iter_content(1000):

if (i == 1) & (str(chunk).find("Error") != -1) :

print(chunk)

return ""

i = i + 1

wavfile.writeframes(chunk)

wavfile.close()

return output_file

if __name__ == "__main__":

print(text2wav("你好"))


也可參考官方提供的SDK

參考資料:

https://zhuanlan.zhihu.com/p/82278135

https://pypi.org/project/pyttsx3/

https://www.xfyun.cn/services/online_tts

https://cloud.tencent.com/product/tts/getting-started


數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }