说话人区分
概述
什么是说话人区分
说话人区分(Speaker Diarization)是一种在多人说话的音频中推测"谁在说哪一部分"的功能。 例如,当使用一个麦克风录制多人参与的会议时,它可以帮助区分每个发言者的发言。
下图是一个示例,展示了田中先生和山田女士在会议中交谈,用一个麦克风录音的情况。在这个音频中,两个人的发言被记录在同一个音轨上。
使用AmiVoice API的说话人区分功能,可以像下图所示,将各个发言区分为"这个区间是'speaker0'的发言"、"这个区间是另一个说话人'speaker1'的发言"等。
这个功能并不识别个人身份。因此,应用程序需要自行处理"speaker0"对应山田女士,"speaker1"对应田中小姐这样的对应关系。
关于API
要使用说话人区分,需要在进行语音识别请求时指定选项参数。说话人区分的结果以单词为单位获得。在语音识别响应中的单词级结果中会添加label,设置类似"speaker0"或"speaker1"这样的标签来区分说话人。
说话人区分结果示例:
"tokens": [
{
"written": "アドバンスト・メディア",
"confidence": 1,
"starttime": 522,
"endtime": 1578,
"spoken": "あどばんすとめでぃあ",
"label": "speaker0"
},
{
"written": "は",
"confidence": 1,
"starttime": 1578,
"endtime": 1834,
"spoken": "は",
"label": "speaker0"
},
{
"written": "、",
"confidence": 0.95,
"starttime": 1834,
"endtime": 2010,
"spoken": "_",
"label": "speaker0"
},
/* 以下省略 */
使用方法
要使用说话人区分,需要在语音识别请求时设置下表中的请求参数。
表. 说话人区分的请求参数
| 接口 | 启用所需的参数 | 调整用的参数 |
|---|---|---|
| 同步 HTTP / WebSocket | 在segmenterProperties中设置useDiarizer=1 | segmenterProperties中的diarizerTransitionBias、diarizerAlpha |
| 异步 HTTP | 设置speakerDiarization=True | diarizationMinSpeaker、diarizationMaxSpeaker |
请注意,请求时指定的选项参数因接口而异。无论使用哪种接口,获得的结果格式都是相同的。
请求参数之所以不同,是因为同步 HTTP 和 WebSocket 接口与异步 HTTP 接口采用了不同的说话人区分方法。在同步 HTTP 和 WebSocket 接口中,会在检测音频流的发言区间时进行说话人区分。因此,需要对发言区间检测参数即segmenterProperties进行设置。
而在异步 HTTP 接口的情况下,是在拥有完整音频文件的状态下进行说话人区分。设置是在异步 HTTP 特有的参数中进行的。
本节首先按接口说明如何启用说话人区分,然后说明用于提高精度的参数。
请求
下面按接口说明如何启用说话人区分并发送请求。
同步 HTTP 接口
要启用说话人区分,需要在segmenterProperties中设置useDiarizer=1。在同步 HTTP 中,segmenterProperties设置在请求参数的d参数中。
以下是一个示例。如果不使用说话人区分,使用 curl 命令对 AmiVoice API 示例程序附带的音频文件进行通用引擎语音识别的命令如下:
curl https://acp-api.amivoice.com/v1/recognize \
-F u={APP_KEY} \
-F d="grammarFileNames=-a-general" \
-F a=@test.wav
要启用说话人区分,请如下设置:
curl https://acp-api.amivoice.com/v1/recognize \
-F u={APP_KEY} \
-F d="grammarFileNames=-a-general segmenterProperties=useDiarizer=1" \
-F a=@test.wav
此时,参数的顺序不重要。也可以同时设置其他参数。有关同步 HTTP 接口请求方法的详细信息,请参阅发送语音识别请求。
WebSocket 接口
要启用说话人区分,需要在segmenterProperties中设置useDiarizer=1。在 WebSocket 接口中,segmenterProperties设置在建立 WebSocket 连接后首先发送的s命令中。
以下是一个示例。如果不使用说话人区分,使用通用引擎进行语音识别的请求如下:
s 16K -a-general authorization={APPKEY}
要启用说话人区分,请按如下方式添加参数:
s 16K -a-general authorization={APPKEY} segmenterProperties=useDiarizer=1
s命令必须设置音频格式和引擎名称,但后续参数的顺序可以更改。也可以同时设置其他参数。有关使用 WebSocket 接口发送请求的方法,请参阅开始识别请求。
异步 HTTP 接口
要启用说话人区分,需要在请求参数的d参数中添加speakerDiarization=True。
以下是一个示例。如果不使用说话人区分,使用 curl 命令对 AmiVoice API 示例程序附带的音频文件进行通用引擎语音识别的命令如下:
curl https://acp-api-async.amivoice.com/v1/recognitions \
-F u={APP_KEY} \
-F d="grammarFileNames=-a-general" \
-F a=@test.wav
要启用说话人区分,请如下设置:
curl https://acp-api-async.amivoice.com/v1/recognitions \
-F u={APP_KEY} \
-F d="grammarFileNames=-a-general speakerDiarization=True" \
-F a=@test.wav
此时,参数的顺序不重要。也可以同时设置其他参数。有关异步 HTTP 接口请求方法的信息,请参阅1. 创建语音识别Job。
响应
下面说明启用说话人区分时的响应。
说话人区分的结果作为label添加到逐词结果token中。label是以 speaker 开头后跟数字的字符串,用于区分说话人,如 speaker0、speaker1、speaker2 ... speakerN。
说话人标签的数字可能会出现缺号。例如,3 个说话人的标签可能输出为 speaker0、speaker1、speaker3。不要假设数字从 0 开始连续出现。
说话人区分结果示例:
"tokens": [
{
"written": "アドバンスト・メディア",
"confidence": 1,
"starttime": 522,
"endtime": 1578,
"spoken": "あどばんすとめでぃあ",
"label": "speaker0"
},
{
"written": "は",
"confidence": 1,
"starttime": 1578,
"endtime": 1834,
"spoken": "は",
"label": "speaker0"
},
{
"written": "、",
"confidence": 0.95,
"starttime": 1834,
"endtime": 2010,
"spoken": "_",
"label": "speaker0"
},
/* 以下省略 */
有关语音识别结果格式的详细信息,请参阅语音识别结果。
启用说话人区分可能会增加响应时间。如果不使用说话人标签,请将其禁用。
用于提高精度的调整参数
下面说明用于调整说话人区分结果的参数。如前面的"表. 说话人区分的请求参数"所总结的那样,可调整的参数因接口而异。
调整说话人检测的敏感度
在使用同步 HTTP 和 WebSocket 接口时,可以使用segmenterProperties属性的两个参数来调整说话人检测的敏感度。
| 参数 | 可指定的值 | 参考范围 | 默认值 | 说明 |
|---|---|---|---|---|
diarizerAlpha | 0 以上 | 1e-100~1e50 | 1 | 新说话人出现的容易度 |
diarizerTransitionBias | 0 以上 1 以下 | 1e-150~1e-10 | 1e-40 8k 时为 1e-20 | 说话人切换的容易度 |
1e 表示 10 的幂。例如,1e-100 表示 。请按照 diarizerAlpha=1e-100 的格式设置。也请参考下面的请求示例。
diarizerAlpha
控制新说话人出现容易度的参数。 指定较大的值会使新说话人更容易出现,指定较小的值会使新说话人不易出现。
diarizerAlpha=0 是特殊情况,将被视为指定了 1e0,即 1。如果不设置任何值,则相当于指定了 diarizerAlpha=0。
- 如果结果中的说话人数量比实际多,请尝试将
diarizerAlpha从默认值(1e0)减小到 1e-10、1e-20 等,看是否有改善。 - 如果结果中的说话人数量比实际少,请尝试将
diarizerAlpha从默认值(1e0)增加到 1e10、1e20 等,看是否有改善。
diarizerTransitionBias
控制说话人切换容易度的参数。 指定较大的值会使说话人更容易切换,指定较小的值会使说话人不易切换。
diarizerTransitionBias=0 是特殊情况,将被视为指定了 1e-40。但是,对于支持 8kHz 音频的引擎,例如使用通用引擎(-a-general)并发送 8kHz 采样率的音频时,将被视为指定了 1e-20。如果不设置任何值,则相当于指定了 diarizerTransitionBias=0。
- 如果实际上是同一个人在持续说话,但却被检测为多个说话人,请尝试将
diarizerTransitionBias从默认值减小到 1e-50、1e-60 等,看是否有改善。 - 如果有多人在说话,但却被检测为一个说话人持续说话,请尝试将
diarizerTransitionBias从默认值增加到 1e-10 等,看是否有改善。
设置示例
以下是启用说话人区分,并将 diarizerAlpha 设置为 1e-20,diarizerTransitionBias 设置为 1e-10 的示例。由于需要在 segmenterProperties 中设置多个参数,各参数之间用半角空格分隔。
使用 curl 命令的同步 HTTP 接口设置示例
curl https://acp-api.amivoice.com/v1/recognize \
-F u={APP_KEY} \
-F d="grammarFileNames=-a-general segmenterProperties=useDiarizer=1%20diarizerAlpha=1e-20%20diarizerTransitionBias=1e-10" \
-F a=@test.wav
将 segmenterProperties 中设置的参数之间的半角空格 URL 编码为 %20。
WebSocket 接口的设置示例
s 16K -a-general authorization={APPKEY} segmenterProperties="useDiarizer=1 diarizerAlpha=1e-20 diarizerTransitionBias=1e-10"
将segmenterProperties中设置的整个参数用双引号"..."括起来。
指定说话人数量
在使用异步 HTTP 接口时,通过限定音频中包含的说话人数量范围,可以提高说话人区分的精度。
| 参数 | 可指定的值 | 默认值 | 说明 |
|---|---|---|---|
diarizationMinSpeaker | 1~20 | 1 | 预期的最少说话人数 |
diarizationMaxSpeaker | 1~20 | 10 | 预期的最多说话人数 |
diarizationMinSpeaker
音频中预期包含的最少人数。
diarizationMaxSpeaker
音频中预期包含的最多人数。
如果事先知道音频中包含的说话人数量,准确设置可以显著提高推测的精度。例如,如果已知即将开始的会议有5名参与者,则在请求时的d参数中添加diarizationMinSpeaker=5和diarizationMaxSpeaker=5。
设置示例
启用说话人区分,并将diarizationMinSpeaker和diarizationMaxSpeaker设置为5的示例。
使用 curl 命令的异步 HTTP 接口设置示例
curl https://acp-api-async.amivoice.com/v1/recognitions \
-F u={APP_KEY} \
-F d="grammarFileNames=-a-general speakerDiarization=True diarizationMinSpeaker=5 diarizationMaxSpeaker=5" \
-F a=@test.wav
提高精度的提示
以下是提高说话人区分精度的一些提示。
设置说话人数量
对于 异步 HTTP 接口,可以指定说话人数量。如果可能,事先设置音频中包含的说话人数量可以提高精度。
改善音质
说话人区分的精度也会随着音质的下降而降低。通过改善录音环境,如避免噪音和回声,可能会提高精度。
避免多人同时说话
当多个说话人同时说话时,很难推测说话人。根据应用程序的用途,这可能很困难,但如果能够设法让用户不同时说话,精度就会提高。
注意事项
多人同时说话的情况
对于多人同时说话的区间,虽然正确的做法是不推断为某个单一的说话人,但系统会返回某个说话人标签"speakerN"。
噪音
对于音频文件,系统首先判断是否为语音,然后对被检测为语音的区间进行语音识别和说话人分类。如果在语音检测时错误地将噪音等判断为语音区间,系统会返回某个说话人标签"speakerN"。