Hello World by Microsoft Speech SDK 5.1

简介: 刚刚从 Microsoft 网站下栽了 Speech SDK 5.1 和中日文发声补丁,参考 Speech SDK 文档写了几个小程序,尽管我也是刚刚接触 Speech 若干小时的初学者,还是拿出来共享吧:   ...

刚刚从 Microsoft 网站下栽了 Speech SDK 5.1 和中日文发声补丁,参考 Speech SDK 文档写了几个小程序,尽管我也是刚刚接触 Speech 若干小时的初学者,还是拿出来共享吧:

 

Speech SDK 采用 COM 的形式封装,和大多数 COM 对象一样,下面是一个似曾相识的初始化:

 

CoInitialize(NULL);

 

CLSIDFromProgID(L"SAPI.SpVoice", &CLSID_SpVoice);

 

ISpVoice * pSpVoice = NULL;

 

if (FAILED(CoCreateInstance(CLSID_SpVoice, NULL,

CLSCTX_INPROC_SERVER, IID_ISpVoice, (void **)&pSpVoice)))

{

cout << "Failed to create instance of ISpVoice!" << endl;

return -1;

}

 

现在我们用它来说 “Hello World” ,非常简单:

 

pSpVoice->Speak(L"Hello World!", SPF_DEFAULT, NULL);

 

最后,清除这一切

 

pSpVoice->Release();

 

CoUninitialize();

 

很容易,是不是?下面我们稍微改变一下:

 

IEnumSpObjectTokens *pSpEnumTokens = NULL;

 

if (SUCCEEDED(SpEnumTokens(SPCAT_VOICES, L"language=409", NULL, &pSpEnumTokens)))

{

ISpObjectToken *pSpToken = NULL;

 

while (SUCCEEDED(pSpEnumTokens->Next(1, &pSpToken, NULL)) &&

pSpToken != NULL)

{

pSpVoice->SetVoice(pSpToken);

pSpVoice->Speak(L"Hello World!", SPF_DEFAULT, NULL);

 

pSpToken->Release();

}

 

pSpEnumTokens->Release();

}

 

如果只需要一种 Voice SpFindBestToken 更加方便:

 

ISpObjectToken * pSpObjectToken = NULL;

 

if (SUCCEEDED(SpFindBestToken(SPCAT_VOICES, L"gender=female",

NULL, &pSpObjectToken)))

{

pSpVoice->SetVoice(pSpObjectToken);

 

pSpVoice->Speak(L"Hello World!", SPF_DEFAULT, NULL);

 

pSpObjectToken->Release();

}

 

现在改为使用中文:

 

ISpObjectToken * pSpObjectToken = NULL;

 

if (SUCCEEDED(SpFindBestToken(SPCAT_VOICES, L"language=804",

NULL, &pSpObjectToken)))

{

pSpVoice->SetVoice(pSpObjectToken);

 

pSpVoice->Speak(L" 世界你好! ", SPF_DEFAULT, NULL);

 

pSpObjectToken->Release();

}

 

ISpVoice::Speak 可以允许朗读的句子中包含 XML 标记,其实以上这一切用 XML 标记将变得十分简单:

 

pSpVoice->Speak(L"<lang langid=\"804\"> 世界你好! </lang>", SPF_DEFAULT, NULL);

 

pSpVoice->Speak(L"<voice required=\"gender=female\">Hello World!</voice>",

SPF_DEFAULT, NULL);


最后,以一段简单的报时结束这篇文章:

 

SYSTEMTIME st;


GetLocalTime(&st);

 

ISpObjectToken * pSpObjectToken = NULL;

 

if (SUCCEEDED(SpFindBestToken(SPCAT_VOICES, L"language=804", NULL,

&pSpObjectToken)))

{

pSpVoice->SetVoice(pSpObjectToken);

 

WCHAR wsz[128];

 

swprintf(wsz,

L" 现在是 <context ID = \"CHS_Date_ymdhm\">%.4d-%.02d-%.2d %.2d:%.02d</context>",

st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute);

 

pSpVoice->Speak(wsz, SPF_IS_XML, NULL);

 

pSpObjectToken->Release();

}

 

点到为止,希望这篇文章能带给初学者一点启发。

 

目录
相关文章
|
开发工具
【Azure 环境】使用Microsoft Graph PS SDK 登录到中国区Azure, 命令Connect-MgGraph -Environment China xxxxxxxxx 遇见登录错误
【Azure 环境】使用Microsoft Graph PS SDK 登录到中国区Azure, 命令Connect-MgGraph -Environment China xxxxxxxxx 遇见登录错误
366 0
|
机器人 语音技术 开发工具
智能电话机器人,使用Microsoft语音识别技术(Speech sdk)
智能电话机器人,使用Microsoft语音识别技术(Speech sdk)
345 0
智能电话机器人,使用Microsoft语音识别技术(Speech sdk)
|
5月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
676 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
819 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
515 0
|
程序员 开发工具 Android开发
Android|使用阿里云推流 SDK 实现双路推流不同画面
本文记录了一种使用没有原生支持多路推流的阿里云推流 Android SDK,实现同时推送两路不同画面的流的方法。
331 7
|
Java Linux API
Android SDK
【10月更文挑战第21天】
446 1
|
开发工具 Android开发
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
1435 4
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
|
Dart 开发工具 Android开发
Android Studio导入Flutter项目提示Dart SDK is not configured
Android Studio导入Flutter项目提示Dart SDK is not configured
1955 4