VCpp使用Microsoft Speech SDK进行文字TTS朗读

⌚Time: 2023-08-30 18:15:58

👨‍💻Author: Jack Ge

Microsoft Speech SDK下载地址

https://www.microsoft.com/en-us/download/details.aspx?id=10121

需要msttss22L.exe、SpeechSDK51.exe、SpeechSDK51LangPack.exe三个,下载后全部安装

使用VS2005建立一个win32控制台项目

朗读"hello word"、中文“你好”的程序


#include <sphelper.h>//语音头文件

#include <stdio.h>



int main(int argc, char* argv[])

{

    ISpVoice * pSpVoice = NULL;//初始化语音变量



    ::CoInitialize(NULL);//初始化语音环境



    //给语音变量创建环境,相当于创建语音变量,FAILED是个宏定义,就是来判断CoCreateInstance这个函数又没有成功创建语音变量,下面是不成功的提示信息。

    if (FAILED(CoCreateInstance(CLSID_SpVoice, NULL,CLSCTX_INPROC_SERVER, IID_ISpVoice, (void **)&pSpVoice)))

    {

        printf("Failed to create instance of ISpVoice! "); 

        return -1;

    }



    pSpVoice->Speak(L"Hello World!你好!", SPF_DEFAULT, NULL);//执行语音变量的Speek函数,这个函数用来读文字。

    

    pSpVoice->Release(); //释放语音变量

    ::CoUninitialize();//释放语音环境



    getchar();

    return 0;

}


点击项目,属性,配置属性,c/c++。设置附加包含目录,就是sdk安装目录下的include文件夹

链接器,常规,附加库目录就是sdk的lib\i386文件夹

链接器,输入,附加依赖项,添加sapi.lib

使用vs2005编译链接,会出现报错


1>c:\program files (x86)\microsoft speech sdk 5.1\include\sphelper.h(769) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

1>c:\program files (x86)\microsoft speech sdk 5.1\include\sphelper.h(1419) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

1>c:\program files (x86)\microsoft speech sdk 5.1\include\sphelper.h(2373) : error C2065: “psz”: 未声明的标识符

1>c:\program files (x86)\microsoft speech sdk 5.1\include\sphelper.h(2559) : error C2440: “初始化”: 无法从“CSpDynamicString”转换为“SPPHONEID *”

1>        没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符

1>c:\program files (x86)\microsoft speech sdk 5.1\include\sphelper.h(2633) : error C2664: “wcslen”: 不能将参数 1 从“SPPHONEID *”转换为“const wchar_t *”

SAPI 包含sphelper.h编译错误解决方案, 在使用Microsoft Speech SDK 5.1开发语音识别程序时,包含了头文件“sphelper.h”和库文件“sapi.lib”

对sphelper.h的修改:

Line 769


const ulLenVendorPreferred = wcslen(pszVendorPreferred);

修改为:

const unsigned long ulLenVendorPreferred = wcslen(pszVendorPreferred);

Line 1418


static CoMemCopyWFEX(const WAVEFORMATEX * pSrc, WAVEFORMATEX ** ppCoMemWFEX)



修改为:

static HRESULT CoMemCopyWFEX(const WAVEFORMATEX * pSrc, WAVEFORMATEX ** ppCoMemWFEX)

Line 2372


for (const WCHAR * psz = (const WCHAR *)lParam; *psz; psz++) {}



修改为:

const WCHAR * psz; for (psz = (const WCHAR *)lParam; *psz; psz++) {}

Line 2559


SPPHONEID* pphoneId = dsPhoneId;



修改为:

SPPHONEID* pphoneId = (SPPHONEID*)((WCHAR *)dsPhoneId);

Line 2633


pphoneId += wcslen(pphoneId) + 1;



修改为:

pphoneId += wcslen((const wchar_t *)pphoneId) + 1;

之后编译通过,运行会朗读文本

Microsoft Speech SDK不仅支持Text to Speech(TTS)文字转语音,还支持Speech Recognition(SR)语音识别功能,可以自己尝试