介绍

语音发音评分目前做的比较好的有微软、声通、科大讯飞。其中,科大讯飞的 suntone 是使用的声通的模型。

除此之外,文本转语音服务,微软、MiniMAx、科大讯飞、TTSmaker、Amazon Polly 做的也相对不错。

这篇文章主要介绍微软的语音服务的调用和一些优化。

技术选型

微软的 API 调用前,最好先明确使用场景及编程语言。

使用场景这里比如,是使用客户端直接去调用?还是客户端与服务端通信,服务端再去和 Auzre 之间进行通信?

客户端直接使用、服务端做中转之间的最大区别在于:

  1. 音频流的处理。客户端的 SDK 可以直接调用麦克风。服务端的话是需要把音频流做一层中转。
  2. 稳定性的考虑。微软在国内没有服务器,在国内使用比较建议的节点是东南亚,那国内客户端直连可能就会出现一些问题。

另外还有 SDK 可能会出现升级、旧版本失效等问题。以及像部分场景下,会涉及到客户端持续听录得处理。

另外就是如果涉及到使用服务端做中转,那么语言的选项就是一个问题。

微软并非是每种语言的 SDK 功能都是健全的,比如 Go 的 SDK 不能使用发音评估。

1736753439543.png

再比如降低语音合成延迟的时候,Go、JavaScript 的 SDK 是没有相关的示例文档,虽然有些也可以处理,但是要花的代价比较大。

1736754319313.png

语言方面,推荐使用 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";

以发音评估为例,首先修改 subscriptionKeyserviceRegion 这两个参数。这两个从 Auzre 上开通订阅并创建指定地区的语音资源就有了。

serviceRegion 影响到的功能可以参见可用性区域,比较推荐使用的区域有:

  1. 亚洲:
    • southeastasia(东南亚)
    • centralindia(印度)
  2. 美洲:
    • eastus(美东)和 eastus2(美东 2) 配合使用。
    • eastus(美东)和 southcentralus(美国南部)配合使用。
  3. 欧洲:
    • westeurope(西欧)

实际使用中可以根据资源配置,做洲内多节点分布。

其次是 language ,也就是目标语言区域。关于目标语言区域的问题可以参见 支持的语言

需要注意,不同的语言支持的语音服务有一定差异,另外语言还涉及到一些细颗粒度的支撑。

比如发音评估中音节水平的评估是仅限 zh-CN,发音评估中音素 IPA/SAPI 的支持,非脚本化发音评估的 topic 设置仅支持 en-US 区域等等。

然后是 filenamenode.js 的话,输入音频文件只支持 wav 格式,除了以文件的方式读取输入,也可以使用流的形式输入。

最后是 topictopic 只有发音评估里的【非脚本化评估】才会涉及,会根据设置的 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