跳至主要内容

语音识别结果格式

AmiVoice API 不仅能提供发送语音的转写文本,还能获得各种信息。 这些信息以结构化的 JSON 格式提供。本节将介绍从 AmiVoice API 获得的结果。

结果结构

从 AmiVoice API 获得的语音识别结果大致分为三个部分。以下是对客户端库示例程序附带的名为 test.wav 的音频文件的结果。

图. AmiVoice API 结果概览

下面依次说明各个元素。

整体结果

这是发送到 API 的整个音频的结果。

以下是从 test.wav 的结果中摘录的整体结果示例。

{
/* ... 省略 ... */
"utteranceid": "20220602/14/018122d65d370a30116494c8_20220602_141442",
"text": "アドバンスト・メディアは、人と機械との自然なコミュニケーションを実現し、豊かな未来を創造していくことを目指します。",
"code": "",
"message": ""
/* ... 省略 ... */
}

整体结果的各个元素包含以下信息:

字段名说明补充
utteranceid识别结果信息 ID识别结果信息 ID 在 WebSocket 和 HTTP 接口上有所不同。在 WebSocket 中,它是每个语音段识别结果信息的 ID。而在 HTTP 中,它是一个会话中上传的可能包含多个语音段的整个音频数据的识别结果信息的 ID。
text整体识别结果文本这是将所有语音段的识别结果连接起来的整体识别结果文本。
code结果代码表示结果的一个字符代码。请参阅 响应代码和消息
message错误消息表示错误内容的字符串。请参阅 响应代码和消息

当请求成功时,codemessage为空字符串。失败时会设置原因,请参阅 响应代码和消息

识别成功时:

body.code == "" 且  body.message == "" 且  body.text != ""

识别失败时:

body.code != "" 且  body.message != "" 且  body.text == ""

语音段结果

语音段指的是音频数据中人在说话的部分。在 AmiVoice API 中,通过 语音检测 过程来推测语音段。下面将说明这些语音段的语音识别结果。

备注

在同步 HTTP 接口中,不会获得语音段结果。

以下是从 test.wav 结果中摘录的词级结果示例。

{
/* ... 省略 ... */
"results": [
{
"tokens": [/*...词级结果..*/],
"confidence": 0.998,
"starttime": 250,
"endtime": 8794,
"tags": [],
"rulename": "",
"text": "アドバンスト・メディアは、人と機械との自然なコミュニケーションを実現し、豊かな未来を創造していくことを目指します。"
}
]
/* ... 省略 ... */
}

results 是一个数组格式,但始终只包含一个元素。results[0]的元素表示语音段的结果。语音段结果的各个元素包含以下信息:

字段名说明补充
results[0].tokens词级结果以数组形式获得词级结果。详细内容将在下一章节中说明。
results[0].confidence置信度整体置信度。值范围为 0 到 1,置信度越低表示出错可能性越高,越接近 1 表示结果越可靠。
results[0].starttime语音段开始时间表示被检测为语音识别处理对象的语音段的开始时间。请参阅 关于结果中包含的时间信息
results[0].endtime语音段结束时间表示被检测为语音识别处理对象的语音段的结束时间,或实际进行语音识别处理的区间的结束时间。请参阅 关于结果中包含的时间信息
results[0].tags标签始终为空白。目前未使用,请忽略。
results[0].rulename规则名称始终为空白。目前未使用,请忽略。
results[0].text语音识别结果文本语音段中包含的语音的识别结果文本。
备注
关于与通过 WebSocket 接口的 E 事件包通知客户端的值的差异

通过 WebSocket 接口的 E 事件包通知客户端的值是语音段的结束时间。而结果中包含的 results[0].endtime 值表示语音段中实际进行语音识别处理的区间的结束时间。因此,E 事件的时间信息和 results[0].endtime 的值可能略有不同,results[0].endtime 可能与 E 的时间相同或稍早一些。

results[0].endtimeE事件的时间信息results[0].endtime \leqq E事件的时间信息

用户不需要关注这个差异,但请注意,从 results[0].starttimeresults[0].endtime 计算出的时间与计费时间不同。

词级结果

