65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows 10 API 的语音识别和语音合成(适用于纯 Win32)

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2020 年 5 月 27 日

CPOL

2分钟阅读

viewsIcon

12424

一个单函数库,可轻松地将语音转文本和文本转语音集成到您的 Win32 应用程序中

引言

在过去几年里,我们中的许多声音工程师都尝试创建和改进语音识别算法。大量的训练、神经网络、倒谱、傅里叶变换、小波等等,这些耗费人生的研究。Windows 语音 API 曾试图实现这些算法,但效果不尽如人意。

现在互联网的容量和速度已经发展到可以容纳和比较海量信息的地步,所有这些算法突然被基于网络的语音识别所取代。不再进行本地分析,你的声音会被传输到服务器,服务器包含许多、许多样本,并且能够以极高的精度推断出你的措辞。谷歌已经在 Android 中使用了这种技术。

在 Windows 中,我们有新的 SpeechRecognizer UWP API,它可以通过少量代码在纯 Win32 应用程序中使用。这里有一个单函数库,可以为你处理细节。我已经在我的大型音频和视频序列器 Turbo Play 中使用了它。

使用库

该代码仅导出两个函数

HRESULT __stdcall SpeechX3(const wchar_t* t, std::vector<uint8_t>* tx, bool XML);
HRESULT __stdcall SpeechX1(void* ptr, SpeechX2 x2, 
                           const wchar_t* langx = L"en-us", int Mode = 0);

对于文本到语音,使用 SpeechX3,参数包括文本、用于写入 WAVE 文件数据的向量。你可以使用 XML 标记 来配置合成。

对于语音到文本,使用 SpeechX1

使用 Mode = 2,传递一个 std::vector<std::tuple<std::wstring,std::wstring>> 作为 ptr,以获取所有支持的语言。

std::vector<std::tuple<std::wstring, std::wstring>> sx; 
SpeechX1((void*)&sx, 0, 0, 2); 
for (auto& e : sx) 
{ 
  std::wcout << std::get<0>(e) << L" - " << std::get<1>(e) << std::endl; 
}

元组的第一个项目是语言的显示名称,第二个是稍后传递给函数的代码,用于启动语音识别。

选择要使用的语言后,再次调用 SpeechX1 ,并将 mode = 0, ptr = 设置为要传递给回调的自定义指针。第三个参数是选择的语言代码,你将传递一个回调函数

HRESULT __stdcall MyCallback(void* ptr, const wchar_t* reco, int conf);

该回调函数将在三个场合被调用

  1. 定期确认状态,reco =  nullptr
  2. conf == -1 时,识别正在进行中,处于假设阶段。Reco 是已识别的部分文本。
  3. conf >= 0 时,识别完成。Reco 是最终文本,置信度参数从 0 到 3(数值越小越好),表示识别的准确性。

返回 S_OK 以继续。如果返回错误,SpeechX1 将返回,语音识别会话结束。

使用 mode==1,库将测试特定的语音识别引擎,而不返回结果(相反,你将从扬声器听到已识别语音的播放)。

该库以 DLL 和静态库两种形式提供,并包含一个命令行测试工具。
玩得开心!

历史

  • 2020 年 5 月 27 日:首次发布
© . All rights reserved.