科大讯飞tts

#include <windows.h>
#include<iostream>
#include "XAudio2.h"
#include "qtts.h"
#include "msp_cmn.h"
#include "msp_errors.h"
#include <string>
using namespace std;
#pragma comment(lib,"xaudio2.lib")

int text_to_speech(const char* src_text)
{
    const char* params = "voice_name = xiaoyan, text_encoding = gb2312, sample_rate = 16000, speed = 50, volume = 50, pitch = 50, rdn = 2";
    MSPLogin(NULL, NULL, "appid = 59c066c4, work_dir = .");

    int ret = -1;
    int  synth_status = MSP_TTS_FLAG_STILL_HAVE_DATA;

    unsigned int audio_len = 0;
    unsigned int speech_len = 0;

    const char*sessionID = QTTSSessionBegin(params, &ret);
    const void* audio_data = NULL;
    char* synth_speech = new char[2 * 1024 * 1024];

    ret = QTTSTextPut(sessionID, src_text, (unsigned int)strlen(src_text), NULL);

    IXAudio2 *pEngine = NULL;
    IXAudio2MasteringVoice *pMasterVoice = NULL;
    IXAudio2SourceVoice *pSourceVoice = NULL;

    WAVEFORMATEX waveFormat = { 1,1,16000,32000,2,16,0 };//获取文件格式

    if (FAILED(CoInitializeEx(NULL, COINIT_MULTITHREADED)))exit(0);
    if (FAILED(XAudio2Create(&pEngine)))exit(0);
    if (FAILED(pEngine->CreateMasteringVoice(&pMasterVoice)))exit(0);
    if (FAILED(pEngine->CreateSourceVoice(&pSourceVoice, &waveFormat)))exit(0);

    while (MSP_TTS_FLAG_DATA_END != synth_status)
    {
        audio_data = QTTSAudioGet(sessionID, &audio_len, &synth_status, &ret);
        if (ret) break;
        if (NULL != audio_data && 0 != audio_len)
        {
            memcpy(synth_speech + speech_len, audio_data, audio_len);
            speech_len += audio_len;
        }
    }
    BYTE *pData = new BYTE[speech_len];//申请内存空间,用于保存数据
    pData = (BYTE*)synth_speech;

    XAUDIO2_BUFFER buffer = { 0 };//将读取的文件数据,赋值XAUDIO2_BUFFER
    buffer.AudioBytes = speech_len;
    buffer.pAudioData = pData;
    buffer.Flags = XAUDIO2_END_OF_STREAM;
    pSourceVoice->SubmitSourceBuffer(&buffer);//提交内存数据
    pSourceVoice->Start(0);//启动源声音
    XAUDIO2_VOICE_STATE state;
    pSourceVoice->GetState(&state, XAUDIO2_VOICE_NOSAMPLESPLAYED);//获取状态
    while (state.BuffersQueued)
    {
        pSourceVoice->GetState(&state);
    }
    pMasterVoice->DestroyVoice();//释放资源
    pSourceVoice->DestroyVoice();//释放资源
    pEngine->Release();//释放资源
    CoUninitialize();//释放资源
    cout << pData;
    delete[] pData;//释放资源
    pData = NULL;
    MSPLogout(); //退出登录
    return 0;
}

void tts(std::string stringall)
{
    while (1)
    {
        int x = stringall.find_first_of("/");
        if (x <= 0) break;
        std::string str_temp = stringall.substr(0, x);
        cout << "o_O:" << str_temp << endl;
        text_to_speech(str_temp.c_str());
        std::string str_others = stringall.substr(str_temp.length() + 1);
        stringall = str_others;
    }
}

int main()
{
    std::string text = "据银陀诊断您属于乳腺炎,阴虚血瘀症。/乳腺疾病是女性常见病,乳房肿块是乳腺疾病的首发或主要临床表现。/乳房疾病是由人体气血、津液、经络腑脏功能失调而引起。/日常生活中应该摄入均衡的营养,不要暴饮暴食和偏食,要注意适当地运动。养成良好习惯和有规律的生活节奏,/保持稳定情绪;有助于调节内分泌。促进乳房健康!/"; //合成文本
    tts(text);
    return 0;
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容