词级结果以数组形式在 results[0].tokens 中获得。这里的"词"指的是语音识别引擎处理的单位,与语言的语法单词不同。

以下是从 test.wav 结果中摘录的词级结果示例。

{
/* ... 省略 ... */
"results": [
"tokens": [
{
"written": "アドバンスト・メディア",
"confidence": 1,
"starttime": 522,
"endtime": 1578,
"spoken": "あどばんすとめでぃあ",
"label": "speaker0"
},
{
"written": "は",
"confidence": 1,
"starttime": 1578,
"endtime": 1866,
"spoken": "は"
},
/* ... 省略 ... */
]
/* ... 省略 ... */
}

词级结果的各个元素包含以下信息:

字段名说明补充
results[0].tokens[].written词级显示识别出的词的显示。
results[0].tokens[].spoken词级读音识别出的词的读音。

- 日语引擎识别结果的 spoken 是平假名。
- 英语引擎识别结果的 spoken 不是读音(请忽略)。
- 中文引擎识别结果的 spoken 是拼音。
results[0].tokens[].starttime词级发音开始时间推测识别出的词的发音开始的时间。请参阅 关于结果中包含的时间信息
results[0].tokens[].endtime词级发音结束时间推测识别出的词的发音结束的时间。请参阅 关于结果中包含的时间信息
results[0].tokens[].label词级推测说话人标签仅在启用说话人区分功能时获得的信息。用于区分说话人的标签,如 speaker0, speaker1, ...。详情请参阅 说话人区分
results[0].tokens[].confidence词级置信度识别出的词的置信度。值范围为 0 到 1,置信度越低表示出错可能性越高,越接近 1 表示结果越可靠。
备注

词级结果中必定存在的只有 written。其他信息根据请求内容和指定的引擎而有所不同。例如,如果不启用说话人区分,就不会有 label。此外,对于非日语语音识别引擎的标点符号结果,不会包含 starttimeendtimeconfidence,请注意。

中文标点符号结果示例:

{
"written": "。",
"spoken": "_"
}

各接口结果的详细信息

下面说明 结果结构 中说明的语音识别结果在各接口中如何获得,以及接口特有的结果和差异。

同步 HTTP 接口

获得将语音段合并为一个的结果。即使检测到多个语音段,也会合并为一个结果。

{
"results": [
{
"starttime": 第一个语音段的开始时间,
"endtime": 最后一个语音段的结束时间,
"tokens": [{词级结果1},...,{词级结果N}]
"confidence": 置信度,
"tags": [],
"rulename": "",
"text": "...",
}
],
"text": "...",
"code": 结果代码,
"message": 错误原因,
"utteranceid": "..."
}
  • 第一个语音段的开始时间会在 starttime 中获得,最后一个语音段的结束时间会在 endtime 中获得,发送的音频的所有词级结果会以数组形式在 tokens 中获得。
  • 在同步 HTTP 接口中,只会获得一个 utteranceid

例:

{
"results": [
{
"tokens": [
{
"written": "アドバンスト・メディア",
"confidence": 1,
"starttime": 522,
"endtime": 1578,
"spoken": "あどばんすとめでぃあ"
},
{
"written": "は",
"confidence": 1,
"starttime": 1578,
"endtime": 1866,
"spoken": "は"
},
/* ... 省略 ... */
{
"written": "ます",
"confidence": 0.76,
"starttime": 8090,
"endtime": 8506,
"spoken": "ます"
},
{
"written": "。",
"confidence": 0.82,
"starttime": 8506,
"endtime": 8794,
"spoken": "_"
}
],
"confidence": 0.998,
"starttime": 250,
"endtime": 8794,
"tags": [],
"rulename": "",
"text": "アドバンスト・メディアは、人と機械との自然なコミュニケーションを実現し、豊かな未来を創造していくことを目指します。"
}
],
"utteranceid": "20220602/14/018122d65d370a30116494c8_20220602_141442",
"text": "アドバンスト・メディアは、人と機械との自然なコミュニケーションを実現し、豊かな未来を創造していくことを目指します。",
"code": "",
"message": ""
}

异步 HTTP 接口

获得每个语音段的结果。如果检测到多个语音段,会获得与语音段数量相同的 results

{
"segments": [
{
"results": [
{
"starttime": 语音段开始时间,
"endtime": 语音段结束时间,
"tokens": [{词级结果1},...]
"confidence": 置信度,
"tags": [],
"rulename": "",
"text": "...",
}
],
"text": "..."
},
/* ... */
{
"results": [
{
"starttime": 语音段开始时间,
"endtime": 语音段结束时间,
"tokens": [...,{词级结果N}]
"confidence": 置信度,
"tags": [],
"rulename": "",
"text": "...",
}
],
"text": "..."
}
]},
"text": "...",
"code": "...",
"message": "...",
"utteranceid": "...",
/* ... 以下是异步 HTTP 接口特有的项目 ... */
"audio_md5": "...",
"audio_size": 0,
"service_id": "...",
"session_id": "...",
"status": "..."
}
  • 与同步 HTTP 语音识别不同,每个语音段的结果 (results) 以数组形式存储在 segments 中。
