These docs are for v1.0.19. Click to read the latest docs for v1.0.25.

WebSocket Service

この項では音声認識の WebSocket API について述べます。

接続情報

URL: wss://service.mimi.fd.ai

概要

音声認識 の WebSocket API では、以下のサービスが利用できます。

  • mimi ASR: 日本語音声認識
  • mimi ASR powered by NICT: 多言語音声認識 ( NICT )
  • Google™ Cloud Speech-to-Text: 多言語音声認識( Google API 連携 ※ 別途契約が必要

リクエストのパラメータは HTTP リクエストヘッダとして送ってください。

音声認識は、入力音声に対して認識した結果(=応答)を JSON 形式で受け取ることができます。
その JSON 形式の応答の構成と応答取得回数は、利用するサービスによって異なります。

詳しくは後述の "API Reference" および "応答例" を参照ください。

認証

WebSocket APIサービスをご利用の際には実行したいサービスに対応するスコープ( スコープ一覧 )を指定して発行したアクセストークンが必要です。
mimi API Console 画面からの操作で取得するには トークンの取得 を参照ください。
APIの実行で取得するには 認証/認可操作 を参照ください。

クエリ文字列でのリクエスト

ブラウザ上で WebSocket API を利用する場合等、 HTTP ヘッダを使った実行時設定の指定ができない場合は、 HTTP ヘッダの代わりにクエリ文字列を使って実行時設定を指定することができます。
クエリ文字列による HTTP ヘッダの代替 の記述を参照ください。

API Reference

音声認識 API の詳細な情報については、API Reference を参照ください。

実行

以下は libmimiio 付属のサンプルプログラム mimiio_file を使用した WebSocket サービスの利用例です。

実行例

下記のタブ切り替えで mimi ASR 、mimi ASR powered by NICT (v1) の実行例 および mimiio_file のヘルプ を確認できます。
※ mimi ASR powered by NICT で 応答フォーマットを指定するオプション については mimiio_file は未対応です。

./mimiio_file \
-h service.mimi.fd.ai \
-x asr \
-p 443 \
-t 95818632-ad20-431b-b7e7-2d509d8f29d9 \
-i $HOME/dev/libmimiio/examples/audio.raw
./mimiio_file \
-h service.mimi.fd.ai \
-x nict-asr \
-p 443 \
-t 95818632-ad20-431b-b7e7-2d509d8f29d9 \
-i $HOME/dev/libmimiio/examples/audio.raw
need option: --host
need option: --input
need option: --port
​
usage: mimiio_file --host=string --port=int --input=string [options] ...
options:
 -h, --host             Host name (string)
 -p, --port             Port (int)
 -i, --input            Input file s(string)
 -t, --token            Access token (string [=])
   --rate               Sampling rate (int [=16000])
   --channel            Number of channels (int [=1])
   --format             Audio format (string [=MIMIIO_RAW_PCM])
 -l, --input_language   input language (string [=ja])
 -x, --process          x-mimi-process (string [=asr])
   --lid_options        language identifier options (string [=lang=ja|en|zh|ko])
   --verbose            Verbose mode
   --help               Show help
​
Acceptable audio formats:
  MIMIIO_RAW_PCM
  MIMIIO_FLAC_0
  MIMIIO_FLAC_1
  MIMIIO_FLAC_2
  MIMIIO_FLAC_3
  MIMIIO_FLAC_4
  MIMIIO_FLAC_5
  MIMIIO_FLAC_6
  MIMIIO_FLAC_7
  MIMIIO_FLAC_8
  MIMIIO_FLAC_PASS_THROUGH

応答例

以下は、mimi ASRと mimi ASR powered by NICT それぞれの応答例とその構成内容についての簡易な説明です。実行例に記載の無い、mimi ASR powered by NICT で応答フォーマットを指定した場合の応答例も挙げています。応答結果の詳細については "API Reference" を参照してください。

# 応答 JSON の要素
#   "response" : 応答配列(認識結果は配列で返されます),
#       "pronunciation" : 認識結果のテキストの発音
#       "result" :  認識結果のテキスト
#       "time" : 開始時刻と終了時刻(音声データの始点を起点とした時刻(ミリ秒))
#   "session_id" : セッションID
#   "status" : 音声認識のステータス
#   "type" : 音声認識の型
#

{ "response" : [
  { 
    "pronunciation" : "チョット", 
    "result" : "ちょっと", 
    "time" : [ 1350, 1800 ] 
  }, { 
    "pronunciation" : "オソイ", 
    "result" : "遅い", 
    "time" : [ 1800, 2160 ] 
  } ], 
  "session_id" : "f7f10c90-e661-11e9-8f10-42010a9200a5", 
  "status" : "recog-in-progress", 
  "type" : "asr#mimilvcsr" 
}
:
// (中略) : 認識処理途中で複数回応答が返ってくる
:
{ 
  "response" : [
    { 
     "pronunciation" : "チョット", 
     "result" : "ちょっと", 
     "time" : [ 1350, 1800 ] 
    }, {
      "pronunciation" : "オソイ", 
      "result" : "遅い", 
      "time" : [ 1800, 2170 ] 
    }, {
      "pronunciation" : "チューショク", 
      "result" : "昼食",
      "time" : [ 2170, 2730 ]
    }, {
      "pronunciation" : "ヲ", 
      "result" : "を", 
      "time" : [ 2730, 2850 ]
    }, {
      "pronunciation" : "トル", 
      "result" : "とる", 
      "time" : [ 2850, 3090 ]
    }, { 
      "pronunciation" : "タメ", 
      "result" : "ため", 
      "time" : [ 3090, 3370 ] 
    }, { 
      "pronunciation" : "ニ",
      "result" : "に", 
      "time" : [ 3370, 3480 ] 
    }, { 
      "pronunciation" : "ファミリー",
      "result" : "ファミリー",
      "time" : [ 3480, 4000 ]
    }, { 
      "pronunciation" : "レストラン", 
      "result" : "レストラン", 
      "time" : [ 4000, 4530 ] 
    }, { 
      "pronunciation" : "ニ",
      "result" : "に", 
      "time" : [ 4530, 4620 ]
    }, { 
      "pronunciation" : "ハイッ", 
      "result" : "入っ",
      "time" : [ 4620, 4960 ]
    }, { 
      "pronunciation" : "タ", 
      "result" : "た",
      "time" : [ 4960, 5060 ] 
    }, { 
      "pronunciation" : "ノ", 
      "result" : "の", 
      "time" : [ 5060, 5180 ] 
    }, { 
      "pronunciation" : "デス", 
      "result" : "です", 
      "time" : [ 5180, 5630 ]
    }
  ],
  "session_id" : "f7f10c90-e661-11e9-8f10-42010a9200a5",
   "status" : "recog-finished", 
   "type" : "asr#mimilvcsr" 
}
# 以下の一連のJSONは、カスタムヘッダにて以下を指定した場合のサンプルです。
# x-mimi-nict-asr-options: response_format=v2;progressive=false;temporary=true;temporary_interval=1500
#
# mimi ASR同様、最終結果前の一時結果が返却され、最後のみ確定した結果(最終結果)が返却されます。
#
# 応答 JSON の要素
#   "response" : 応答配列(認識結果は配列で返されます),
#       "result" :  認識結果のテキスト
#       "determined" : 確定した結果かどうか
#       "time" : 該当応答の発話中における開始時刻刻(ミリ秒)
#   "session_id" : セッションID
#   "status" : 音声認識のステータス
#   "type" : 音声認識の型

{
    "type": "asr#nictlvcsr2",
    "session_id": "978966fc-286d-4779-a2f5-d460ab8914e5",
    "status": "recog-in-progress",
    "response": [
        {
            "result": "ちょっと",
            "words": [
                "ちょっと"
            ],
            "determined": false,
            "time": 0
        }
    ]
}

{
    "type": "asr#nictlvcsr2",
    "session_id": "978966fc-286d-4779-a2f5-d460ab8914e5",
    "status": "recog-in-progress",
    "response": [
        {
            "result": "ちょっと遅い昼食をとる",
            "words": [
                "ちょっと",
                "遅い",
                "昼食",
                "を",
                "とる"
            ],
            "determined": false,
            "time": 0
        }
    ]
}

{
    "type": "asr#nictlvcsr2",
    "session_id": "978966fc-286d-4779-a2f5-d460ab8914e5",
    "status": "recog-in-progress",
    "response": [
        {
            "result": "ちょっと遅い昼食をとるためファミリーレストランに",
            "words": [
                "ちょっと",
                "遅い",
                "昼食",
                "を",
                "とる",
                "ため",
                "ファミリーレストラン",
                "に"
            ],
            "determined": false,
            "time": 0
        }
    ]
}

{
    "type": "asr#nictlvcsr2",
    "session_id": "978966fc-286d-4779-a2f5-d460ab8914e5",
    "status": "recog-in-progress",
    "response": [
        {
            "result": "ちょっと遅い昼食をとるためファミリーレストランに入ったの",
            "words": [
                "ちょっと",
                "遅い",
                "昼食",
                "を",
                "とる",
                "ため",
                "ファミリーレストラン",
                "に",
                "入っ",
                "た",
                "の"
            ],
            "determined": false,
            "time": 0
        }
    ]
}

{
    "type": "asr#nictlvcsr2",
    "session_id": "978966fc-286d-4779-a2f5-d460ab8914e5",
    "status": "recog-finished",
    "response": [
        {
            "result": "ちょっと遅い昼食をとるためファミリーレストランに入ったのです。",
            "words": [
                "ちょっと",
                "遅い",
                "昼食",
                "を",
                "とる",
                "ため",
                "ファミリーレストラン",
                "に",
                "入っ",
                "た",
                "の",
                "です"
            ],
            "determined": true,
            "time": 0
        }
    ]
}
# 以下の一連のJSONは、カスタムヘッダにて以下を指定した場合のサンプルです。
# x-mimi-nict-asr-options: response_format=v2;progressive=true;temporary=true;temporary_interval=1500
#
# progressive=trueの指定をすると、最終結果より前に "確定した部分結果" が返却されます。
# "確定した部分結果" とは "determined": true となる応答を指します。
#
# 応答 JSON の要素
#   "response" : 応答配列(認識結果は配列で返されます),
#       "result" :  認識結果のテキスト
#       "determined" : 確定した結果かどうか
#       "time" : 該当応答の発話中における開始時刻刻(ミリ秒)
#   "session_id" : セッションID
#   "status" : 音声認識のステータス
#   "type" : 音声認識の型

{
    "type": "asr#nictlvcsr2",
    "session_id": "a36cf472-9afc-4b29-8353-04303604364e",
    "status": "recog-in-progress",
    "response": [
        {
            "result": "ちょっと",
            "words": [
                "ちょっと"
            ],
            "determined": false,
            "time": 0
        }
    ]
}

{
    "type": "asr#nictlvcsr2",
    "session_id": "a36cf472-9afc-4b29-8353-04303604364e",
    "status": "recog-in-progress",
    "response": [
        {
            "result": "ちょっと遅い昼食をとる",
            "words": [
                "ちょっと",
                "遅い",
                "昼食",
                "を",
                "とる"
            ],
            "determined": false,
            "time": 0
        }
    ]
}

{
    "type": "asr#nictlvcsr2",
    "session_id": "a36cf472-9afc-4b29-8353-04303604364e",
    "status": "recog-in-progress",
    "response": [
        {
            "result": "ちょっと遅い",
            "words": [
                "ちょっと",
                "遅い"
            ],
            "determined": true,
            "time": 0
        }
    ]
}

{
    "type": "asr#nictlvcsr2",
    "session_id": "a36cf472-9afc-4b29-8353-04303604364e",
    "status": "recog-in-progress",
    "response": [
        {
            "result": "昼食をとるためファミリーレストランに",
            "words": [
                "昼食",
                "を",
                "とる",
                "ため",
                "ファミリーレストラン",
                "に"
            ],
            "determined": false,
            "time": 1380
        }
    ]
}

{
    "type": "asr#nictlvcsr2",
    "session_id": "a36cf472-9afc-4b29-8353-04303604364e",
    "status": "recog-in-progress",
    "response": [
        {
            "result": "昼食をとるためファミリーレストランに入ったの",
            "words": [
                "昼食",
                "を",
                "とる",
                "ため",
                "ファミリーレストラン",
                "に",
                "入っ",
                "た",
                "の"
            ],
            "determined": false,
            "time": 1380
        }
    ]
}

{
    "type": "asr#nictlvcsr2",
    "session_id": "a36cf472-9afc-4b29-8353-04303604364e",
    "status": "recog-in-progress",
    "response": [
        {
            "result": "昼食をとるためファミリーレストランに",
            "words": [
                "昼食",
                "を",
                "とる",
                "ため",
                "ファミリーレストラン",
                "に"
            ],
            "determined": true,
            "time": 1380
        }
    ]
}

{
    "type": "asr#nictlvcsr2",
    "session_id": "a36cf472-9afc-4b29-8353-04303604364e",
    "status": "recog-finished",
    "response": [
        {
            "result": "入ったのです。",
            "words": [
                "入っ",
                "た",
                "の",
                "です"
            ],
            "determined": true,
            "time": 4140
        }
    ]
}
# 応答 JSON の要素
#   "type" : 音声認識の型
#   "session_id" : セッションID
#   "status" : 音声認識のステータス
#   "response" : 応答配列(認識結果は配列で返されます)
#       "result" : 認識結果のテキスト | 認識結果のテキストの発音| ...(パイプ区切りの情報)
#

{
  "type": "asr#nictlvcsr",
  "session_id": "058720ce-e65d-11e9-ae3b-42010a92008f",
  "status": "recog-finished",
  "response": [
    {
      "result": "ちょっと|チョット|ちょっと|副詞-助詞類接続||||"
    },
    {
      "result": "遅い|オソイ|遅い|形容詞-自立|形容詞・アウオ段|基本形||"
    },
    {
      "result": "昼食|チュウショク|昼食|名詞-一般||||"
    },
    {
      "result": "を|ヲ|を|助詞-格助詞-一般||||"
    },
    {
      "result": "とる|トル|とる|動詞-自立|五段・ラ行|基本形||"
    },
    {
      "result": "ため|タメ|ため|名詞-非自立-副詞可能||||"
    },
    {
      "result": "ファミリーレストラン|ファミリーレストラン|ファミリーレストラン|名詞-一般||||"
    },
    {
      "result": "に|ニ|に|助詞-格助詞-一般||||"
    },
    {
      "result": "入っ|ハイッ|入る|動詞-自立|五段・ラ行|連用タ接続||"
    },
    {
      "result": "た|タ|た|助動詞|特殊・タ|基本形||"
    },
    {
      "result": "の|ノ|の|名詞-非自立-一般||||"
    },
    {
      "result": "です|デス|です|助動詞|特殊・デス|基本形||"
    },
    {
      "result": "|||SENT-START-END||||"
    },
    {
      "result": "|||UTT-END||||"
    }
  ]
}

🚧

サードパーティの WebSocket ライブラリを使う場合の注意

  • 現時点では、 mimi サーバーは RFC6455 の 5.4 項の Fragmentation に対応しておりません。クライアントは fragmented frames を送信しないでください。

  • HTTP リクエストヘッダにアクセストークンの値を設定してアクセスすることで、実行時に特定のサービスだけを実行させることができます。 実行時に受け付けるサービスについての値設定に関する詳細情報は項目パラメータを参照ください。

  • ASR の種類によって応答の形式やタイミングが異なります。WebSocket で mimi ASR を指定して音声認識を行う場合、指定の音声データの認識処理の途中経過のテキストをリアルタイムで取得することができます。WebSocket で mimi ASR powered by NICT を指定して音声認識を行う場合、認識処理が完了した後でテキストを取得することができます。