Realsense SR300语音文字转换

1.代码源自http://blog.csdn.net/zmdsjtu/article/details/53114690,特为感谢!

#include <Windows.h>  
#include <vector>  
#include "pxcspeechsynthesis.h"  
#include "pxcsession.h"  



class VoiceOut {
protected:

    enum { buffering = 3 };

    WAVEHDR             m_headers[buffering];
    PXCAudio::AudioData m_data[buffering];
    PXCAudio*           m_samples[buffering];

    // poor man's autogrowing bytestream  
    std::vector<byte>   m_wavefile;

    int         m_nsamples;
    HWAVEOUT m_hwo;

    WAVEFORMATEX m_wfx;

public:

    VoiceOut(PXCSpeechSynthesis::ProfileInfo *pinfo) {
        m_nsamples = 0;
        m_hwo = 0;

        memset(&m_wfx, 0, sizeof(m_wfx));
        m_wfx.wFormatTag = WAVE_FORMAT_PCM;
        m_wfx.nSamplesPerSec = pinfo->outputs.sampleRate;
        m_wfx.wBitsPerSample = 16;
        m_wfx.nChannels = pinfo->outputs.nchannels;
        m_wfx.nBlockAlign = (m_wfx.wBitsPerSample / 8)*m_wfx.nChannels;
        m_wfx.nAvgBytesPerSec = m_wfx.nBlockAlign*m_wfx.nSamplesPerSec;

        waveOutOpen(&m_hwo, WAVE_MAPPER, &m_wfx, 0, 0, CALLBACK_NULL);
    }

    void RenderAudio(PXCAudio *audio) {
        int k = (m_nsamples%buffering);
        if (m_nsamples++ >= buffering) {
            while (waveOutUnprepareHeader(m_hwo, &m_headers[k], sizeof(WAVEHDR)) == WAVERR_STILLPLAYING)
                Sleep(10);
            m_samples[k]->ReleaseAccess(&m_data[k]);
            m_samples[k]->Release();
        }
        audio->AddRef();
        m_samples[k] = audio;
        if (m_samples[k]->AcquireAccess(PXCAudio::ACCESS_READ, PXCAudio::AUDIO_FORMAT_PCM, &m_data[k]) >= PXC_STATUS_NO_ERROR) {
            memset(&m_headers[k], 0, sizeof(WAVEHDR));
            m_headers[k].dwBufferLength = m_data[k].dataSize * 2;
            m_headers[k].lpData = (LPSTR)m_data[k].dataPtr;
            waveOutPrepareHeader(m_hwo, &m_headers[k], sizeof(WAVEHDR));
            waveOutWrite(m_hwo, &m_headers[k], sizeof(WAVEHDR));
        }
    }




    ~VoiceOut(void) {
        if (!m_hwo || m_nsamples <= 0) return;
        for (int i = m_nsamples - buffering + 1; i<m_nsamples; i++) {
            if (i<0) i++; //If he have 1 AudioObject in m_samples 'k' will be -1.It is exeption for the alghorithm. Bug 57423  
            int k = (i%buffering);
            while (waveOutUnprepareHeader(m_hwo, &m_headers[k], sizeof(WAVEHDR)) == WAVERR_STILLPLAYING)
                Sleep(10);
            m_samples[k]->ReleaseAccess(&m_data[k]);
            m_samples[k]->Release();
        }
        waveOutClose(m_hwo);
    }
};



int main() {

    PXCSpeechSynthesis *tts = 0;
    PXCSession  *session = PXCSession::CreateInstance();
    session->CreateImpl<PXCSpeechSynthesis>(&tts);

    PXCSpeechSynthesis::ProfileInfo pinfo;
    tts->QueryProfile(0, &pinfo);
    pinfo.language = PXCSpeechSynthesis::LANGUAGE_CN_CHINESE;
    tts->SetProfile(&pinfo);

    // Synthesize the text string  
    tts->BuildSentence(1, L"终于成功了");

    // Retrieve the synthesized speech  
    int nbuffers = tts->QueryBufferNum(1);

    VoiceOut vo(&pinfo);

    for (int i = 0; i<nbuffers; i++) {
        PXCAudio *audio = tts->QueryBuffer(1, i);
        // send audio to the audio output device  
        vo.RenderAudio(audio);

    }

    // Clean up  
    tts->ReleaseSentence(1);
    system("pause");


}

目前不知什么情况未运行成功!(空指针)

