リアルタイムストリーミングの認識

Prev Next

Classic/VPC環境で利用できます。

リアルタイムで、16kHZ、1Channel、16bits per sampleの PCM(ヘッダなしの WAVファイル)形式の音声データを認識し、テキストに変換します。gRPC方式を通じてのみアクセスが可能です。

リクエスト

リクエスト形式を説明します。リクエスト形式は次の通りです。

Host Port
clovaspeech-gw.ncloud.com 50051

リクエスト手順

gRPC方式を通じて認識をリクエストする方法は次の通りです。

  1. 事前準備
  2. Config JSON
  3. 認識(Recognize)
参考

Rocky Linuxに基づいて説明します。

1. Protoc Compilerのインストールと準備

APIを使用するための事前準備のため、gRPCサイトを参照して Protoc Compilerをインストールします。インストール後、必要に応じて Pythonと Javaの中から言語を選択し、APIのインターフェースが定義された'nest.proto'ファイルを通じてCompilerを呼び出します。
Protoc Compilerをインストールして gRPCコードを生成する方法は次の通りです。

  1. Protoc Compilerをインストールするサーバにリモートアクセスします。

  2. gRPC使用のためのパッケージとプラグインをインストールします。

    • Rocky Linux: Python

      # 最新状態の確認
      sudo dnf update
      
      # Pythonのインストール: Linuxサーバに Pythonをインストールします。
      sudo dnf install python3
      
      # pipのインストールとアップグレード: pipは Python用パッケージインストールプログラムです。
      sudo dnf install python3-pip
      pip3 install --upgrade pip
      
      # grpcio-toolsのインストール: pipを使用して「grpcio-tools」をインストールします。
      pip3 install grpcio-tools
      
      # nest.protoファイルの作成
      touch nest.proto
      
      # protoc compilerで nest.protoファイルをコンパイル
      python3 -m grpc_tools.protoc -I=. --python_out=. --grpc_python_out=. nest.proto
      
    • Rocky Linux: Java

      # protoc-gen-grpc-javaプラグインのダウンロード(バージョン番号は確認が必要 https://github.com/grpc/grpc-java/releases)
      curl -OL https://repo1.maven.org/maven2/io/grpc/protoc-gen-grpc-java/1.66.0/protoc-gen-grpc-java-1.66.0-linux-x86_64.exe
      
      # PATHに追加
      mv protoc-gen-grpc-java-1.66.0-linux-x86_64.exe /usr/local/bin/protoc-gen-grpc-java
      
      # 実行権限に変更する
      chmod +x /usr/local/bin/protoc-gen-grpc-java
      
      # インストールの確認
      protoc-gen-grpc-java --version
      
      # nest.protoファイルの作成
      touch nest.proto
      
      # protoc compilerで nest.protoファイルをコンパイル
      protoc --proto_path=. --java_out=output/directory --grpc-java_out=output/directory nest.proto
      
  3. 'nest.proto'ファイルを開いて次のコードを入力し、gRPCコードを生成します。

    syntax = "proto3";
    option java_multiple_files = true;
    package com.nbp.cdncp.nest.grpc.proto.v1;
    
    enum RequestType {
      CONFIG = 0;
      DATA = 1;
    }
    
    message NestConfig {
      string config = 1;
    }
    
    message NestData {
      bytes chunk = 1;
      string extra_contents = 2;
    }
    message NestRequest {
      RequestType type = 1;
      oneof part {
        NestConfig config = 2;
        NestData data = 3;
      }
    }
    
    message NestResponse {
      string contents = 1;
    }
    service NestService {
      rpc recognize(stream NestRequest) returns (stream NestResponse){};
    }
    

2. 認証(Authorization)

Protoc Compilerで gRPCコードの生成が完了したら、認証を行います。認証は、API呼び出し時にAuthorizationヘッダに Bearerトークンを含め、サーバに対して正当性の認証を行う方式で実施します。認証を行う際は、次の点にご注意ください。

  • gRPC Channelを設定し、nest_grpc_pb2の Client Side Proxyであるstubを作成します。
  • stubの作成後、recognizeメソッドを呼び出す際に、認証キーを含むMetadata(メタデータ)を付与して実行します。
    • リアルタイムストリーミング認識 APIは Freeプランではサポートしていません。Basic長文認識プランでのみサポートしています。

