天天看點

科大訊飛 離線語音識别python_使用python語言調用科大訊飛離線語音合成

科大訊飛屬于第三方服務,但是支援的語言裡面沒有python,是以我們在這種情況下還想使用它的功能的話,可以通過調用C語言的包,來間接的使用。

代碼貼上來:

def text_to_voice(text):

"""

科大訊飛離線語音合成

:param text: 轉換文本

開發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三種環境均測試過,可以調用

from ctypes import cdll, c_int, byref, string_at

except Exception as e:

return e

try:

# 該配置檔案需要放到python安裝目錄下,否則會報錯(如果不在該目錄,則需要單獨配置環境變量)

msc_load_library = config.get_MSC_LOAD_LIBRARY() # 這裡的config是增加了另一層封裝,沒有粘出代碼來,下面的代碼會配上配置檔案中的格式,隻要對應的把配置檔案中的内容替換到這裡就可以了。

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、配置聲道數、量化位數和取樣頻率

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轉換為二進制資料寫入檔案

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需要到官網上面下載下傳到本地,然後放到python環境下,我這邊使用的是python2.7環境

當我們生成語音檔案以後,想要測試語音是否正确的時候,使用下圖這個軟體,比較專業!!!

科大訊飛 離線語音識别python_使用python語言調用科大訊飛離線語音合成