2.利用微软语音api做的简单的TTS:
参考:
http://blog.csdn.net/lihn1987/article/details/65445938
http://blog.csdn.net/doraemon___/article/details/64158227

/*
Created by Jinhua Zhao,2017.09.15.
Contact:3210513029@qq.com
*/

#include <iostream>  
#include "sapi.h"

int main()
{
    ISpVoice *pVoice = nullptr;
    //Initial the COM interface.
    if (FAILED(::CoInitialize(NULL)))return -1;
    //Get the ISpVoice interface.
    HRESULT hr = CoCreateInstance(CLSID_SpVoice, nullptr, CLSCTX_ALL, IID_ISpVoice, reinterpret_cast<void **>(&pVoice));
    if (SUCCEEDED(hr))
    {
        pVoice->SetVolume((USHORT)100);
        pVoice->SetRate(0);
        hr = pVoice->Speak(L"C:/opencv/1.txt", SPF_IS_FILENAME, nullptr);
        pVoice->Release();
        pVoice = nullptr;
    }

    ::CoUninitialize();
    return TRUE;
}

3.调用微软语音识别:

/*
Created by Jinhua Zhao,2017.09.15.
Contact:3210513029@qq.com
*/

#include <Windows.h>
#include <sapi.h>
#include <iostream>
#include <atlbase.h>
#include <sphelper.h>
#include <string>

inline HRESULT BlockForResult(ISpRecoContext* pRecoCtxt, ISpRecoResult** ppResult)
{
    HRESULT hr = S_OK;
    CSpEvent event;

    while (SUCCEEDED(hr)&&SUCCEEDED(hr=event.GetFrom(pRecoCtxt))&&hr==S_FALSE)
    {
        hr = pRecoCtxt->WaitForNotifyEvent(INFINITE);
    }
    *ppResult = event.RecoResult();
    if (*ppResult)
    {
        (*ppResult)->AddRef();
    }
    return hr;
}


int main()
{
    HRESULT hr = E_FAIL;
    bool fUseTTS = true;//Turn TTS playback on or off.
    bool fReplay = true;//Turn audio replay on or off.

    if (SUCCEEDED(hr = ::CoInitialize(NULL)))
    {
        {
            CComPtr<ISpRecoContext> cpRecoCtxt;
            CComPtr<ISpRecoGrammar> cpGrammar;
            CComPtr<ISpVoice> cpVoice;
            hr = cpRecoCtxt.CoCreateInstance(CLSID_SpSharedRecoContext);

            if (SUCCEEDED(hr)){hr = cpRecoCtxt->GetVoice(&cpVoice);}

            hr = cpRecoCtxt->SetNotifyWin32Event();
            hr = cpRecoCtxt->SetInterest(SPFEI(SPEI_RECOGNITION), SPFEI(SPEI_RECOGNITION));
            hr = cpRecoCtxt->SetAudioOptions(SPAO_RETAIN_AUDIO, NULL, NULL);
            hr = cpRecoCtxt->CreateGrammar(0, &cpGrammar);
            hr = cpGrammar->LoadDictation(NULL, SPLO_STATIC);
            hr = cpGrammar->SetDictationState(SPRS_ACTIVE);
            if (cpRecoCtxt&&cpVoice)
            {
                USES_CONVERSION;

                CComPtr<ISpRecoResult> cpResult;
                std::cout << "Please speak!" << std::endl;
                while (SUCCEEDED(hr=BlockForResult(cpRecoCtxt,&cpResult)))
                {
                    cpGrammar->SetDictationState(SPRS_INACTIVE);
                    CSpDynamicString dstrText;
                    if (SUCCEEDED(cpResult->GetText(SP_GETWHOLEPHRASE,SP_GETWHOLEPHRASE,TRUE,&dstrText,nullptr)))
                    {
                        std:: cout << "I heard:" << W2A(dstrText) << std::endl;
                        if (fUseTTS)
                        {
                            cpVoice->Speak(L"I heard:", SPF_ASYNC, nullptr);
                            cpVoice->Speak(dstrText, SPF_ASYNC, nullptr);
                        }

                        if (fReplay)
                        {
                            if (fUseTTS)
                                cpVoice->Speak(L"when you said", SPF_ASYNC, nullptr);
                            else
                                std::cout << "when you said" << std::endl;
                            cpResult->SpeakAudio(NULL, 0, NULL, NULL);
                        }
                        cpResult.Release();
                    }
                    cpGrammar->SetDictationState(SPRS_ACTIVE);
                }
            }
        }
        ::CoUninitialize();
    }
    return hr;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容