JAVA/컨셉 , 예제

구글 STT 타임스탬프(Timestamp) 예제 (Speech to text API) 로컬 파일 사용, 1분 미만 짧은 오디오 파일

minwoohi 2020. 1. 25. 18:00

구글 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

 

인증 시작하기  |  Google Cloud

이 문서에서는 Cloud API를 인증하는 권장 방법을 설명합니다. 인증은 클라이언트의 ID를 확인하는 프로세스를 의미합니다. 승인은 특정 리소스 집합에 대한 인증된 클라이언트의 권한을 확인하는 프로세스를 의미합니다. 즉, 인증은 누구인지를 확인하고 승인은 무엇을 할 수 있는지를 확인합니다. 인증에는 서비스 계정(특정 사용자가 아닌 GCP 프로젝트와 연결된 Google 계정)을 사용하는 것이 좋습니다. 서비스 계정은 사용자의 코드가 로컬, Compute

cloud.google.com

6. GOOGLE CLOUD SDK 파일 설치 및 환경 설정

https://cloud.google.com/speech-to-text/docs/quickstart-gcloud?hl=ko

 

빠른 시작: gcloud 도구 사용  |  Cloud Speech-to-Text 문서  |  Google Cloud

클릭하여 다음을 수행합니다. 프로젝트를 만들거나 선택합니다.프로젝트에 Cloud Speech-to-Text API를 사용 설정합니다.서비스 계정을 만듭니다.비공개 키를 JSON으로 다운로드합니다. 언제든지 GCP Console에서 이 리소스를 보고 관리할 수 있습니다.

cloud.google.com

 

https://cloud.google.com/sdk/docs/?hl=ko

 

Google Cloud SDK 문서  |  Cloud SDK 문서  |  Google Cloud

Google의 Cloud Platform에서 리소스를 만들고 관리할 수 있는 도구와 라이브러리를 제공합니다.

cloud.google.com

 

https://cloud.google.com/speech-to-text/docs/async-time-offsets?hl=ko#speech-async-recognize-gcs-java

 

 

단어 타임스탬프 가져오기  |  Cloud Speech-to-Text 문서  |  Google Cloud

이 페이지는 Cloud Speech-to-Text를 통해 텍스트 변환되는 오디오의 시차 값을 가져오는 방법을 설명합니다. Cloud Speech-to-Text는 recognize 요청의 응답 텍스트에 시차(타임스탬프) 값을 포함할 수 있습니다. 시차 값은 제공된 오디오에서 인식되는 각 단어의 시작 부분과 끝부분을 표시합니다. 시차 값은 오디오 시작 부분에서 경과된 시간을 100ms 단위로 나타냅니다. 시차는 특히 긴 오디오 파일을 분석하는 경우, 즉 인식

cloud.google.com

 


 
  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

 

언어 지원  |  Cloud Speech-to-Text 문서  |  Google Cloud

Cloud Speech-to-Text는 다양한 언어 중 하나를 이해할 수 있는 음성 인식 엔진을 사용합니다. 이러한 언어는 인식 요청의 languageCode 매개변수에서 지정됩니다. 각 언어 코드 매개변수는 BCP-47 식별자로 구성됩니다. 이러한 태그는 일반적으로 언어-리전 형식으로 되어 있습니다. 여기서 언어는 기본 언어를 나타내고, 리전은 특정 방언 리전(일반적으로 국가 또는 리전 식별자)을 나타냅니다. 예를 들어 영어는 미국 영어(en-US) 또

cloud.google.com

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초 내외였는데, 정확도가 나름 괜찮은 것 같다.