语音格式
本文介绍 AmiVoice API 可以处理的语音数据格式,以及在请求参数中的设置方法。
支持的语音
这里说明 AmiVoice API 支持的语音格式。
编码
- Signed 16-bit PCM (little-endian、big-endian)
- A-law (8-bit)
- mu-law (8-bit)
采样率
支持 8kHz、11.025kHz、16kHz、22.05kHz、32kHz、44.1kHz、48kHz 的采样率。A-law 和 mu-law 格式仅支持 8kHz。
在本文档中,11.025kHz 和 22.05kHz 有时也会分别表示为 11kHz 和 22kHz。
AmiVoice API 中用于语音识别处理的语音识别引擎有两种,分别支持 8kHz 和 16kHz 采样率。8kHz 引擎主要用于电话语音,16kHz 引擎则广泛用于其他语音。各语音识别引擎支持的采样率如下表所示:
| 语音识别引擎 | 支持的采样率 |
|---|---|
| 支持 8kHz 的语音识别引擎 | 8kHz、11.025kHz |
| 支持 16kHz 的语音识别引擎 | 16kHz、22.05kHz、32kHz、44.1kHz、48kHz |
只有部分语音识别引擎支持 8kHz。详情请参阅语音识别引擎列表。
与歌曲或乐器演奏不同,语音识别通常不需要 16kHz 以上频段的信息。即使发送采样率高于 16kHz 的语音,也会先降采样到 16kHz 再进行处理,因此没有必要使用高于 16kHz 的采样率。为了节省网络带宽并减少传输时间,建议使用适当的采样率发送语音数据。需要注意的是,16kHz 以外的采样率不会影响语音识别的准确性。
使用支持 8k 语音的语音识别引擎时也是如此,11kHz 的语音会先降采样到 8kHz 再进行处理。
请参考 AmiVoice TechBlog 的文章"What sampling rate is necessary for speech recognition?"。
声道数
对于 Wave、Ogg、FLAC 等文件 header 中包含音频格式信息的"带 header "音频文件,支持多个声道。对于"不带 header "的音频文件,仅支持 1 个声道。
对于多声道音频,默认情况下只有第一个声道会被用于语音识别。通过使用请求参数audioFilterProperties,可以指定用于语音识别的声道。该参数仅在同步 HTTP 接口以及异步 HTTP 接口的 v2 中可用。对于 WebSocket 接口以及异步 HTTP 接口的 v1,与默认情况相同,只有第一个声道会被用于语音识别。
如果音源是立体声,且希望对两个声道都进行语音识别,可以使用audioFilterProperties参数将两个声道混合并平均后进行识别,但为每个声道分别发送语音识别请求,在发话时机重叠等情况下尤其有用。
请参考 AmiVoice TechBlog 的文章"如何将立体声音频文件转换为两个单声道音频文件"。
音频压缩
支持 Speex、Opus、MP3、FLAC。
过度压缩会影响人耳的听辨能力,也会影响识别精度。以下是各压缩方式的压缩率指南:
| 压缩方式 | 指南 |
|---|---|
| Speex | quality 7 以上 |
| Opus | 压缩率约 10:1 |
文件格式
支持 Wave(WAV)、Ogg、MP3、FLAC。由于音频格式信息包含在文件 header 等处,某些情况下可能不需要在请求参数中指定音频格式。详情请参阅下一节音频格式的设置方法。
音频格式的设置方法
发送语音识别请求时,需要指定要发送的音频数据的格式。Wave(WAV)、Ogg、FLAC 等容器文件的 header 包含音频格式信息。下面分别说明发送这种"带 header "音频文件和不包含音频格式信息的"不带 header "音频数据的情况。
请正确指定音频格式。设置错误可能导致完全无法获得结果,或降低语音识别和说话人区分的精度。
下文提到的音频格式名称不区分大小写。LSB16K和lsb16k是相同的。
带 header 的音频格式
当文件 header 等处包含音频格式信息时,按以下方式设置音频格式:
接口 | 音频格式的设置方法 |
|---|---|
| 同步/异步 HTTP | 可以省略音频格式的指定 |
| WebSocket | 在s命令的第一个参数中,对于采样率为 8kHz/11kHz 的音频数据设置8k,对于 16kHz 及以上的设置16k。 |
支持的音频格式及其设置方法汇总如下表:
文件格式 | 编码/音频压缩 | 采样频率 | 声道数 | 音频格式名 |
|---|---|---|---|---|
| Wave | PCM Signed 16-bit little-endian (※ formatTag: 0×0001) | 8kHz, 11kHz | 1 及以上 | 8K |
| Wave | PCM Signed 16-bit little-endian (※ formatTag: 0×0001) | 16kHz及以上 | 1 及以上 | 16K |
| Wave | mu-Law 8-bit (※ formatTag: 0×0007) | 8kHz | 1 及以上 | 8K |
| Wave | A-Law 8-bit (※ formatTag: 0×0006) | 8kHz | 1 及以上 | 8K |
| Ogg | Speex | 8kHz, 11kHz | 1 或 2 | 8K |
| Ogg | Speex | 16kHz 及以上 | 1 或 2 | 16K |
| Ogg | Opus | 8kHz, 11kHz | 1 及以上 | 8K |
| Ogg | Opus | 16kHz 及以上 | 1 及以上 | 16K |
| WebM | Opus | 8kHz, 11kHz | 1 及以上 | 8K |
| WebM | Opus | 16kHz 及以上 | 1 及以上 | 16K |
| MP3 | MP3 | 8kHz, 11kHz | 1 或 2 | 8K |
| MP3 | MP3 | 16kHz 及以上 | 1 或 2 | 16K |
| FLAC | FLAC | 8kHz, 11kHz | 1 及以上 | 8K |
| FLAC | FLAC | 16kHz 及以上 | 1 及以上 | 16K |
对于具有多个声道的音频数据,默认情况下只有第一个声道会被用于语音识别。如果希望对其他声道进行语音识别,则使用请求参数audioFilterProperties。
同步 HTTP 接口示例
wav 文件包含音频格式信息,音频格式会自动判别,因此无需指定。使用 curl 命令的示例如下:
curl https://acp-api.amivoice.com/v1/recognize \
-F u={API_KEY} \
-F d=grammarFileNames=-a-general \
-F a=@test-16k.wav
异步 HTTP 接口示例
wav 文件包含音频格式信息,音频格式会自动判别,因此无需指定。使用 curl 命令的示例如下:
curl https://acp-api-async.amivoice.com/v2/recognitions \
-F u={API_KEY} \
-F d=grammarFileNames=-a-general \
-F a=@test-16k.wav
除 endpoint 外,与同步 HTTP 接口相同。
WebSocket 接口示例
使用 16kHz 引擎时,在s命令的第一个参数中设置如下:
s 16K -a-general
当采样率为 8k 且使用支持 8kHz 的引擎(例如"会話_汎用 (-a-general)")时,设置如下:
s 8K -a-general
在 WebSocket 接口中发送带 header 的音频数据时,请勿指定8K或16K以外的音频格式。如果设置了后面提到的用于判断 PCM 格式音频数据的不带 header 的音频格式中的字符串(如LSB16K等),将基于该信息进行处理。在大多数情况下,这会导致无法检测到语音或返回与实际语音完全不同的结果。
不带 header 的音频格式
发送原始 PCM 数据等"不带 header "的音频数据时,按以下方式设置音频格式:
接口 | 音频格式的设置方法 |
|---|---|
| 同步/异步 HTTP | 在c参数中指定如LSB16K这样的音频格式名。 |
| WebSocket | 在s命令的第一个参数中指定如LSB16K这样的音频格式名。 |
对应编码和采样率的音频格式名如下表所示:
| 编码 | 采样频率 | 声道数 | 音频格式名 |
|---|---|---|---|
| PCM Signed 16-bit little-endian | 8kHz | 1 | LSB8K |
| PCM Signed 16-bit little-endian | 11kHz | 1 | LSB11K |
| PCM Signed 16-bit little-endian | 16kHz | 1 | LSB16K |
| PCM Signed 16-bit little-endian | 22kHz | 1 | LSB22K |
| PCM Signed 16-bit little-endian | 32kHz | 1 | LSB32K |
| PCM Signed 16-bit little-endian | 44.1kHz | 1 | LSB44K |
| PCM Signed 16-bit little-endian | 48kHz | 1 | LSB48K |
| PCM Signed 16-bit big-endian | 8kHz | 1 | MSB8K |
| PCM Signed 16-bit big-endian | 11kHz | 1 | MSB11K |
| PCM Signed 16-bit big-endian | 16kHz | 1 | MSB16K |
| PCM Signed 16-bit big-endian | 22kHz | 1 | MSB22K |
| PCM Signed 16-bit big-endian | 32kHz | 1 | MSB32K |
| PCM Signed 16-bit big-endian | 44.1kHz | 1 | MSB44K |
| PCM Signed 16-bit big-endian | 48kHz | 1 | MSB48K |
| mu-Law 8-bit | 8kHz | 1 | MULAW |
| A-Law 8-bit | 8kHz | 1 | ALAW |
同步 HTTP 接口示例
这里展示使用 curl 发送采样率为 16kHz、量化位数为 16 位、单声道、little-endian 的 PCM 数据的示例。在这种情况下,将c参数指定为LSB16K:
curl https://acp-api.amivoice.com/v1/recognize \
-F u={API_KEY} \
-F d=grammarFileNames=-a-general \
-F c=LSB16K \
-F a=@test-16k.pcm
异步 HTTP 接口示例
这里展示使用 curl 发送采样率为 16kHz、量化位数为 16 位、单声道、little-endian 的 PCM 数据的示例。在这种情况下,将c参数指定为LSB16K:
curl https://acp-api-async.amivoice.com/v2/recognitions \
-F u={API_KEY} \
-F d=grammarFileNames=-a-general \
-F c=LSB16K \
-F a=@test-16k.pcm
除 endpoint 外,与同步 HTTP 接口相同。
WebSocket 接口示例
这里发送采样率为 16kHz、量化位数为 16 位、单声道、little-endian 的 PCM 数据。在这种情况下,在s命令中指定LSB16K:
s LSB16K -a-general
对于不带 header 的音频,如果指定了8K或16K等带 header 音频文件的音频格式,将会尝试读取 header 并失败。如果读取 header 失败,将被视为LSB16K。发送不带 header 的音频数据时,请务必指定不带 header 的音频格式表中列出的字符串之一。