#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);
}
- 1
- 2
- 3
- 4
- 5
前往页