Qt 에서 MS Speech SDK 5.1 을 이용 하여 텍스트 낭독 실현

6628 단어 QtC++
1. 우선 자신의 환경 설정 을 말 하고 이 코드 가 모든 설정 에 적용 되 는 지 확인 하지 않 습 니 다.
운영 체제: windows xp sp3
컴 파일 환경: Qt SDK 1.2.1, MSVC 2008 컴 파일
Microsoft Speech SDK 를 이용 한 이상 먼저 설치 해 야 합 니 다. 다운로드 주 소 는 다음 과 같 습 니 다.
http://www.microsoft.com/en-us/download/details.aspx?id=10121
그림 의 빨간색 상자 안의 두 부분 을 다운로드 하고 다운로드 가 완 료 된 후에 먼저 SpeechSDK 51. exe 를 설치 한 다음 에 SpeechSDK 51 LangPack. exe 를 설치 합 니 다.
기본 설치 경로 에 따라 설치 하고 코드 에 경 로 를 사용 해 야 합 니 다.
코드 에 sphlper. h 헤더 파일 을 사 용 했 기 때문에 컴 파일 할 때 오류 가 발생 할 수 있 습 니 다. 해결 방법 은 다음 링크 를 참고 하 십시오.
http://blog.csdn.net/wangyangtao/article/details/5933734
2. MS Speech SDK 5.1 API 호출 은 speech 클래스 에 봉 인 된 다음 에 이 클래스 가 제공 하 는 인 터 페 이 스 를 호출 하여 텍스트 낭독 을 실현 합 니 다.
     다음은 speech 류 를 어떻게 실현 하 는 지 에 중점 을 두 고 소개 한다.쓸데없는 말 은 그만 하고 코드 를 바로 붙 여 라.
우선 프로 파일 에 다음 코드 를 추가 합 니 다
    INCLUDEPATH += -L"C:/Program Files/Microsoft Speech SDK 5.1/Include"

    LIBS += -L"C:/Program Files/Microsoft Speech SDK 5.1/Lib/i386"

다음은 헤더 파일 speechClass. h 입 니 다.
#ifndef SPEECHCLASS_H
#define SPEECHCLASS_H

#undef UNICODE
#include 
#include 
#include 
#define UNICODE

#include 
#include 
#include 

#include 

class speech{

public:
    speech();
    ~speech();
    void speak(QString text);
    void setVolume(int volume);
    void setRate(int rate);
    void pause();
    void resume();
    void finish();
    int  getVolume();
    int  getRate();

private:
    void sounding(QString s, int voice);
    void speak(QString s, int mode);
    HRESULT                   hr;
    CComPtr   pToken;
    CComPtr         pVoice;
    WCHAR *pChnToken;
    WCHAR *pEngToken;
    bool   over;

};

#endif // SPEECHCLASS_H

다음은 원본 파일 speechClass. cpp 입 니 다.
#include "speechClass.h"

#define Eng 0x00
#define Chn 0x01

//    
speech::speech()
{
    hr        = S_OK;
    WCHAR *w1 = L"HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Speech\\Voices\\Tokens\\MSSimplifiedChineseVoice";
    WCHAR *w2 = L"HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Speech\\Voices\\Tokens\\MSMike";
    pChnToken = w1;
    pEngToken = w2;

    if (SUCCEEDED(hr))
        hr = pVoice.CoCreateInstance( CLSID_SpVoice );

    over = true;
}

speech::~speech()
{
    pChnToken = NULL;
    pEngToken = NULL;
}


/**********************************************************************/
//   text     ,       
/**********************************************************************/
void speech::speak(QString text)
{
    QChar curr;
    QString str;
    int flagCur;
    int flagPre(Chn);
    int cnt(0);
    int first(0);
    int len = text.length();

    for (int i = 0; i < len; ++i)
    {
        curr = text.at(i);//   i      
        if ((curr >= 32 & curr <= 47) || (curr >= 58 && curr <= 64))
            flagCur = flagPre; //           ,    
        else
        {
            if ((curr >= 'A' && curr <= 'Z') || (curr>='a' && curr<='z'))
                flagCur = Eng;
            else
                flagCur = Chn;
        }
        if (flagCur == flagPre)
            cnt++;
        else
        {
            if (cnt != 0) //      ,       
            {
                str = text.mid(first, cnt);
                sounding(str, flagPre);
            }
            flagPre = flagCur;
            first = i;
            cnt  = 1;
        }
    }
    //        
    str = text.mid(first, cnt);
    sounding(str, flagCur);
}



/**********************************************************************/
//   s   , voice = Eng,    ,  voice = Chn,    
/**********************************************************************/
void speech::sounding(QString s, int voice)
{
    // s   WCHAR      
    WCHAR *w;
    w = new WCHAR[s.length()+1];
    s.toWCharArray(w);
    w[s.length()] = 0;

    //  voice        ,    or   
    if (SUCCEEDED(hr))
    {
        if (voice == Eng)
            hr = SpGetTokenFromId(pEngToken, &pToken);
        else if (voice == Chn)
            hr = SpGetTokenFromId(pChnToken, &pToken);
    }
    if (SUCCEEDED(hr))
        hr = pVoice->SetVoice(pToken);
    //  
    if(SUCCEEDED(hr))
        hr = pVoice->Speak(w, SPF_DEFAULT | SVSFlagsAsync, NULL);
    //    
    pToken.Release();
    delete w;
}

/**********************************************************************/
//          
/**********************************************************************/
int speech::getVolume()
{
    USHORT v;
    if(SUCCEEDED(hr))
        hr = pVoice->GetVolume(&v);

    return (int)v;
}

/**********************************************************************/
//          
/**********************************************************************/
int speech::getRate()
{
    long r;
    if (SUCCEEDED(hr))
        hr = pVoice->GetRate(&r);

    return (int)r;
}

/**********************************************************************/
//      ,   volume
/**********************************************************************/
void speech::setVolume(int volume)
{
    if(SUCCEEDED(hr))
        hr = pVoice->SetVolume((USHORT)volume);
}

/**********************************************************************/
//      ,   rate
/**********************************************************************/
void speech::setRate(int rate)
{
    if(SUCCEEDED(hr))
        hr = pVoice->SetRate((long)rate);
}

/**********************************************************************/
//      
/**********************************************************************/
void speech::pause()
{
    over = false;
    if (SUCCEEDED(hr))
        hr = pVoice->Pause();
}

/**********************************************************************/
//      
/**********************************************************************/
void speech::resume()
{
    over = true;
    if (SUCCEEDED(hr))
        hr = pVoice->Resume();
}

/**********************************************************************/
//      
/**********************************************************************/
void speech::finish()
{
    over = true;
    if (SUCCEEDED(hr))
        hr = pVoice->Speak(NULL, SPF_PURGEBEFORESPEAK, 0);
}

이 speech 류 를 이용 하여 작은 예 를 만 들 었 습 니 다. 이 작은 예 를 통 해 Qt 에서 speech 류 를 어떻게 사용 하 는 지 설명 합 니 다.
다운로드 주소:http://download.csdn.net/detail/qin_lin_sb/4462802

좋은 웹페이지 즐겨찾기