跳至主要内容

说话人区分

概述

什么是说话人区分

说话人区分(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 / WebSocketsegmenterProperties中设置useDiarizer=1segmenterProperties中的diarizerTransitionBiasdiarizerAlpha
异步 HTTP设置speakerDiarization=TruediarizationMinSpeakerdiarizationMaxSpeaker
备注

请注意,请求时指定的选项参数因接口而异。无论使用哪种接口,获得的结果格式都是相同的。

请求参数之所以不同,是因为同步 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属性的两个参数来调整说话人检测的敏感度。

参数可指定的值参考范围默认值说明
diarizerAlpha0 以上1e-100~1e501新说话人出现的容易度
diarizerTransitionBias0 以上 1 以下1e-150~1e-101e-40
8k 时为 1e-20
说话人切换的容易度
备注

1e 表示 10 的幂。例如,1e-100 表示 1010010^{-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 接口时,通过限定音频中包含的说话人数量范围,可以提高说话人区分的精度。

参数可指定的值默认值说明
diarizationMinSpeaker1~201预期的最少说话人数
diarizationMaxSpeaker1~2010预期的最多说话人数
diarizationMinSpeaker

音频中预期包含的最少人数。

diarizationMaxSpeaker

音频中预期包含的最多人数。

提示

如果事先知道音频中包含的说话人数量,准确设置可以显著提高推测的精度。例如,如果已知即将开始的会议有5名参与者,则在请求时的d参数中添加diarizationMinSpeaker=5diarizationMaxSpeaker=5

设置示例

启用说话人区分,并将diarizationMinSpeakerdiarizationMaxSpeaker设置为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"。

说话人标签在每个请求中是独立的

说话人标签在每个请求中是独立的。例如,如果将一个会议录音分为前半部分和后半部分进行两次请求,将得到两个响应,但这两个响应中包含的说话人标签不一定指的是同一个说话人。应用程序应该为每个请求得到的响应单独建立说话人标签和说话人的对应关系。或者,将音频作为一个请求发送。

限制条件

可区分的最大人数

最多可以区分20个说话人。

异步HTTP的情况

启用说话人分类时,可以发送的音频长度最长为3小时。如果发送更长的音频数据,在请求时将收到错误。

如果不使用说话人区分,发送到异步 HTTP 接口的音频受大小限制,最多可发送约 2.14GB 的音频数据。

示例程序

我们公开了一个使用AmiVoice API异步HTTP接口的说话人分类的Windows应用程序。

提示

在 AmiVoice Tech Blog 上有关于如何创建上述示例应用程序的说明,请参阅【HttpClient】如何在 C# 中使用 AmiVoice 的说话人区分