Microsoft Speech SDK 工具类

今天无意中发现了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 Declare

1#ifndef _MSSPEAK_H_
#define _MSSPEAK_H_
#include 
#include "sapi.h"  // MS speech sdk 提供的头文件,需要自己配置文件路径属性
#include 
#include 
#include 

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;
}

你可能感兴趣的:(Windows编程)