起因
近日,,一個(gè)朋友給了我一張神奇的二維碼: 我掃了一下,進(jìn)入了這個(gè)鏈接: https://tts.baidu.com/text2audio?tex=%E4%BD%A0%E5%A5%BD%E4%B8%96%E7%95%8C%EF%BC%81&cuid=baike&lan=ZH&ie=utf-8&ctp=1&pdt=301&vol=9&rate=32&per=0 頁(yè)面里就是一個(gè)mp3文件: 自動(dòng)播放了一個(gè)“你好世界”的語(yǔ)音
看到tts.baidu.com 這種奇怪的字眼和熟悉的URL編碼,,我本能地去把編碼解碼出來(lái),,不用說(shuō)你們也知道,解碼結(jié)果就是你好世界,! 那么,,一切基本就真相大白了:
https://tts.baidu.com/text2audio 使用URL的參數(shù)來(lái)進(jìn)行文本轉(zhuǎn)語(yǔ)音,返回mp3文件,。
經(jīng)過(guò)
再經(jīng)過(guò)一段時(shí)間的摸索,,我基本找到了參數(shù)的規(guī)律:
tex 參數(shù):要轉(zhuǎn)為語(yǔ)音的文本內(nèi)容spd 參數(shù):朗讀速度,取值范圍 [1,9]lan 參數(shù):語(yǔ)言碼,,取值及其含義如下表:
語(yǔ)言碼 | 含義 |
---|
ZH | 普通話 | EN | 美式英語(yǔ) | UK | 英式英語(yǔ) | CTE | 粵語(yǔ) |
per 參數(shù):音色碼,,取值及其實(shí)際音色如下表(只有普通話有音色碼,其他語(yǔ)音只有一種標(biāo)準(zhǔn)音音色,,標(biāo)準(zhǔn)音音色的音色碼可以設(shè)為0):
音色碼 | 實(shí)際音色 |
---|
0 | 標(biāo)準(zhǔn)女音 | 1 | 標(biāo)準(zhǔn)男音 | 3 | 斯文男音 | 4 | 小萌萌 | 5 | 知性女音 | 6 | 老教授 | 8 | 葛平音 | 9 | 播音員 | 10 | 京腔 | 11 | 溫柔大叔 |
使用表格以外的音色碼或語(yǔ)言碼可能會(huì)報(bào)錯(cuò)
其他參數(shù)作用未知,,暫時(shí)設(shè)定朋友給的二維碼里的值
這些音色碼的“實(shí)際音色”其實(shí)都是我自己靠耳朵聽(tīng)出來(lái),,自己給那個(gè)音色起的名字。,。,。
希望有大神可以找出剩下參數(shù)的作用或是更多的音色碼/語(yǔ)言碼
代碼
于是,我使用Python的requests庫(kù)寫了一個(gè)方便調(diào)用百度TTS語(yǔ)音功能的程序:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
#import os
def TTS(text, speed, lan, per):
"""普通話-音色:
標(biāo)準(zhǔn)女音
標(biāo)準(zhǔn)男音
斯文男音
小萌萌
知性女音
老教授
葛平音
播音員
京腔
溫柔大叔
英式英語(yǔ)-音色:
標(biāo)準(zhǔn)音
美式英語(yǔ)-音色:
標(biāo)準(zhǔn)音
粵語(yǔ)-音色:
標(biāo)準(zhǔn)音
"""
convertTable = { #建立易讀文本和音色碼/語(yǔ)言碼的關(guān)系表
'中文': ('ZH', {
'標(biāo)準(zhǔn)女音': 0,
'標(biāo)準(zhǔn)男音': 1,
'斯文男音': 3,
'小萌萌': 4,
'知性女音': 5,
'老教授': 6,
'葛平音': 8,
'播音員': 9,
'京腔': 10,
'溫柔大叔': 11
}),
'英式英語(yǔ)': ('UK', {
'標(biāo)準(zhǔn)音': 0
}),
'美式英語(yǔ)': ('EN', {
'標(biāo)準(zhǔn)音': 0
}),
'粵語(yǔ)': ('CTE', {
'標(biāo)準(zhǔn)音': 0
})
}
data = {
'tex': text,
'spd': speed,
'lan': convertTable[lan][0],
'per': convertTable[lan][1][per],
'ctp': 1,
'cuid': 'baike',
'ie': 'UTF-8',
'pdt': 301,
'vol': 9,
'rate': 32
}
result = requests.get('https://tts.baidu.com/text2audio', params=data)
try:
result.json()
except:
return result.content
else:
raise ValueError
if __name__ == '__main__':
try:
bindata = TTS('''測(cè)試一下,,你好世界,!''', 5, '中文', '小萌萌')
except:
print('Error')
else:
with open('result.mp3', 'wb+') as f:
f.write(bindata) #在同級(jí)目錄寫入為mp3文件
#os.startfile('result.mp3') #自動(dòng)運(yùn)行生成的mp3
|