音声認識の結果フォーマット
AmiVoice API からは、送信した音声を書き起こししたテキストだけではなく様々な情報が得られます。 情報は構造化されて JSON 形式で得られます。このセクションでは AmiVoice API から得られる結果について説明します。
結果の構造
AmiVoice API で得られる音声認識の結果は大きく3つの部分にわけられます。以下は、クライアントライブラリのサンプルプログラムに付属している test.wav という音声ファイルに対する結果です。
それぞれの要素を順に説明します。
全体の結果
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 | エラーメッセージ | エラー内容を表す文字列です。レスポンスコードとメッセージを参照してください。 |
code
とmessage
はリクエストが成功したときは空文字になります。失敗したときは理由が設定されますので、レスポンスコードとメッセージを参照してください。
認識成功時は
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].endtime
はE
の時間と同じか、ほんの少し前の時間になる可能性があります。
利用者はこの違いを意識する必要はありませんが、results[0].starttime
とresults[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
は話者ダイアライゼーションを有効にしなければ存在しません。また、日本語以外の音声認識エンジンで句読点の結果に対してはstarttime
、endtime
、confidence
が含まれませんので注意してください。
中国語の句読点の結果の例:
{
"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].starttime
、results[0].endtime
、results[0].tokens[].starttime
、results[0].tokens[].endtime
など、時刻を表す値は、音声データの先頭を 0 としたミリ秒単位です。WebSocketインタフェースの場合は、s
からe
までがひとつのセッションとなり、セッション内での相対的な時間を表します。新たなセッションが始まるたびに基準の時間はリセットされます。
請求対象の音声時間について
音声認識 API の請求は、発話区間に基づいています。WebSocketインタフェースのS
とE
イベントで正確な発話区間情報が得られます。WebSocketインタフェースの場合のE
イベントパケットを通してクライアント側に通知される値との違いについても参照してください。