音声認識の結果フォーマット
AmiVoice API からは、送信した音声を書き起こししたテキストだけではなく様々な情報が得られます。 情報は構造化されて JSON 形式で得られます。このセクションでは AmiVoice API から得られる結果について説明します。
結果の要素
AmiVoice API で得られる音声認識の結果は大きく3つの部分にわけられます。以下は、クライアントライブラリのサンプルプログラムに付属している test.wav という音声ファイルに対する結果です。
それぞれの要素を順に説明します。
全体の結果
APIに送信した音声全体の結果です。
例:
"utteranceid": "20220602/14/018122d65d370a30116494c8_20220602_141442",
"text": "アドバンスト・メディアは、人と機械との自然なコミュニケーションを実現し、豊かな未来を創造していくことを目指します。",
"code": "",
"message": ""
文字起こしした結果はtext
に、API 呼び出しの成功・失敗を判断するためのコード(code
)とエラー時のメッセージ(message
)が得られます。
text
には送信した音声を書き起こししたテキストが得られます。code
とmessage
はリクエストが成功したときは空文字になります。失敗したときは理由が設定されますので、レスポンスコードとメッセージを参照してください。utteranceid
は、発話に対する ID です。HTTP インタフェースと WebSocket インタフェースで意味が異なりますので後述します。
発話区間の結果
発話区間とは、音声データの中で人が話している部分を指します。AmiVoice APIでは、発話検出プロセスによって発話区間を推定しています。この発話区間ごとの音声認識結果について説明します。
例:
{
"results": [
{
"tokens": [/*...単語単位の結果..*/],
"confidence": 0.998,
"starttime": 250,
"endtime": 8794,
"tags": [],
"rulename": "",
"text": "アドバンスト・メディアは、人と機械との自然なコミュニケーションを実現し、豊かな未来を創造していくことを目指します。"
}
]
}
starttime
やendtime
は、発話区間で始めに認識された単語の話し始めと、最後に認識された単語の話し終わりの時刻を表します。送信した音声の先頭を0としたミリ秒単位の時間です。詳細は発話の開始時間を参照してください。text
はこの発話区間の音声認識の結果を表しています。confidence
は信頼度です。0から1の値をとり1に近づくほど、より確からしい結果であることを表します。tags
、rulename
は、常に空ですので無視してください。results
は配列形式ですが、常に 1 つの要素しか持ちません。
同期 HTTP インタフェース では、発話区間の結果は得られません。
単語単位の結果
単語単位の結果は、results[].tokens
に配列形式で得られます。
例:
"tokens": [
{
"written": "アドバンスト・メディア",
"confidence": 1,
"starttime": 522,
"endtime": 1578,
"spoken": "あどばんすとめでぃあ",
"label": "speaker0"
},
...
]
written
(表記)は書き起こし結果です。starttime
やendtime
は、その単語の発話された時間を表します。送信した音声の先頭を0としたミリ秒単位の時間です。WebSocketインタフェースの場合は、s
からe
までのひとつのセッション内での相対的な時間です。新たなセッションが始まるたびに基準の時間は0になります。spoken
(読み)はその単語の読みを表します。confidence
は信頼度です。0から1の値をとり1に近づくほど、より確からしい結果であることを表します。label
は話者ダイアライゼーション機能により推定された話者のラベルです。詳細は、話者ダイアライゼーションを参照してください。
インタフェースごとの結果の構造
前記の音声認識の結果がインタフェースごとにどのように得られるのかを説明します。
同期 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 インタフェース にだけある項目、
service_id
、session_id
、status
、audio_size
、audio_md5
、content_id
、については、後述の結果詳細や、利用ガイド-リクエストの方法の非同期 HTTP インタフェースを参照してください。
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
からは自動的に取り除かれます。ただし、リクエストパラメータでkeepFillerToken=1
を設定していると、削除されません。コールセンターのオペレータの話し方のチェックに使いたい場合など自動的に不要語を削除したくない場合に変更できます。
フィラー単語の前後は半角の「%」で囲まれています。
例
%あー%
%えー%
%おー%
%えーっと%
「ぱーせんと」と発話した場合は、「%」は 1 つの単語で、tokens[].written
は「%」という1文字となります。
結果に含まれる情報の詳細
全般的な情報
認識結果情報 ID (utteranceid
)
認識結果情報 ID は、WebSocket と HTTP インタフェースで異なります。WebSocket では、発話区間毎の認識結果情報に対する ID です。一方、HTTP の場合は、1 セッションでアップロードされた複数の発話区間を含む可能性のある音声データ全体の認識結果情報に対する ID となります。
全体の認識結果テキスト (text
)
発話区間の認識結果の全てを結合した全体の認識結果テキストです。
結果コード (code
)
結果を表す 1 文字のコードです。レスポンスコードとメッセージを参照してください。
認識成功時は
body.code == "" かつ body.message == "" かつ body.text != ""
認識失敗時は
body.code != "" かつ body.message != "" かつ body.text == ""
となります。
エラーメッセージ (message
)
エラー内容を表す文字列です。レスポンスコードとメッセージを参照してください。
発話区間の結果の詳細情報
信頼度 (results[].confidence
)
全体の信頼度です。値は、0 ~ 1 をとり、信頼度が低いと誤っている可能性が高く、1に近づくほどより結果が確からしいことを表します。
発話の開始時間 (results[].starttime
)
発話区間の中で、初めて話された単語の話し始めの推定時間です。送信した音声データの先頭を 0 としたミリ秒単位の時間です。
- 音声認識 API の請求は、
results[].starttime
とresults[].endtime
に基づいています。 - WebSocketインタフェースの場合は、
s
からe
までがひとつのセッションとなり、セッション内での相対的な時間を表します。新たなセッションが始まるたびに基準の時間はリセットされます。results[].endtime
に関しても同様です。 - WebSocketインタフェースの場合は、発話検出と終話検出のタイミングで
S
やE
イベントを受け取ることができます。このイベントにも時間情報が含まれていますが、この時間情報は、results[].starttime
とresults[].endtime
の値とは若干異なります。S
イベントの時間情報は、発話検出のタイミングを表します。一方、results[].starttime
はその検出された発話の中で、ひとつ目に認識された単語の話し始めの時間です。そのため、results[].starttime
はS
の時間と同じか少し後の時間になります。E
イベントの時間情報は、終話検出のタイミングを表します。一方、results[].endtime
はその検出された発話の中で、音声認識エンジンが処理を行い最後に認識した単語の時間情報です。そのため、results[].endtime
はE
の時間と同じか少し前の時間になります。
発話の終了時間 (results[].endtime
)
発話区間の中で、最後に話された単語の話し終わりの推定時間です。送信した音声データの先頭を 0 としたミリ秒単位の時間です。また、results[].starttime
の注を参照してください。
タグ (results[].tags
)
常にブランクです。現在は利用していませんので無視してください。
ルール名 (results[].rulename
)
常にブランクです。現在は利用していませんので無視してください。
音声認識結果のテキスト (results[].text
)
発話区間に含まれる音声に対する認識結果のテキストです。
単語単位の結果の詳細情報
音声認識エンジンが取り扱う単位での"単語"を意味しており、言語の文法的な単語とは異なります。
単語単位の表記 (tokens[].written
)
認識された単語の表記です。
単語単位の読み (tokens[].spoken
)
認識された単語の単語のよみです。
- 日本語エンジンの認識結果の spoken は平仮名です。
- 英語エンジンの認識結果の spoken は読みではありません(無視してください)。
- 中国語エンジンの認識結果の spoken はピンイン(pinyin)です。
単語単位の開始時間 (tokens[].starttime
)
認識された単語の単語が発話されて始めたと推定した時間で、送信した音声データの先頭を 0 としたミリ秒単位の時間です。
単語単位の終了時間 (tokens[].endtime
)
認識された単語の単語が発話し終わったと推定した時間で、送信した音声データの先頭を 0 としたミリ秒単位の時間です。
単語単位の推定話者ラベル (tokens[].label
)
話者ダイアライゼーション機能を有効にしたときにのみ得られる情報です。 話者を区別するラベル、speaker0, speaker1, ...です。
詳細は、話者ダイアライゼーションを参照してください。
単語単位の信頼度 (tokens[].confidence
)
認識された単語の信頼度です。値は、0 ~ 1 をとり、信頼度が低いと誤っている可能性が高く、1に近づくほどより結果が確からしいことを表します。
非同期 HTTP インタフェース
セッション ID (session_id
)
非同期 HTTP インタフェース に送信したジョブの ID。
非同期処理の状態 (status
)
非同期 HTTP インタフェース に送信したジョブの状態。
リクエストした音声のサイズ (audio_size
)
非同期 HTTP インタフェース が受け付けた音声のサイズ。
リクエストした音声のMD5チェックサム (audio_md
)
非同期 HTTP インタフェース が受け付けた音声の MD5 チェックサム。
コンテンツ ID (content_id
)
利用者が後からデータを紐付けるために利用できる ID。
サービス ID (service_id
)
利用者ごとに発行されているサービス ID。