認証ヘッダ

認証ヘッダは次の通りです。

ヘッダ名 説明
Authorization Bearer ${secretKey}

認証手順

認証方法は次の通りです。

Python

Rocky Linux環境にて Pythonを使用して認証を行う方法は次の通りです。

  1. Pythonファイルを作成します。ここではファイル名をmain.pyに指定しました。
    touch main.py
    
  2. main.pyに次の内容を追加します。
    import grpc
    import json
    
    import nest_pb2
    import nest_pb2_grpc
    
    channel = grpc.secure_channel(
            'clovaspeech-gw.ncloud.com:50051',
            grpc.ssl_channel_credentials()
    )
    client = NestServiceStub(channel)
    metadata = (("authorization", f"Bearer {secretKey}"),) #小文字 authorizationは必須 / secretkeyは長文認識ドメインで確認
    call = client.YourMethod(YourRequest(), metadata=metadata)
    

Java

Rocky Linux環境にて Javaを使用して認証を行う方法は次の通りです。

  1. Javaファイルを作成します。ここではファイル名をmain.javaに指定しました。
    touch main.java
    
  2. main.javaに次の内容を追加します。
    ManagedChannel channel = NettyChannelBuilder
                .forTarget("clovaspeech-gw.ncloud.com:50051")
                .useTransportSecurity()
                .build();
    NestServiceGrpc.NestServiceStub client = NestServiceGrpc.newStub(channel);
    Metadata metadata = new Metadata();
    metadata.put(Metadata.Key.of("Authorization", Metadata.ASCII_STRING_MARSHALLER),
                 "Bearer ${secretKey}");
    client = MetadataUtils.attachHeaders(client, metadata);
    

3. Config JSON

Protocで作成されたnest_pb2NestRequestオブジェクトを使ってストリーミングエンドポイントに渡される Config JSONについて説明します。Config JSONは、リアルタイムストリーミング認識 APIを初回呼び出す際に転送する必要があります。
Config JSONには、次のようなフィールドを提供しています。

  • transcription: 音声認識言語を設定
  • keywordBoosting: 入力された単語の認識率を高める設定
  • forbidden: 禁止語を設定
  • semanticEpd: 音声認識結果生成基準を設定
  • translationEpd: 翻訳時の Target言語、レスポンス受信方法などを設定

リクエストボディ

Config JSONのリクエストボディの説明は次の通りです。

Transcription

Transcriptionの説明は次の通りです。

フィールド タイプ 必須の有無 説明
language String Required 音声認識対象の言語コード
  • ko | en | ja
    • ko: 韓国語
    • en: 英語
    • ja: 日本語
参考

transcriptionは必須入力フィールドではありませんが、明確な音声認識のために設定することをお勧めします。

Keyword Boosting

Keyword Boostingフィールドの詳細は次の通りです。

フィールド タイプ 必須の有無 説明
keywordBoosting Object Optional キーワードブースト情報
  • あらかじめ登録したキーワードの認識率を高める
keywordBoosting.boostings Array Optional キーワードブースト単語の詳細情報

boostings

keywordBoosting.boostingsの説明は次の通りです。

フィールド タイプ 必須の有無 説明
words String Optional キーワードブースト単語リスト
  • 複数入力時、コンマ「,」で区切る
    • <例> "words": "test,test1,test2"
  • 単語の前後にスペース(space)を置く
weight Float Optional キーワードブーストの重み
  • 0~5.0
    • 重みが0の場合、ブーストを適用しない
  • すべてのキーワードにおける重みは同一

Forbidden

Forbiddenフィールドの詳細は次の通りです。

フィールド タイプ 必須の有無 説明
forbidden Object Optional 禁止ワード情報
  • あらかじめ登録したキーワードの認識率を下げる
forbidden.forbiddens String Optional 禁止語リスト
  • 複数入力時、コンマ「,」で区切る
    • <例> "forbiddens": "禁止語1, 禁止語2"
  • 単語の前後にスペース(space)を置く
  • 禁止語タグ: <forbidden>禁止語</forbidden>
    • 認識結果のtextキーの値にのみ追加
    • 追加されたタグは認識結果のpositionperiodPositionalignInfoには影響なし

