구글 STT 타임스탬프(Timestamp) 예제 (Speech to text API) 로컬 파일 사용, 1분 미만 짧은 오디오 파일
구글 STT 사용 예제. 짧은 음원 파일에서 텍스트 및 해당 텍스트 나온 시간까지 캐치할 수 있다
JAVA 1.8, 윈도우 환경에서 진행했고, 동영상 파일에서 음원 추출한 파일을 파라미터로 사용했다.
STT 사용하기 위해 구글 클라우드 플랫폼 등록해야 하는데 그 과정은 구글링하면 많이 나와 생략. 간단하게 순서만 말하자면
1. 구글 계정 생성
2. 구글 클라우드 플랫폼 결제방식 등록 (카드 번호)
> 체험판 사용 가능하지만 나중에 비용 발생
3. 프로젝트 생성 및 활성화
4. IAM 설정 및 인증서 발급 (JSON 파일)
5. GOOGLE CREDENTIAL 환경 설정 ( 4번에서 IAM 설정시 발급받은 JSON 파일)
> 사용 권한 및 비용 산정 위해
https://cloud.google.com/docs/authentication/getting-started?hl=ko
6. GOOGLE CLOUD SDK 파일 설치 및 환경 설정
https://cloud.google.com/speech-to-text/docs/quickstart-gcloud?hl=ko
https://cloud.google.com/sdk/docs/?hl=ko
com.google.cloud
google-cloud-speech
1.22.0
메이븐 디펜던시 추가.
> google.cloud.speech 패키지 사용 가능
예제 코드 그대로 사용하면 되는데, RecognitionConfig 객체만 내 조건에 맞게 변경하면 된다.
인코딩 언어(setLanguegeCode), 타임스탬프 (setEnableTimeOffsets) 를 달리 했다.
인코딩 언어는 다음 페이지에서 확인 가능
https://cloud.google.com/speech-to-text/docs/languages?hl=ko
import com.google.cloud.speech.v1.RecognitionAudio;
import com.google.cloud.speech.v1.RecognitionConfig;
import com.google.cloud.speech.v1.RecognitionConfig.AudioEncoding;
import com.google.cloud.speech.v1.RecognizeResponse;
import com.google.cloud.speech.v1.SpeechClient;
import com.google.cloud.speech.v1.SpeechRecognitionAlternative;
import com.google.cloud.speech.v1.SpeechRecognitionResult;
import com.google.protobuf.ByteString;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public void transcription()
throws Exception {
whoAmi = Thread.currentThread().getStackTrace()[1].toString();
JSONObject obj = new JSONObject();
String res = "";
// 음원파일 경로
String filePath = File.separator + "var" + File.separator + "stt" + File.separator "example.flac";
try (SpeechClient speech = SpeechClient.create()) {
Path path = Paths.get(filePath);
byte[] data = Files.readAllBytes(path);
ByteString audioBytes = ByteString.copyFrom(data);
// Configure request with local raw PCM audio
RecognitionConfig config =
RecognitionConfig.newBuilder()
.setEncoding(AudioEncoding.FLAC)
.setLanguageCode("ko-KR")
.setSampleRateHertz(16000)
.setEnableWordTimeOffsets(true)
.build();
RecognitionAudio audio = RecognitionAudio.newBuilder().setContent(audioBytes).build();
// Use blocking call to get audio transcript
RecognizeResponse response = speech.recognize(config, audio);
List results = response.getResultsList();
for (SpeechRecognitionResult result : results) {
// There can be several alternative transcripts for a given chunk of speech. Just use the
// first (most likely) one here.
SpeechRecognitionAlternative alternative = result.getAlternativesList().get(0);
System.out.printf("Transcription: %s%n", alternative.getTranscript());
for (WordInfo wordInfo : alternative.getWordsList()) {
System.out.println(wordInfo.getWord());
System.out.printf(
"\t%s.%s sec - %s.%s sec\n",
wordInfo.getStartTime().getSeconds(),
wordInfo.getStartTime().getNanos() / 100000000,
wordInfo.getEndTime().getSeconds(),
wordInfo.getEndTime().getNanos() / 100000000);
}
}
} catch (Exception e) {
}
}
메소드 수행하면 한글로 읽어온다. jtbc 뉴스 파일 15초 내외였는데, 정확도가 나름 괜찮은 것 같다.