メインコンテンツまでスキップ

音声認識の結果フォーマット

AmiVoice API からは、送信した音声を書き起こししたテキストだけではなく様々な情報が得られます。 情報は構造化されて JSON 形式で得られます。このセクションでは AmiVoice API から得られる結果について説明します。

結果の構造

AmiVoice API で得られる音声認識の結果は大きく3つの部分にわけられます。以下は、クライアントライブラリのサンプルプログラムに付属している test.wav という音声ファイルに対する結果です。

図. AmiVoice API の結果の概要

それぞれの要素を順に説明します。

全体の結果

APIに送信した音声全体の結果です。

test.wavの結果から全体の結果を例として抜粋します。

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

全体の結果の各要素には、以下の情報が含まれます。

フィールド名説明          補足
utteranceid認識結果情報 ID認識結果情報 ID は、WebSocket と HTTP インタフェースで異なります。WebSocket では、発話区間毎の認識結果情報に対する ID です。一方、HTTP の場合は、1 セッションでアップロードされた複数の発話区間を含む可能性のある音声データ全体の認識結果情報に対する ID となります。
text全体の認識結果テキスト発話区間の認識結果の全てを結合した全体の認識結果テキストです。
code結果コード結果を表す 1 文字のコードです。レスポンスコードとメッセージを参照してください。
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は配列形式ですが、常に 1 つの要素しか持ちません。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].endtimeEの時間と同じか、ほんの少し前の時間になる可能性があります。

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 はピンイン(pinyin)です。
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 インタフェース にだけある項目は以下の表の通りです。

フィールド名 説明補足
session_idセッション ID非同期 HTTP インタフェース に送信したジョブの ID。
status非同期処理の状態非同期 HTTP インタフェース に送信したジョブの状態。
audio_sizeリクエストした音声のサイズ非同期 HTTP インタフェース が受け付けた音声のサイズ。
audio_mdリクエストした音声のMD5チェックサム非同期 HTTP インタフェース が受け付けた音声の MD5 チェックサム。
content_idコンテンツ ID利用者が後からデータを紐付けるために利用できる ID。
service_idサービス ID利用者ごとに発行されているサービス 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インタフェースの場合は、sからeまでがひとつのセッションとなり、セッション内での相対的な時間を表します。新たなセッションが始まるたびに基準の時間はリセットされます。

請求対象の音声時間について

音声認識 API の請求は、発話区間に基づいています。WebSocketインタフェースのSEイベントで正確な発話区間情報が得られます。WebSocketインタフェースの場合のEイベントパケットを通してクライアント側に通知される値との違いについても参照してください。