SemanticEPD

Semantic EPDフフィールドの詳細は次の通りです。

フィールド タイプ 必須の有無 説明
semanticEpd Object Optional 音声認識結果の生成基準設定情報
semanticEpd.skipEmptyText Boolean Optional 認識結果がない結果値を転送するかどうか。この設定を trueに設定した場合、認識された音節がない認識結果は転送しません。
  • true | false (デフォルト)
    • true: 転送しない
    • false: 転送
semanticEpd.useWordEpd Boolean Optional 単語(word)で終了する認識結果を生成するかどうか。この設定を trueに設定した場合、認識結果が単語で終了するように認識結果を生成します。
  • true | false (デフォルト)
    • true: 生成
    • false: 生成しない
semanticEpd.usePeriodEpd Boolean Optional 句読点で終了する認識結果を生成するかどうか。この設定を trueに設定した場合、認識結果が句読点で終了するように認識結果を生成します。
  • true | false (デフォルト)
    • true: 生成
    • false: 生成しない
  • 句読点認識精度向上のため、usePeriodEpdtrueの場合、useWordEpdtrueに設定
semanticEpd.gapThreshold Integer Optional 認識結果生成基準の無音発生時間(ms、milliseconds)。gapThreshold以上の無音が発生すると認識結果を生成します。
  • デフォルトは0です。ユーザーが別途設定しない場合、または0以下の値に設定した場合には使用されず、ms秒単位で設定できます。
semanticEpd.durationThreshold Integer Optional 認識結果生成基準の持続時間(ms、milliseconds)。認識結果の持続時間がdurationThresholdの値より小さくなるように認識結果を生成します。
  • デフォルトは0です。ユーザーが別途設定しない場合、または0以下の値に設定した場合には、デフォルトが適用されます。適切な長さの認識結果を生成するため、ms単位で直接設定することをお勧めします。
semanticEpd.syllableThreshold Integer Optional 認識結果生成基準とする音節数。認識結果を構成する音節の数がsyllableThresholdの値より小さくなるように認識結果を生成されます。
  • 空白(" ")と句点(".")も1つの音節として処理
  • デフォルトは0です。ユーザーが別途設定しない場合、または0以下の値を設定した場合には使用しない

Translation EPD

Translation EPDフィールドの詳細は次の通りです。

フィールド タイプ 必須の有無 説明
translationEpd.targets string Required ソース言語の言語コードを入力
translationEpd.mergedResult Boolean Optional 認識結果と翻訳結果を1つのレスポンスで受信する設定
  • true | false (デフォルト)
  • trueに設定すると認識結果を生成する semanticEPDの EPD設定で翻訳結果を生成します。
    • この場合、Translation EPDの一部設定値(usePeriodEpd、gapThreshold、durationThreshold、syllableThreshold)は無視され、翻訳結果の生成に影響を与えません。
translationEpd.gapThreshold Integer Optional 認識結果生成基準の無音発生時間(ms、milliseconds)。gapThreshold以上の無音が発生すると認識結果を生成します。
  • デフォルトは2000です。0以下の値に設定した場合に使用され、ms秒単位で設定できます。
translationEpd.durationThreshold Integer Optional 認識結果生成基準の持続時間(ms、milliseconds)。認識結果の持続時間がdurationThresholdの値より小さくなるように認識結果を生成します。
  • デフォルトは20000です。0以下の値に設定するとデフォルトに設定されます。適切な長さの認識結果を生成するため、ms単位で直接設定することをお勧めします。
translationEpd.honorific Boolean Optional 敬語を適用するか
  • true | false(デフォルト)
    • true: 敬語を適用
    • false: 敬語を適用しない
  • 英語⇒韓国語、日本語⇒韓国語、中国語(簡体字/繁体字)⇒韓国語、韓国語⇒日本語、英語⇒日本語、中国語(簡体字/繁体字)⇒日本語
