Amazon Transcribe 작업
다음 예제는 Amazon Transcribe를 사용하여 양방향 스트리밍이 작동하는 방식을 보여 줍니다. 양방향 스트리밍은 서비스로 향하는 데이터 스트림과 실시간으로 다시 수신되는 데이터 스트림이 둘 다 있다는 의미입니다. 예제에서는 Amazon Transcribe 스트리밍 트랜스크립션을 사용하여 오디오 스트림을 보내고 트랜스크립션된 텍스트의 스트림을 실시간으로 다시 수신합니다.
이 기능에 대한 자세한 내용을 알아보려면 Amazon Transcribe 개발자 안내서의 스트리밍 트랜스크립션을 참조하세요.
Amazon Transcribe을 시작하려면 Amazon Transcribe 사용 설명서의 시작하기를 참조하세요.
마이크 설정
이 코드는 javax.sound.sampled 패키지를 사용하여 입력 디바이스에서 오디오를 스트리밍합니다.
코드
import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import javax.sound.sampled.TargetDataLine; public class Microphone { public static TargetDataLine get() throws Exception { AudioFormat format = new AudioFormat(16000, 16, 1, true, false); DataLine.Info datalineInfo = new DataLine.Info(TargetDataLine.class, format); TargetDataLine dataLine = (TargetDataLine) AudioSystem.getLine(datalineInfo); dataLine.open(format); return dataLine; } }
GitHub의 전체 예제
게시자 생성
이 코드는 Amazon Transcribe 오디오 스트림에서 오디오 데이터를 게시하는 게시자를 구현합니다.
코드
package com.amazonaws.transcribe; import java.io.IOException; import java.io.InputStream; import java.io.UncheckedIOException; import java.nio.ByteBuffer; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicLong; import org.reactivestreams.Publisher; import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; import software.amazon.awssdk.core.SdkBytes; import software.amazon.awssdk.services.transcribestreaming.model.AudioEvent; import software.amazon.awssdk.services.transcribestreaming.model.AudioStream; import software.amazon.awssdk.services.transcribestreaming.model.TranscribeStreamingException; public class AudioStreamPublisher implements Publisher<AudioStream> { private final InputStream inputStream; public AudioStreamPublisher(InputStream inputStream) { this.inputStream = inputStream; } @Override public void subscribe(Subscriber<? super AudioStream> s) { s.onSubscribe(new SubscriptionImpl(s, inputStream)); } private class SubscriptionImpl implements Subscription { private static final int CHUNK_SIZE_IN_BYTES = 1024 * 1; private ExecutorService executor = Executors.newFixedThreadPool(1); private AtomicLong demand = new AtomicLong(0); private final Subscriber<? super AudioStream> subscriber; private final InputStream inputStream; private SubscriptionImpl(Subscriber<? super AudioStream> s, InputStream inputStream) { this.subscriber = s; this.inputStream = inputStream; } @Override public void request(long n) { if (n <= 0) { subscriber.onError(new IllegalArgumentException("Demand must be positive")); } demand.getAndAdd(n); executor.submit(() -> { try { do { ByteBuffer audioBuffer = getNextEvent(); if (audioBuffer.remaining() > 0) { AudioEvent audioEvent = audioEventFromBuffer(audioBuffer); subscriber.onNext(audioEvent); } else { subscriber.onComplete(); break; } } while (demand.decrementAndGet() > 0); } catch (TranscribeStreamingException e) { subscriber.onError(e); } }); } @Override public void cancel() { } private ByteBuffer getNextEvent() { ByteBuffer audioBuffer; byte[] audioBytes = new byte[CHUNK_SIZE_IN_BYTES]; int len = 0; try { len = inputStream.read(audioBytes); if (len <= 0) { audioBuffer = ByteBuffer.allocate(0); } else { audioBuffer = ByteBuffer.wrap(audioBytes, 0, len); } } catch (IOException e) { throw new UncheckedIOException(e); } return audioBuffer; } private AudioEvent audioEventFromBuffer(ByteBuffer bb) { return AudioEvent.builder() .audioChunk(SdkBytes.fromByteBuffer(bb)) .build(); } } }
GitHub의 전체 예제
클라이언트 생성 및 스트림 시작
주 메서드에서 요청 객체를 만들고 오디오 입력 스트림을 시작하며 오디오 입력으로 게시자를 인스턴스화합니다.
또한 StartStreamTranscriptionResponseHandler
그런 다음 TranscribeStreamingAsyncClient의 startStreamTranscription 메서드를 사용하여 양방향 스트리밍을 시작합니다.
가져옵니다.
import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import javax.sound.sampled.TargetDataLine; import javax.sound.sampled.AudioInputStream; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.transcribestreaming.TranscribeStreamingAsyncClient; import software.amazon.awssdk.services.transcribestreaming.model.TranscribeStreamingException ; import software.amazon.awssdk.services.transcribestreaming.model.StartStreamTranscriptionRequest; import software.amazon.awssdk.services.transcribestreaming.model.MediaEncoding; import software.amazon.awssdk.services.transcribestreaming.model.LanguageCode; import software.amazon.awssdk.services.transcribestreaming.model.StartStreamTranscriptionResponseHandler; import software.amazon.awssdk.services.transcribestreaming.model.TranscriptEvent;
코드
public static void convertAudio(TranscribeStreamingAsyncClient client) throws Exception { try { StartStreamTranscriptionRequest request = StartStreamTranscriptionRequest.builder() .mediaEncoding(MediaEncoding.PCM) .languageCode(LanguageCode.EN_US) .mediaSampleRateHertz(16_000).build(); TargetDataLine mic = Microphone.get(); mic.start(); AudioStreamPublisher publisher = new AudioStreamPublisher(new AudioInputStream(mic)); StartStreamTranscriptionResponseHandler response = StartStreamTranscriptionResponseHandler.builder().subscriber(e -> { TranscriptEvent event = (TranscriptEvent) e; event.transcript().results().forEach(r -> r.alternatives().forEach(a -> System.out.println(a.transcript()))); }).build(); // Keeps Streaming until you end the Java program client.startStreamTranscription(request, publisher, response); } catch (TranscribeStreamingException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } }
GitHub의 전체 예제
추가 정보
-
Amazon Transcribe 개발자 안내서의 큐 작동 방식.
-
Amazon Transcribe 개발자 안내서의 오디오 스트리밍 시작하기를 참조하세요.