Microsoft Speech SDK 工具类

来源:互联网 发布:php fpm 错误日志 编辑:程序博客网 时间:2024/05/21 03:59

今天无意中发现了Windows平台下文字转语音的API接口—— Microsoft Speech SDK,就拿过来玩了下,写了一个工具类。
这款sdk似乎功能很多,我只是用了文字转语音的功能,以后有机会的话,再多多发掘一下。

1.1 下载地址

首先,是下载地址。
https://www.microsoft.com/en-us/download/details.aspx?id=10121

进入主页,点击下载,按照提示进行安装即可。

安装完成SDK之后,在安装路径之下就可以找到头文件和动态库/静态库。里面也有相应的说明文档和示例,很有帮助。

1.2 工具类

我把文字转语音的功能封成了一个类。大家可以借鉴使用。在使用时,当然少不了配置依赖项等属性。会一一介绍。

1.2.1 MSSpeacker

Class Declare:

// Class Declare1#ifndef _MSSPEAK_H_#define _MSSPEAK_H_#include <iostream>#include "sapi.h"  // MS speech sdk 提供的头文件,需要自己配置文件路径属性#include <Windows.h>#include <string>#include <fstream>using namespace std;class MSSpeaker{public:    MSSpeaker(void);    ~MSSpeaker(void);    static void InitialMsSpeaker();    static void CloseMsSpeaker();    static void Speaking(const string & speakContent);private:    // string to wstring    static wstring StringToWString(const string & str);};#endif

Class Implement:

#include "MSSpeak.h"MSSpeaker::MSSpeaker(void){}MSSpeaker::~MSSpeaker(void){}void MSSpeaker::InitialMsSpeaker(){    //初始化COM接口    if (FAILED(::CoInitialize(NULL)))        MessageBox(NULL, "COM接口初始化失败!", "提示", MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);}void MSSpeaker::CloseMsSpeaker(){    //释放com资源    ::CoUninitialize();}void MSSpeaker::Speaking( const string & speakContent ){    ISpVoice *pVoice = NULL;    //获取SpVoice接口    HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL,         IID_ISpVoice, (void**)&pVoice);    if (SUCCEEDED(hr))    {        pVoice->SetVolume((USHORT)100); //设置音量,范围是 0 -100        pVoice->SetRate(0); //设置速度,范围是 -10 - 10        hr = pVoice->Speak( StringToWString(speakContent).c_str(), 0, NULL);        pVoice->Release();        pVoice = NULL;    }}std::wstring MSSpeaker::StringToWString( const string &str ){    setlocale(LC_ALL, "chs");     const char* _Source = str.c_str();    size_t _Dsize = str.size() + 1;    wchar_t *_Dest = new wchar_t[_Dsize];    wmemset(_Dest, 0, _Dsize);    mbstowcs(_Dest,_Source,_Dsize);    std::wstring result = _Dest;    delete []_Dest;    setlocale(LC_ALL, "C");    return result;}

需要注意的是,因为sdk里面使用的wchar字符,即宽字符集,所以我在这里用StringToWString()函数,将常用的string字符串转化为wstring字符串,并使用c_str()函数来构造wchar数组。
大家可以根据自己的需要来添加这些函数处理。只需要注意wchar字符集即可。

1.2.2 VC++项目依赖项设置

1) 头文件的设置

sdk里面提供了多个头文件,如sapi.h, sapiddk.h等,根据自己要实现的功能选取即可。
因为我使用的是文字转语音,所以仅仅使用sapi.h文件。

头文件的设置,就是在 VC++的项目属性->C/C++->常规->附加包含目录 里面设置。把路径设置好就行。

设置完成后,在代码里面使用地方包含头文件即可。

2) 依赖项的设置

依赖项主要是静态库和动态库的依赖问题。
sdk提供了对应的静态库和动态库。我使用的是静态库sapi.lib。为的是编译生成之后直接使用,就不需要担心动态库的缺失了。

动态库的设置,就是在`VC++的项目属性->连接器->输入->附加依赖项。在这里需要把路径和库名字写对。

1.3 示例代码

我在这里写了一个main.cpp来测试这个类功能

#include "MSSpeak.h"#include <iostream>int main(){    // 初始化    MSSpeaker::InitialMsSpeaker();    // 发音,中英文均支持    MSSpeaker::Speaking(string("我爱中国,i love china!!!"));    // 释放资源    MSSpeaker::CloseMsSpeaker();    return 0;}
0 0