Microsoft Text-to-Speech(TTS)
语音引擎是一种能够将文字转换成自然语音输出的技术,可以在很多领域得到应用,如阅读软件、辅助阅读、语音导航、语音合成等领域。TTS语音引擎在使用过程中,可以根据语音合成对象的需求,实现多种语言、口音、声音质量、情感、语速等方面的自定义配置和功能。
Python开发TTS
下载 win32com
组件
pip install pywin32
C:\Users\mageriletu>pip install pywin32
Collecting pywin32
Downloading pywin32-306-cp311-cp311-win_amd64.whl (9.2 MB) ---------------------------------------- 9.2/9.2 MB 26.7 kB/s eta 0:00:00
Installing collected packages: pywin32
Successfully installed pywin32-306
语音合成
# Python 代码示例
import win32com.client
def speak(text):
speaker = win32com.client.Dispatch("SAPI.SpVoice")
speaker.Speak(text)
speak("欢迎使用Microsoft TTS语音引擎")
C++开发TTS
微软win7
及以上版本自带的语音合成引擎,可以直接拿来用,不需要额外的dll
文件,只需要引用头文件即可, 封装一个简单的类用来做语音合成如下:
tts.h
文件:
#pragma once
#include <Windows.h>
#include "sapi.h"
#include <list>
#include <string>
#include "sphelper.h"
#pragma comment(lib, "sapi.lib")
class TTS
{
public:
TTS();
~TTS();
bool Speak(std::wstring);
bool IsUseful();
private:
ISpVoice* m_pSpVoice;
bool InitVoice();
void StopVoice();
};
tts.cxx
文件:
#include "tts.h"
TTS::TTS()
{
m_pSpVoice = nullptr;
}
TTS::~TTS()
{
StopVoice();
::CoUninitialize();
}
//初始化设备
bool TTS::InitVoice()
{
HRESULT ret = ::CoInitialize(NULL);
ret = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (void**)&m_pSpVoice);
if (0 == ret && m_pSpVoice)
{
m_pSpVoice->SetVolume(80);
IEnumSpObjectTokens *pSpEnumTokens = NULL;
if (SUCCEEDED(SpEnumTokens(SPCAT_VOICES, NULL, NULL, &pSpEnumTokens))) //找到lili语音进行朗读, 否则就跳出
{
ISpObjectToken *pSpToken = NULL;
while (SUCCEEDED(pSpEnumTokens->Next(1, &pSpToken, NULL)) && pSpToken != NULL)
{
LPWSTR pId = new WCHAR[32];
pSpToken->GetId(&pId);
int nLen = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)pId, -1, NULL, 0, NULL, NULL);
char *s = new char[nLen + 1];
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)pId, -1, s, nLen, NULL, NULL);
if (0 == strcmp(s, ("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices\\Tokens\\MS-Lili-2052-20-DSK")))
{
m_pSpVoice->SetVoice(pSpToken); // 设置lili语音
pSpToken->Release();
delete[] s;
break;
}
delete[] s;
pSpToken->Release();
}
pSpEnumTokens->Release();
}
return true;
}
else
{
}
return false;
}
//文字转语音并播放
bool TTS::Speak(std::wstring word)
{
StopVoice();
if (InitVoice())
{
HRESULT ret = m_pSpVoice->Speak(word.c_str(), SPF_ASYNC, NULL);
return ret;
}
else
{
return false;
}
}
bool TTS::IsUseful()
{
bool bRet = InitVoice();
StopVoice();
return bRet;
}
//停止播放
void TTS::StopVoice()
{
if (m_pSpVoice!=nullptr)
{
m_pSpVoice->Release();
}
}