Qt 에서 MS Speech SDK 5.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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
OpenCV && AKAZE && Windows10 && VisualStudio2017작동하는 버전의 조합을 찾고 ... OpenCV에서 AKAZE로 이미지 간의 특징점을 일치시키고 싶다면, OS(Windows10 64bit)와 OpenCV 버전과 Visual Studio 버전의 조합을 찾는데 힘들었...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.