translationEpd.glossaryKey String Optional 用語集 ID
  • 用語集データに基づいて置換翻訳を適用
  • 韓国語⇔英語、日本語、中国語(簡体字/繁体字)、フランス語 | 英語⇔日本語、中国語(簡体字/繁体字)、ベトナム語、タイ語、インドネシア語、フランス語| 日本語⇔中国語(簡体字/繁体字)
  • 用語集の用語にはhonorific(敬語)を適用しない

リクエスト例

Config JSONのリクエストのサンプルコードは次の通りです。

#Semantic EPD    
 {
  "semanticEpd": {
    "skipEmptyText": false,           
    "useWordEpd": false,              
    "usePeriodEpd": true,             
    "gapThreshold": 2000,             
    "durationThreshold": 20000,       
    "syllableThreshold": 0            
  }
}
#Translation Info / EPD
 {
  "translation": {
    "targets": ["en"],         
    "mergedResult": False,
    "gapThreshold": 2000,      
    "durationThreshold": 20000,
    "honorific": False,      
    "glossaryKey": string
            }
         }    
#KeywordBoosting
  {
  "keywordBoosting": {                  
    "boostings": [
      {
        "words": "test,test1,test2",
        "weight": 1
      },
      {
        "words": "テスト,テスト1,テスト2",
        "weight": 0.5
      }
    ],
  },
#Forbidden
    "forbidden": {
    "forbiddens":  "禁止語1,禁止語2",
  }
}

レスポンスボディ

Config JSONのレスポンスボディの説明は次の通りです。

フィールド タイプ 必須の有無 説明
uid String - UID
responseType Array<String> - レスポンスタイプ
  • transcription | keywordBoosting | Forbidden | semanticEpd
config Object - Config JSON情報
config.status String - Config JSONのリクエスト状態
  • Success | Failure | ${message}
    • Success: リクエスト成功(gRPCに設定保存完了)
    • Failure: リクエスト失敗(エラーメッセージ)を参照
    • ${message}: top_level_keyは省略可能
config.keywordBoosting Object - キーワードブースト情報
config.keywordBoosting.status String - キーワードブーストのリクエスト状態
  • Success | Failure | ${message}
    • Success: リクエスト成功(gRPCに設定保存完了)
    • Failure: リクエスト失敗(エラーメッセージ)を参照
    • ${message}: top_level_keyは省略可能
config.forbidden Object - 要注意キーワード情報
config.forbidden.status String - 要注意キーワードのリクエスト状態
  • Success | Failure | ${message}
    • Success: リクエスト成功(gRPCに設定保存完了)
    • Failure: リクエスト失敗(エラーメッセージ)を参照
    • ${message}: top_level_keyは省略可能
config.semanticEpd Object - Semantic EPD情報
config.semanticEpd.status String - Semantic EPDのリクエスト状態
  • Success | Failure | ${message}
    • Success: リクエスト成功(gRPCに設定保存完了)
    • Failure: リクエスト失敗(エラーメッセージ)を参照
    • ${message}: top_level_keyは省略可能

エラーメッセージ

リクエスト失敗時に表示されるエラーメッセージの説明は次の通りです。

エラーメッセージ 関連フィールド 説明
Unknown key: ${top_level_key}-${unknown_key} 共通 サーバがサポートしていないサブレベルキー(Sub Level Key)を保有
Invalid type: ${top_level_key}-${invalid_type_key} 共通 サーバがサポートしていないサブレベルバリュータイプ(Sub Level Value Type)を保有
Invalid language code: ${invalid_language_code} transcription languageが事前に定義されていない言語コード
Not Authorized transcription languageが許可されていない言語コード
Targets are empty translation configリクエスト jsonに targetsが設定されていない場合
Invalid language code: ${source}:${targets} translation サポートしていない言語コードか、sourceと targetが同一の場合
Internal system error keywordBoosting サーバ内部問題が発生
Invalid request json format - 無効な JSON形式
Required key is not provided - サーバに定義された必須キー値を含まない
No more slot - 現在サーバに空きリソースがない
ConfigRequest did not complete - Config JSONリクエストの処理が完了していない状態でサーバに認識をリクエスト
Lifespan expired - gRPCサービス使用時間の期限切れ
  • 基準: 100時間
