科大讯飞属于第三方服务,但是支持的语言里面没有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环境

不断的更新使文章更严谨,有同学问了Linux版本,所以我更新在这里:划重点----------------------------------------------------

python离线语音识别api 离线语音合成python_python

python离线语音识别api 离线语音合成python_python离线语音识别api_02

这是我下载了官网上Linux的包,在这个目录里面找到了这个语音sdk

python离线语音识别api 离线语音合成python_语音合成_03

----------------------------------------------------分割线----------------------------------------------------

当我们生成语音文件以后,想要测试语音是否正确的时候,使用下图这个软件,比较专业!!!

python离线语音识别api 离线语音合成python_Windows_04