リアルタイムストリーミング認識
- 印刷する
- PDF
リアルタイムストリーミング認識
- 印刷する
- PDF
記事の要約
この要約は役に立ちましたか?
ご意見ありがとうございます
最新のコンテンツが反映されていません。早急にアップデート内容をご提供できるよう努めております。最新のコンテンツ内容は韓国語ページをご参照ください。
Classic/VPC環境で利用できます。
CLOVA Speechサービスのリアルタイムストリーミングのユースケースを紹介します。
Java
Javaベースの APIのサンプルコードは次の通りです。
Project Structure
├───pom.xml │ │ └───src │ ├───main │ │ ├───java │ │ │ └───com │ │ │ └───example │ │ │ └───grpc │ │ │ GRpcClient.java │ │ │ │ │ ├───proto │ │ │ nest.proto
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>clova-speech-grpc</artifactId> <version>1.0-SNAPSHOT</version> <properties> <java.version>1.8</java.version> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <netty.version>4.1.52.Final</netty.version> <grpc.version>1.35.0</grpc.version> <protoc.version>3.14.0</protoc.version> </properties> <dependencies> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty-shaded</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> <version>1.18.12</version> </dependency> </dependencies> <build> <extensions> <extension> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.6.1</version> </extension> </extensions> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <executions> <execution> <id>compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> </execution> <execution> <id>testCompile</id> <phase>test-compile</phase> <goals> <goal>testCompile</goal> </goals> </execution> </executions> <configuration> <showDeprecation>true</showDeprecation> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> <plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>0.6.1</version> <configuration> <protocArtifact> com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier} </protocArtifact> <pluginId>grpc-java</pluginId> <pluginArtifact> io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier} </pluginArtifact> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>compile-custom</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
Java
package com.example.grpc; import java.io.FileInputStream; import java.util.concurrent.CountDownLatch; import com.google.protobuf.ByteString; import com.nbp.cdncp.nest.grpc.proto.v1.NestConfig; import com.nbp.cdncp.nest.grpc.proto.v1.NestData; import com.nbp.cdncp.nest.grpc.proto.v1.NestRequest; import com.nbp.cdncp.nest.grpc.proto.v1.NestResponse; import com.nbp.cdncp.nest.grpc.proto.v1.NestServiceGrpc; import com.nbp.cdncp.nest.grpc.proto.v1.RequestType; import io.grpc.ManagedChannel; import io.grpc.Metadata; import io.grpc.StatusRuntimeException; import io.grpc.netty.NettyChannelBuilder; import io.grpc.stub.MetadataUtils; import io.grpc.stub.StreamObserver; public class GRpcClient { public static void main(String[] args) throws Exception { CountDownLatch latch = new CountDownLatch(1); 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); StreamObserver<NestResponse> responseObserver = new StreamObserver<NestResponse>() { @Override public void onNext(NestResponse response) { System.out.println("Received response: " + response.getContents()); } @Override public void onError(Throwable t) { if(t instanceof StatusRuntimeException) { StatusRuntimeException error = (StatusRuntimeException)t; System.out.println(error.getStatus().getDescription()); } latch.countDown(); } @Override public void onCompleted() { System.out.println("completed"); latch.countDown(); } }; StreamObserver<NestRequest> requestObserver = client.recognize(responseObserver); requestObserver.onNext(NestRequest.newBuilder() .setType(RequestType.CONFIG) .setConfig(NestConfig.newBuilder() .setConfig("{\"transcription\":{\"language\":\"ko\"}}") .build()) .build()); java.io.File file = new java.io.File("~/media/42s.wav"); byte[] buffer = new byte[32000]; int bytesRead; FileInputStream inputStream = new FileInputStream(file); while ((bytesRead = inputStream.read(buffer)) != -1) { requestObserver.onNext(NestRequest.newBuilder() .setType(RequestType.DATA) .setData(NestData.newBuilder() .setChunk(ByteString.copyFrom(buffer, 0, bytesRead)) .setExtraContents("{ \"seqId\": 0, \"epFlag\": false}") .build()) .build()); } requestObserver.onCompleted(); latch.await(); channel.shutdown(); } }
Python
Pythonベースの APIのサンプルコードは次の通りです。
import grpc
import json
import nest_pb2
import nest_pb2_grpc
AUDIO_PATH = "path/to/audio/file" #認識対象のオーディオファイルがあるパスを入力してください。(16kHz、1channel、16 bits per sampleの PCM(ヘッダがない raw wave)形式)
CLIENT_SECRET = "長文認識 secretKey"
def generate_requests(audio_path):
# 初期設定リクエスト: 音声認識設定
yield nest_pb2.NestRequest(
type=nest_pb2.RequestType.CONFIG,
config=nest_pb2.NestConfig(
config=json.dumps({"transcription": {"language": "ko"}})
)
)
# オーディオファイルを開いて32,000バイトずつ読み取る
with open(audio_path, "rb") as audio_file:
while True:
chunk = audio_file.read(32000) # オーディオファイルのチャンクを読み取る
if not chunk:
break # データがなくなったらループ終了
yield nest_pb2.NestRequest(
type=nest_pb2.RequestType.DATA,
data=nest_pb2.NestData(
chunk=chunk,
extra_contents=json.dumps({"seqId": 0, "epFlag": False})
)
)
def main():
# Clova Speechサーバに対するセキュリティ gRPCチャンネルを設定
channel = grpc.secure_channel(
"clovaspeech-gw.ncloud.com:50051",
grpc.ssl_channel_credentials()
)
stub = nest_pb2_grpc.NestServiceStub(channel) # NestServiceの stubを作成
metadata = (("authorization", f"Bearer {CLIENT_SECRET}"),) # 認証トークンと一緒にメタデータを設定
responses = stub.recognize(generate_requests(AUDIO_PATH), metadata=metadata) # 作成されたリクエストで認識(recognize)メソッドを呼び出す
try:
# サーバからのレスポンスを繰り返し処理
for response in responses:
print("Received response: " + response.contents)
except grpc.RpcError as e:
# gRPCエラー処理
print(f"Error: {e.details()}")
finally:
channel.close() # 作業が終わったらチャンネルを閉じる
if __name__ == "__main__":
main()
この記事は役に立ちましたか?