Failed to received request msg - サーバがリクエストメッセージを正常に受信できない
Model server is not working - サーバ内部エラー
Internal server error - サーバの内部エラー
RESOURCE_EXHAUSTED - gRPC接続に空きリソースがない
  • 基準: ドメインごとに15個を超過

レスポンス例

Config JSONのレスポンスのサンプルコードは次の通りです。

成功

呼び出しに成功した場合のレスポンスのサンプルコードは次の通りです。

{
  "uid": "{uid}",
  "responseType": [ "config" ],
  "config": {
    "status": "Success",
    "keywordBoosting": {
      "status": "Success"
    },
    "forbidden" : {
      "status": "Success"
    }
}

失敗

リクエストでhobiddenを入力して呼び出しが失敗した場合のレスポンスのサンプルコードは次の通りです。

{
  "uid": "{uid}",
  "responseType": [ "config" ]
  "config": {
    "status": "Unknown key: hobidden"
  }
}

4. 認識(Recognize)

Config JSONで必要な設定を行った後、recognizeを通じて音声認識 APIを呼び出し、リアルタイムで音声データを処理して認識します。Protocにて生成したコードにあるNestRequestと認証メタデータをstubのメソッドであるrecognizeを通じて音声認識 APIを呼び出す仕組みです。

リクエストボディ

Recognizeのリクエストボディの説明は次の通りです。

フィールド タイプ 必須の有無 説明
epFlag Boolean Optional 一時停止または最終認識リクエスト時のバッファおよび結果を返すタイミング
  • true | false (デフォルト)
    • true: 認識リクエストバッファを直ちに返した後、結果を返す
    • false: 10秒間追加リクエストがない場合、バッファを自動的に返した後、結果を返す
seqId Integer Conditional 認識リクエスト ID
  • epFlagtrueの場合、結果確認用途に使用
  • seqId設定後に転送しないと結果値は 0
    • 0以外の値に設定して転送することを推奨

レスポンスボディ

Recognizeのレスポンスボディの説明は次の通りです。

フィールド タイプ 必須の有無 説明
uid String - UID
responseType Array - レスポンスタイプ
  • transcription | keywordBoosting | Forbidden | semanticEpd | recognize
config Object - Config JSONフィールド情報
config.text String - 認識結果のテキスト
config.position Integer - テキスト全体における、textとして渡されたテキストの位置
config.periodPositions Array<Integer> - テキスト全体における.(句読点)の位置
  • text.がない場合、空白
config.periodAlignIndices Array<Integer> - .alignInfosインデックス情報
  • text.がない場合、空白
config.epFlag Boolean Optional リクエストにてepFlagtrueに設定して送信した音源に関する認識結果を含むか
  • true | false
    • true: 含む
    • false: 含まない
config.seqId Integer - 認識結果の最終リクエストかどうか
  • true | false
    • true: 最終認識リクエストのseqIdを返す
    • false: 0を返す
config.epdType String - 認識結果生成における EPD基準
  • gap | endPoint | durationThreshold | period | syllableThreshold | unvoice
    • gap: 無音
    • endPoint: 最後の音声データチャンク
    • durationThreshold: 再生時間
    • period: 句読点
    • syllableThreshold: 音節数
    • unvoice: unvoiceTime(サーバ設定)で処理
config.startTimestamp Integer - 認識結果の開始時刻(ms)
config.endTimestamp Integer - 認識結果の終了時刻(ms)
config.confidence Float - 認識結果の信頼度
  • 認識結果のすべての音節信頼度(alignInfos.confidence)の幾何平均値
config.alignInfos Array - 認識結果構成音節の Align情報
recognize Object - 認識(Recognize)情報
recognize.status String - 認識(Recognize)の状態
recognize.epFlag Object - epFlag情報
recognize.epFlag.status String - epFlagの状態
  • 認識(Recognize)リクエスト JSONにおいてextraContentsが無効な形式である場合、epFlag.statusまたはseqId.statusに失敗の詳細な理由が表示
  • レスポンス失敗の場合、エラーメッセージを参照
recognize.seqId Object - seqId情報
recognize.seqId.status String - seqIdの状態
  • 認識(Recognize)リクエスト JSONにおいて extraContentsが無効な形式である場合、epFlag.statusまたはseqId.statusに失敗の詳細な理由が表示
  • レスポンス失敗の場合、エラーメッセージを参照
参考

textpositionを使用して、full textを構成する例は次の通りです。

渡された順序 認識結果 full text
1 {text: "ABC", position: 0, ...} "ABC"
2 {text: "DEFG", position: 3, ...} "ABCDEFG"

alignInfos

config.alignInfosの説明は次の通りです。

フィールド タイプ 必須の有無 説明
word String - 構成音節
start Integer - 構成音節の開始時刻(ms)
end Integer - 構成音節の終了時刻(ms)
confidence Float - 構成音節の信頼度
  • 0~1.0

エラーメッセージ

Recognizeリクエスト失敗時に表示されるエラーメッセージの説明は次の通りです。

エラーメッセージ 関連フィールド 説明
Invalid Type recognize.status epFlagまたはseqIdタイプと、事前に定義されたタイプが一致しない
Required key is not provided recognize.status extraContentsepFlagの値が渡されていない
Invalid request json format recognize.status extraContentsが JSON形式ではない
Unknown key recognize.status extraContentsにプロトコルにない keyを作成
ConfigRequest is already called recognize.status サーバに Configを重複してリクエスト
Lifespan expired recognize.status gRPCサービス使用時間の期限切れ
  • 基準: 100時間
Failed to received request msg recognize.status サーバがリクエストメッセージを正常に受信できない
Model server is not working recognize.status サーバ内部問題が発生
Internal server error recognize.status サーバ内部問題が発生
Failed to translation: ${message} - 翻訳機能関連のエラー (Text Translationエラーメッセージを参照)
Invalid format recognize.status 無効なオーディオ形式が転送される
Not found epFlag.status epFlagの値が入力されていない
Invalid type epFlag.status, seqId.status 事前に定義されたタイプと一致しない
Invalid format audio.status audioフィールドが、事前に定義されたタイプと一致しない

レスポンス例

レスポンスのサンプルコードは次の通りです。

成功

呼び出しに成功した場合のレスポンスのサンプルコードは次の通りです。

  • レスポンス成功および"responseType": [ "transcription" ]の場合
{
  "uid": "{uid}"
  "responseType": [ "transcription" ]
  "transcription": {
    "text": "これはテキストです。",
    "position": 0,
    "periodPositions": [3],
    "periodAlignIndices": [3],
    "epFlag": false,
    "seqId": 0,
    "epdType": "durationThreshold",
    "startTimestamp": 190,
    "endTimestamp": 840,
    "confidence": 0.997389124199423,
    "alignInfos": [
      {"word":"これは","start":190,"end":340,"confidence":0.9988637124943075},
      {"word":"テキスト","start":341,"end":447,"confidence":0.9990018488549978},
      {"word":"です","start":448,"end":580,"confidence":0.9912501264550316},
      {"word":".","start":581,"end":700,"confidence":0.9994397226648595},
      {"word":" ","start":701,"end":840,"confidence":0.9984142043105126}
    ]
  }
}

失敗

呼び出しに失敗した場合のレスポンスのサンプルコードは次の通りです。

{
  "uid": string,                     # required
  "responseType": [ "recognize" ],    # required
  "recognize": {                     # required
    "status": string,                # required
    "epFlag": {                      # optional
      "status": string
    },
    "seqId": {                       # optional
      "status": string
    },
    "audio": {                       # op
      "status": 
    }
  }
}

5. その他の API

現在有効化状態の Stub呼び出し数と、ドメインの許可された最大 Stub数などを照会します。

curl --location 'https://clovaspeech-gw.ncloud.com:50051/api/v1/1064/active-calls' \
--header 'Authorization: Bearer ${API_KEY}'

レスポンス

レスポンスパラメータ

パラメータ名 必須の有無 タイプ 制限事項 説明
activeCalls - Integer 0~999 現在有効化状態の Stub呼び出し数
MaxCalls - Integer 0~999 ドメインに許可された最大 Stub数
Timestamp - String yyyyMMddHHmmss データ生成時間

レスポンス例

{
    "activeCalls": 3,
    "maxCalls": 15,
    "timestamp": "2025-04-25T12:09:27.382+09:00"
}