介绍
语音发音评分目前做的比较好的有微软、声通、科大讯飞。其中,科大讯飞的 suntone 是使用的声通的模型。
除此之外,文本转语音服务,微软、MiniMAx、科大讯飞、TTSmaker、Amazon Polly 做的也相对不错。
这篇文章主要介绍微软的语音服务的调用和一些优化。
技术选型
微软的 API 调用前,最好先明确使用场景及编程语言。
使用场景这里比如,是使用客户端直接去调用?还是客户端与服务端通信,服务端再去和 Auzre 之间进行通信?
客户端直接使用、服务端做中转之间的最大区别在于:
- 音频流的处理。客户端的 SDK 可以直接调用麦克风。服务端的话是需要把音频流做一层中转。
- 稳定性的考虑。微软在国内没有服务器,在国内使用比较建议的节点是东南亚,那国内客户端直连可能就会出现一些问题。
另外还有 SDK 可能会出现升级、旧版本失效等问题。以及像部分场景下,会涉及到客户端持续听录得处理。
另外就是如果涉及到使用服务端做中转,那么语言的选项就是一个问题。
微软并非是每种语言的 SDK 功能都是健全的,比如 Go 的 SDK 不能使用发音评估。
再比如降低语音合成延迟的时候,Go、JavaScript 的 SDK 是没有相关的示例文档,虽然有些也可以处理,但是要花的代价比较大。
语言方面,推荐使用 Python 或者 C# 进行处理,除此之外 Node.js 也可以。
示例代码仓库
微软在 Github 上提供了示例代码仓库,以 Node.js 为例,大概聊一下。
多语言示例代码仓库
有个多语言的示例代码仓库 cognitive-services-speech-sdk。
仓库下会有相关的示例代码以及快速使用的代码,Node.js 示例的代码主要包含语音识别、合成和翻译示例,
首先 clone 这个仓库后,在 Node.js 示例目录下 npm install
,然后修改 settings.js 里的配置信息。
配置说明
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
// Replace with your own subscription key, service region (e.g., "westus"),
// and recognition language.
export const subscriptionKey = "YourSubscriptionKey";
export const serviceRegion = "YourSubscriptionRegion"; // e.g., "westus"
export const language = "en-US";
// Replace with the full path to a wav file you want to recognize or overwrite.
export const filename = "YourAudioFile.wav"; // 16000 Hz, Mono
export const dummyFilename = "YourDummySample.wav";
export const topic = "YourTopic";
// Replace with your own Language Understanding subscription key (endpoint
// key), region, and app ID in case you want to run the intent sample.
export const luSubscriptionKey = "YourLanguageUnderstandingSubscriptionKey";
export const luServiceRegion = "YourLanguageUnderstandingServiceRegion";
export const luAppId = "YourLanguageUnderstandingAppId";
以发音评估为例,首先修改 subscriptionKey
、serviceRegion
这两个参数。这两个从 Auzre 上开通订阅并创建指定地区的语音资源就有了。
serviceRegion
影响到的功能可以参见可用性区域,比较推荐使用的区域有:
- 亚洲:
southeastasia
(东南亚)centralindia
(印度)
- 美洲:
eastus
(美东)和eastus2
(美东 2) 配合使用。eastus
(美东)和southcentralus
(美国南部)配合使用。
- 欧洲:
westeurope
(西欧)
实际使用中可以根据资源配置,做洲内多节点分布。
其次是 language
,也就是目标语言区域。关于目标语言区域的问题可以参见 支持的语言。
需要注意,不同的语言支持的语音服务有一定差异,另外语言还涉及到一些细颗粒度的支撑。
比如发音评估中音节水平的评估是仅限 zh-CN
,发音评估中音素 IPA/SAPI
的支持,非脚本化发音评估的 topic
设置仅支持 en-US
区域等等。
然后是 filename
,node.js
的话,输入音频文件只支持 wav
格式,除了以文件的方式读取输入,也可以使用流的形式输入。
最后是 topic
,topic
只有发音评估里的【非脚本化评估】才会涉及,会根据设置的 topic
来分析对主题的理解和参与程度、使用语法和各种句子模式的正确性、词汇用法的熟练程度。这个只有 en-US
才会生效,其他的不生效。
至于 LU
相关的都是和意图识别相关的。
启动命令行
Node.js
的启动命令为 node index.js [option]
option
的可选项为:
speech
:进行语音识别。pronunciationAssessment
:进行发音评估。pronunciationAssessmentContinue
: 连续发音评估。intent
:进行意图识别。translate
:进行语音翻译。synthesis
:进行语音合成。
js 示例代码仓库
还有个 js 的示例代码仓库 cognitive-services-speech-sdk-js。
这个仓库里面主要存放 js sdk 的源码,但是也放了示例代码。
相比上面多语言示例代码仓库里的 js 代码,这个代码是 TS 写的,相对规范一些,并且示例也更多,还有测试用的音频。
文本转语音示例代码
文本转语音示例代码仓库参见 Cognitive-Speech-TTS。这个仓库中还有使用 REST API 调用的语音发音评估的示例代码。
上面的都是 sdk 调用,sdk 底层调用是采用 websocket,除此之外还有 REST API 风格的 API。