科大訊飛屬于第三方服務,但是支持的語言里面沒有python,所以我們在這種情況下還想使用它的功能的話,可以通過調用C語言的包,來間接的使用。
代碼貼上來:
def text_to_voice(text):
"""
科大訊飛離線語音合成
:param text: 轉換文本
開發(fā)API文檔:http://mscdoc.xfyun.cn/windows/api/iFlytekMSCReferenceManual/files.html
API調用流程:https://doc.xfyun.cn/msc_windows/%E8%AF%AD%E9%9F%B3%E5%90%88%E6%88%90.html
LoadLibrary: 將指定的模塊加載到調用進程的地址空間中(C++)
MSPLogin: 初始化msc,用戶登錄
QTTSSessionBegin: 開始一次語音合成,分配語音合成資源
QTTSTextPut: 寫入要合成的文本
QTTSAudioGet: 獲取合成音頻
QTTSSessionEnd: 結束本次語音合成
MSPLogout: 退出登錄
:return:
"""
try:
# 此方法引用:windows/ubuntu/centos三種環(huán)境均測試過,可以調用
from ctypes import cdll, c_int, byref, string_at
except Exception as e:
return e
try:
# 該配置文件需要放到python安裝目錄下,否則會報錯(如果不在該目錄,則需要單獨配置環(huán)境變量)
msc_load_library = config.get_MSC_LOAD_LIBRARY() # 這里的config是增加了另一層封裝,沒有粘出代碼來,下面的代碼會配上配置文件中的格式,只要對應的把配置文件中的內(nèi)容替換到這里就可以了。
app_id = config.get_APP_ID()
work_dir = config.get_WORK_DIR()
voice_name = config.get_VOICE_NAME()
login_tts_res_path = config.get_LOGIN_TTS_RES_PATH()
session_tts_res_path = config.get_SESSION_TTS_RES_PATH()
except Exception as e:
return e
frame_rate = 8000 # 頻率
MSP_SUCCESS = 0
MSP_TTS_FLAG_STILL_HAVE_DATA = 1
MSP_TTS_FLAG_DATA_END = 2 # 結束標識
MSP_TTS_FLAG_CMD_CANCELED = 4
login_params = "appid=%s, engine_start=tts, tts_res_path=%s, work_dir=%s" % (app_id, login_tts_res_path, work_dir)
session_begin_params = b"engine_type=local, voice_name=%s, text_encoding=utf8, tts_res_path=%s, sample_rate=8000, speed=80, volume=50, pitch=50, rdn=2, effect=0, speed_increase=1, rcn=1" % ( voice_name, session_tts_res_path)
dll = cdll.LoadLibrary(msc_load_library)
ret = dll.MSPLogin(None, None, login_params)
# print ret
errorCode, audio_len, synth_status, getret = c_int(), c_int(), c_int(), c_int()
sessionID = dll.QTTSSessionBegin(session_begin_params, byref(errorCode))
# print sessionID
# text_s = text.encode()
text_s = text # 測試代碼
string = text_s.replace("(", "(").replace(")", ")")
string = string.replace("[", "【").replace("]", "】")
ret = dll.QTTSTextPut(sessionID, ctypes.c_char_p(string), len(string), None)
# print ret
# 1、打開WAV文檔
wavFile = wave.open(r"tts_voice.wav", "wb")
# 2、配置聲道數(shù)、量化位數(shù)和取樣頻率
wavFile.setnchannels(1)
wavFile.setsampwidth(2)
wavFile.setframerate(frame_rate)
start_time = get_this_time()
while True:
end_time = get_this_time()
print (end_time - start_time).seconds
pdata = dll.QTTSAudioGet(sessionID, byref(audio_len),
byref(synth_status), byref(getret))
# print getret.value
if getret.value != MSP_SUCCESS:
break
if pdata:
data = string_at(pdata, audio_len.value)
# 3、將wav_data轉換為二進制數(shù)據(jù)寫入文件
wavFile.writeframes(data)
if synth_status.value == MSP_TTS_FLAG_DATA_END:
break
time.sleep(0.1) # 這里為官方建議,可以去除不使用,避免轉換時間過長
# 4、關閉文件
wavFile.close()
ret = dll.QTTSSessionEnd(sessionID, "Normal")
dll.MSPLogout()
下面是配置的文件,是上文中的config調用config.ini文件
[XUN_FEI_TEXT_TO_VOICE]
MSC_LOAD_LIBRARY = E:/python2.7/Windows_aisound_exp1226_5cf60162/bin/msc_x64.dll
APP_ID = 5cf60162 # 這個是需要到科大訊飛的web端申請的一串id,一個用戶有三臺免費裝機量
WORK_DIR = E:/python2.7/Windows_aisound_exp1226_5cf60162/include
; 需要使用\\否則會提示錯誤碼:10102,找不到離線資源文件
LOGIN_TTS_RES_PATH = fo|E:\\python2.7\\Windows_aisound_exp1226_5cf60162\\bin\\msc\\res\\tts\\xiaoyan.jet
SESSION_TTS_RES_PATH = fo|E:\\python2.7\\Windows_aisound_exp1226_5cf60162\\bin\\msc\\res\\tts\\xiaoyan.jet;fo|E:\\python2.7\\Windows_aisound_exp1226_5cf60162\\bin\\msc\\res\\tts\\common.jet
這個目錄Windows_aisound_exp1226_5cf60162需要到官網(wǎng)上面下載到本地,然后放到python環(huán)境下,我這邊使用的是python2.7環(huán)境
當我們生成語音文件以后,想要測試語音是否正確的時候,使用下圖這個軟件,比較專業(yè)!!!
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
