说话人区分
概述
什么是说话人区分
说话人区分(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/v2/recognitions \
-F u={APP_KEY} \
-F d="grammarFileNames=-a-general" \
-F a=@test.wav
要启用说话人区分,请如下设置:
curl https://acp-api-async.amivoice.com/v2/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 | 1e-30 8k的情况下为1e-10 | 新说话人出现的容易程度 |
diarizerTransitionBias | 0以上1以下 | 1e-150~1e-10 | 1e-20 | 说话人切换的容易程度 |
1e 表示 10 的幂。例如,1e-100 表示 。请按照 diarizerAlpha=1e-100 的格式设置。也请参考下面的请求示例。