Classic/VPC環境で利用できます。
リアルタイムで、16kHZ、1Channel、16bits per sampleの PCM(ヘッダなしの WAVファイル)形式の音声データを認識し、テキストに変換します。gRPC方式を通じてのみアクセスが可能です。
リクエスト
リクエスト形式を説明します。リクエスト形式は次の通りです。
| Host | Port |
|---|---|
| clovaspeech-gw.ncloud.com | 50051 |
リクエスト手順
gRPC方式を通じて認識をリクエストする方法は次の通りです。
Rocky Linuxに基づいて説明します。
1. Protoc Compilerのインストールと準備
APIを使用するための事前準備のため、gRPCサイトを参照して Protoc Compilerをインストールします。インストール後、必要に応じて Pythonと Javaの中から言語を選択し、APIのインターフェースが定義された'nest.proto'ファイルを通じてCompilerを呼び出します。
Protoc Compilerをインストールして gRPCコードを生成する方法は次の通りです。
-
Protoc Compilerをインストールするサーバにリモートアクセスします。
-
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
-
-
'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を使用して認証を行う方法は次の通りです。
- Pythonファイルを作成します。ここではファイル名を
main.pyに指定しました。touch main.py 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を使用して認証を行う方法は次の通りです。
- Javaファイルを作成します。ここではファイル名を
main.javaに指定しました。touch main.java 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_pb2のNestRequestオブジェクトを使ってストリーミングエンドポイントに渡される Config JSONについて説明します。Config JSONは、リアルタイムストリーミング認識 APIを初回呼び出す際に転送する必要があります。
Config JSONには、次のようなフィールドを提供しています。
- transcription: 音声認識言語を設定
- keywordBoosting: 入力された単語の認識率を高める設定
- forbidden: 禁止語を設定
- semanticEpd: 音声認識結果生成基準を設定
- translationEpd: 翻訳時の Target言語、レスポンス受信方法などを設定
リクエストボディ
Config JSONのリクエストボディの説明は次の通りです。
Transcription
Transcriptionの説明は次の通りです。
| フィールド | タイプ | 必須の有無 | 説明 |
|---|---|---|---|
language |
String | Required | 音声認識対象の言語コード
|
transcriptionは必須入力フィールドではありませんが、明確な音声認識のために設定することをお勧めします。
Keyword Boosting
Keyword Boostingフィールドの詳細は次の通りです。
| フィールド | タイプ | 必須の有無 | 説明 |
|---|---|---|---|
keywordBoosting |
Object | Optional | キーワードブースト情報
|
keywordBoosting.boostings |
Array | Optional | キーワードブースト単語の詳細情報 |
boostings
keywordBoosting.boostingsの説明は次の通りです。
| フィールド | タイプ | 必須の有無 | 説明 |
|---|---|---|---|
words |
String | Optional | キーワードブースト単語リスト
|
weight |
Float | Optional | キーワードブーストの重み
|
Forbidden
Forbiddenフィールドの詳細は次の通りです。
| フィールド | タイプ | 必須の有無 | 説明 |
|---|---|---|---|
forbidden |
Object | Optional | 禁止ワード情報
|
forbidden.forbiddens |
String | Optional | 禁止語リスト
|
SemanticEPD
Semantic EPDフフィールドの詳細は次の通りです。
| フィールド | タイプ | 必須の有無 | 説明 |
|---|---|---|---|
semanticEpd |
Object | Optional | 音声認識結果の生成基準設定情報 |
semanticEpd.skipEmptyText |
Boolean | Optional | 認識結果がない結果値を転送するかどうか。この設定を trueに設定した場合、認識された音節がない認識結果は転送しません。
|
semanticEpd.useWordEpd |
Boolean | Optional | 単語(word)で終了する認識結果を生成するかどうか。この設定を trueに設定した場合、認識結果が単語で終了するように認識結果を生成します。
|
semanticEpd.usePeriodEpd |
Boolean | Optional | 句読点で終了する認識結果を生成するかどうか。この設定を trueに設定した場合、認識結果が句読点で終了するように認識結果を生成します。
|
semanticEpd.gapThreshold |
Integer | Optional | 認識結果生成基準の無音発生時間(ms、milliseconds)。gapThreshold以上の無音が発生すると認識結果を生成します。
|
semanticEpd.durationThreshold |
Integer | Optional | 認識結果生成基準の持続時間(ms、milliseconds)。認識結果の持続時間がdurationThresholdの値より小さくなるように認識結果を生成します。
|
semanticEpd.syllableThreshold |
Integer | Optional | 認識結果生成基準とする音節数。認識結果を構成する音節の数がsyllableThresholdの値より小さくなるように認識結果を生成されます。
|
Translation EPD
Translation EPDフィールドの詳細は次の通りです。
| フィールド | タイプ | 必須の有無 | 説明 |
|---|---|---|---|
translationEpd.targets |
string | Required | ソース言語の言語コードを入力
|
translationEpd.mergedResult |
Boolean | Optional | 認識結果と翻訳結果を1つのレスポンスで受信する設定
|
translationEpd.gapThreshold |
Integer | Optional | 認識結果生成基準の無音発生時間(ms、milliseconds)。gapThreshold以上の無音が発生すると認識結果を生成します。
|
translationEpd.durationThreshold |
Integer | Optional | 認識結果生成基準の持続時間(ms、milliseconds)。認識結果の持続時間がdurationThresholdの値より小さくなるように認識結果を生成します。
|
translationEpd.honorific |
Boolean | Optional | 敬語を適用するか
|
translationEpd.glossaryKey |
String | Optional | 用語集 ID
|
リクエスト例
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> | - | レスポンスタイプ
|
config |
Object | - | Config JSON情報 |
config.status |
String | - | Config JSONのリクエスト状態
|
config.keywordBoosting |
Object | - | キーワードブースト情報 |
config.keywordBoosting.status |
String | - | キーワードブーストのリクエスト状態
|
config.forbidden |
Object | - | 要注意キーワード情報 |
config.forbidden.status |
String | - | 要注意キーワードのリクエスト状態
|
config.semanticEpd |
Object | - | Semantic EPD情報 |
config.semanticEpd.status |
String | - | Semantic EPDのリクエスト状態
|
エラーメッセージ
リクエスト失敗時に表示されるエラーメッセージの説明は次の通りです。
| エラーメッセージ | 関連フィールド | 説明 |
|---|---|---|
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サービス使用時間の期限切れ
|
Failed to received request msg |
- | サーバがリクエストメッセージを正常に受信できない |
Model server is not working |
- | サーバ内部エラー |
Internal server error |
- | サーバの内部エラー |
RESOURCE_EXHAUSTED |
- | gRPC接続に空きリソースがない
|
レスポンス例
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 | 一時停止または最終認識リクエスト時のバッファおよび結果を返すタイミング
|
seqId |
Integer | Conditional | 認識リクエスト ID
|
レスポンスボディ
Recognizeのレスポンスボディの説明は次の通りです。
| フィールド | タイプ | 必須の有無 | 説明 |
|---|---|---|---|
uid |
String | - | UID |
responseType |
Array | - | レスポンスタイプ
|
config |
Object | - | Config JSONフィールド情報 |
config.text |
String | - | 認識結果のテキスト |
config.position |
Integer | - | テキスト全体における、textとして渡されたテキストの位置 |
config.periodPositions |
Array<Integer> | - | テキスト全体における.(句読点)の位置
|
config.periodAlignIndices |
Array<Integer> | - | .のalignInfosインデックス情報
|
config.epFlag |
Boolean | Optional | リクエストにてepFlagをtrueに設定して送信した音源に関する認識結果を含むか
|
config.seqId |
Integer | - | 認識結果の最終リクエストかどうか
|
config.epdType |
String | - | 認識結果生成における EPD基準
|
config.startTimestamp |
Integer | - | 認識結果の開始時刻(ms) |
config.endTimestamp |
Integer | - | 認識結果の終了時刻(ms) |
config.confidence |
Float | - | 認識結果の信頼度
|
config.alignInfos |
Array | - | 認識結果構成音節の Align情報 |
recognize |
Object | - | 認識(Recognize)情報 |
recognize.status |
String | - | 認識(Recognize)の状態
|
recognize.epFlag |
Object | - | epFlag情報 |
recognize.epFlag.status |
String | - | epFlagの状態
|
recognize.seqId |
Object | - | seqId情報 |
recognize.seqId.status |
String | - | seqIdの状態
|
textとpositionを使用して、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 | - | 構成音節の信頼度
|
エラーメッセージ
Recognizeリクエスト失敗時に表示されるエラーメッセージの説明は次の通りです。
| エラーメッセージ | 関連フィールド | 説明 |
|---|---|---|
Invalid Type |
recognize.status |
epFlagまたはseqIdタイプと、事前に定義されたタイプが一致しない |
Required key is not provided |
recognize.status |
extraContentsのepFlagの値が渡されていない |
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サービス使用時間の期限切れ
|
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"
}