민팽로그

과제02-Google Cloud : Speech-to-Text API(2) 본문

프로젝트/소리마당(2022 프로보노)

과제02-Google Cloud : Speech-to-Text API(2)

민팽 2021. 8. 20. 15:07

동기식 음성 인식

동기식 짧은 음성파일(wav파일)을 2가지 방법으로 텍스트로 바꾸어 보았다. 두 방식 모두 큰 차이는 없다.

우선 다시 언급하자면

구글 stt 음성인식 방법으로는 크게 동기, 비동기, 스트리밍 방식이 있고, 오늘 사용할 동기식 음성인식은 1분 미만의 짧은 음성 파일을 텍스트로 변환하는데에 사용한다.


주의할 점: RecognitionConfig 과정이 텍스트 변환에 상당한 영향을 끼친다. 내가 녹음한 파일의 확장자는 m4a 였고, wav로 변환하는 과정에서 sampling rate와 채널 수를 확실하게 하기 위해 오디오 파일 변환 도구를 사용했다. 특히 sampling rate가 일치하지 않을때 텍스트로 변환이 안됐는데 오류메세지가 뜨지 않을 수도 있다.


1. local파일 동기 음성 인식

import com.google.cloud.speech.v1.RecognitionAudio;
import com.google.cloud.speech.v1.RecognitionConfig;
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.cloud.speech.v1.RecognitionConfig.AudioEncoding;
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 class LocalTest {
	
	public static void main(String[] args) throws Exception {
		
		try (SpeechClient speech = SpeechClient.create()) {
		    Path path = Paths.get(로컬파일 경로 입력);
		    byte[] data = Files.readAllBytes(path);
		    ByteString audioBytes = ByteString.copyFrom(data);

		    // Configure request with local raw PCM audio
		    RecognitionConfig config =
		        RecognitionConfig.newBuilder()
		            .setEncoding(AudioEncoding.LINEAR16)
		            .setLanguageCode("ko-KR")
		            .setSampleRateHertz(44100) //사용하는 음성파일 샘플링 레이트로 설정
		            .build();
		    RecognitionAudio audio = RecognitionAudio.newBuilder().setContent(audioBytes).build();

		    // Use blocking call to get audio transcript
		    RecognizeResponse response = speech.recognize(config, audio);
		    List<SpeechRecognitionResult> results = response.getResultsList();
		    for (SpeechRecognitionResult result : results) {
		      // 텍스트로 전환된 여러 스크립트 중 첫번째가 가장 정확할 것
		      SpeechRecognitionAlternative alternative = result.getAlternativesList().get(0);
		      System.out.printf("Transcription: %s%n", alternative.getTranscript());  
		    }
		}
	}
}

- 결과 -

제대로 인식함

 

 

 

2. remote파일 동기 음성 인식

import java.util.List;

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;

public class RemoteTest {

   public static void main(String[] args) throws Exception{
      // TODO Auto-generated method stub
        try (SpeechClient speech = SpeechClient.create()) {
          // 원격파일 셋팅
          RecognitionConfig config =
              RecognitionConfig.newBuilder()
                  .setEncoding(AudioEncoding.LINEAR16)
                  .setLanguageCode("ko-KR")
                  .setSampleRateHertz(44100) //사용하는 음성파일 샘플링 레이트로 설정
                  .build();
          RecognitionAudio audio = RecognitionAudio.newBuilder().setUri(구글클라우드저장소 주소입력).build();

          // Use blocking call for getting audio transcript
          RecognizeResponse response = speech.recognize(config, audio);
          List<SpeechRecognitionResult> results = response.getResultsList();

          for (SpeechRecognitionResult result : results) {
            // 텍스트로 전환된 여러 스크립트 중 첫번째가 가장 정확할 것
            SpeechRecognitionAlternative alternative = result.getAlternativesList().get(0);
            System.out.printf("Transcription: %s%n", alternative.getTranscript());
          } 
        }catch(Exception e) {
             System.out.println("failed: " + e);
          }
   }

}

(1) 1분 미만의 파일 입력 결과

제대로 인식함

(2) 1분 이상의 파일 입력 결과

동기 방식일 때 1분 이상의 긴 파일은 잘못된 입력이라는 오류 메세지가 나온다.

 

Comments