备注

要像同步 HTTP 接口一样在顶层获取 results,请在 d 参数中指定 compatibleWithSync=True

以下表格列出了仅存在于异步 HTTP 接口的项目,如Job状态等:

字段名说明补充
session_id会话 ID发送到异步 HTTP 接口的Job ID。
status异步处理的状态发送到异步 HTTP 接口的Job状态。
audio_size请求的音频大小异步 HTTP 接口接受的音频大小。
audio_md请求的音频 MD5 校验和异步 HTTP 接口接受的音频的 MD5 校验和。
content_id内容 ID用户可以用来后续关联数据的 ID。
service_idservice ID为每个用户发行的 service ID。

WebSocket 接口

语音段结果

每个语音段都会获得结果。如果有多个语音段,将获得与语音段数量相等的结果事件 (A)。

{
"results": [
{
"starttime": 语音段开始时间,
"endtime": 语音段结束时间,
"tokens": [{单词级结果1},...,{单词级结果N}]
"confidence": 置信度,
"tags": [],
"rulename": "",
"text": "转写结果"
}
],
"text": "...",
"code": 结果代码,
"message": 错误原因
"utteranceid": "..."
}
  • utteranceid 为每个语音段分配不同的 ID。

中间结果

这是在语音识别进行中获得的中间结果。中间结果是假设,在语音段的最终结果中内容可能会发生变化。

{
"results": [
{
"tokens": [{单词级结果1},...,{单词级结果N}]
"text": "转写结果"
}
],
"text": "..."
}

关于结果文本

字符编码

结果使用 UTF-8 编码。

Unicode 转义

同步 HTTP 接口和 WebSocket 接口的结果中包含的日语等多字节代码会进行 Unicode 转义。

未进行 Unicode 转义的结果:

"text": "アドバンスト・メディアは、人と機械等の自然なコミュニケーションを実現し、豊かな未来を創造していくことを目指します。"

进行 Unicode 转义后的结果:

"text":"\u30a2\u30c9\u30d0\u30f3\u30b9\u30c8\u30fb\u30e1\u30c7\u30a3\u30a2\u306f\u3001\u4eba\u3068\u6a5f\u68b0\u3068\u306e\u81ea\u7136\u306a\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u73fe\u3057\u3001\u8c4a\u304b\u306a\u672a\u6765\u3092\u5275\u9020\u3057\u3066\u3044\u304f\u3053\u3068\u3092\u76ee\u6307\u3057\u307e\u3059\u3002"

自动删除无意义词语

「あのー」和「えーっと」等无意义词语会自动从 text 中移除。详情请参阅自动删除无意义词语

关于结果中包含的时间信息

results[0].starttimeresults[0].endtimeresults[0].tokens[].starttimeresults[0].tokens[].endtime 等表示时间的值是以音频数据开头为 0 的毫秒单位。对于 WebSocket 接口,se 构成一个会话,表示会话内的相对时间。每次新会话开始时,基准时间都会重置。

关于计费对象的音频时间

语音识别 API 的计费基于语音段。通过 WebSocket 接口的 SE 事件可以获得准确的语音段信息。另请参阅关于 WebSocket 接口中通过 E 事件包通知客户端的值的差异