Google Docs 및 머신러닝

1. 개요

이 Codelab에서는 Google Cloud Speech-to-Text API를 통해 오디오 파일을 전송한 다음 스크립트를 Google 문서에 출력하는 방법을 알아봅니다. Speech-to-Text API는 사용하기 쉬우며 강력한 신경망을 적용하여 개발자가 오디오를 텍스트로 변환할 수 있도록 지원합니다. 또한 머신러닝을 기반으로 합니다.

Google Docs API를 사용하여 새 문서를 만들고 작성합니다. Java 명령줄 애플리케이션을 만들고 Gradle 빌드 시스템을 사용하여 코드를 실행한 다음 Docs API를 사용하여 결과를 확인합니다.

학습할 내용

  • Google Cloud Speech to Text API 사용 방법
  • Google Docs API를 사용하여 새 문서를 만드는 방법
  • Docs API를 사용하여 문서에 쓰는 방법

필요한 항목

  • Java 설치 (버전 7 이상)
  • Gradle 설치 (버전 5 이상)
  • 인터넷 및 웹브라우저 액세스
  • Google 계정
  • Google Cloud Platform 프로젝트

2. 프로젝트 설정

클라우드 프로젝트 만들기

  1. Cloud 콘솔에 로그인하고 새 프로젝트를 만들거나 기존 프로젝트를 다시 사용합니다. (Gmail 또는 Workspace 계정이 없으면 만들어야 합니다.)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

모든 Google Cloud 프로젝트에서 고유한 이름인 프로젝트 ID를 기억하세요(위의 이름은 이미 사용되었으므로 사용할 수 없습니다). 이 ID는 나중에 이 Codelab에서 PROJECT_ID라고 부릅니다.

  1. 그런 후 Google Cloud 리소스를 사용할 수 있도록 Cloud Console에서 결제를 사용 설정해야 합니다.

이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 가이드를 마친 후 비용이 결제되지 않도록 리소스 종료 방법을 알려주는 '삭제' 섹션의 안내를 따르세요. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.

Cloud Speech-to-Text API의 서비스 계정 키 가져오기

60f112dedc208681.png

  1. GCP 콘솔로 이동하여 새 프로젝트를 찾습니다.
  2. 서비스 계정 만들기
  3. 서비스 계정 키를 JSON으로 다운로드
  4. 환경 변수 GOOGLE_APPLICATION_CREDENTIALS를 서비스 계정 키가 포함된 JSON 파일의 파일 경로로 설정합니다. 셸 세션을 다시 시작하는 경우 변수를 다시 설정해야 합니다.
$ export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"

예를 들면 다음과 같습니다.

$ export GOOGLE_APPLICATION_CREDENTIALS="/home/usr/downloads/ServiceAccount.json"

Docs API의 사용자 인증 정보 가져오기

  1. GCP 콘솔로 돌아가서 사용자 인증 정보로 이동합니다.
  2. OAuth 2.0 키를 만들고 JSON으로 다운로드
  3. 파일 이름을 credentials.json로 변경하고 코드의 src/main/resources/ 디렉터리에 있는지 확인합니다.

API 사용 설정

3066cf79c136a078.png

  1. 대시보드 탭을 선택하고 API 및 서비스 사용 설정 버튼을 클릭하여 다음 2개의 API를 사용 설정합니다.
  2. 음성 텍스트 변환
  3. Google Docs

846ba54aa7e1e584.png

이제 코드를 사용하여 작업을 시작할 준비가 되었습니다.

3. 코드 설정

샘플 코드 가져오기

샘플 코드를 가져오려면 컴퓨터에 zip 파일을 다운로드하거나...

...또는 명령줄에서 GitHub 저장소를 클론합니다.

$ git clone git@github.com:googleworkspace/docs-transcript-codelab.git

start 디렉터리 내의 CreateTranscript.java 파일에서 작업하게 됩니다. gradle 파일은 수정하면 안 됩니다.

디렉터리에서 start 폴더로 이동하여 CreateTranscript.java 파일을 엽니다. CreateTranscript 클래스 선언이 표시되는 위치까지 아래로 스크롤합니다.

public class CreateTranscript {
  private static final String CREDENTIALS_FILE_PATH = "/credentials.json";
  
  // Specify audio file name below.
  private static final String AUDIO_FILENAME = "audioFile.wav";
  private static final String TOKENS_DIRECTORY_PATH = "tokens";
  private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
  private static final String APPLICATION_NAME = "CreateTranscript";
  private static final List<String> SCOPES = Collections.singletonList(DocsScopes.DOCUMENTS);

SCOPES 변수에서 코드가 사용자의 Google Docs 문서를 보고 관리할 수 있다고 지정했습니다. 코드에 이 액세스 권한을 초과하거나 다른 액세스 권한이 필요한 경우 OAuth 2.0 Google API 범위에 따라 이 변수를 적절하게 조정하세요.

예를 들어 Google 문서에 작성하지 않는 경우 범위를 DOCUMENTS_READONLY로 변경할 수 있습니다. SCOPES 변수는 앱이 적절한 액세스 권한을 갖는 데 필요할 뿐만 아니라 사용자와의 투명성을 유지하는 데도 필요합니다. 사용자에게는 앱 사용에 동의해야 하는 OAuth 인증 페이지에 요청한 특정 범위가 표시됩니다.

변수 이름 바꾸기

위의 변수가 프로젝트에 맞게 올바르게 선언되었는지 확인합니다.

  1. AUDIO_FILENAME이 Speech to Text API에 전송하는 데모 파일의 이름으로 설정되어 있는지 확인합니다. CreateTranscript.java 파일에서 이미 올바르게 설정되어 있는 것을 확인할 수 있습니다.
  2. CREDENTIALS_FILE_PATH를 다운로드한 사용자 인증 정보 파일의 이름으로 바꿉니다('/credentials.json''이어야 함). 이 파일이 폴더의 src/main/resources 디렉터리 내에 있는지 확인합니다. GitHub 클론이 이를 수행하지 않는 경우 이 디렉터리를 만들어야 합니다.

이제 코드를 실행할 수 있습니다.

4. Docs 클라이언트 초기화

CreateTranscript.java 파일에서 main 메서드 선언을 찾아 내부를 살펴봅니다.

final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
Docs service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY,
    getCredentials(HTTP_TRANSPORT))
          .setApplicationName(APPLICATION_NAME)
          .build();

함수 승인

여기서 수행하는 첫 번째 작업은 Docs service (변수)를 만드는 것입니다. 서비스는 승인된 API 클라이언트를 나타내며, 사용자 인증 정보와 이 경우 최종 사용자 인증을 보유합니다.

코드에서 Docs API를 호출하는 함수는 Docs 관련 작업을 실행하기 위해 이 service 변수를 활용해야 합니다.

5. Google 문서 만들기

지정된 제목으로 새 Google 문서를 만듭니다. 따라서 createDocument 함수에서 아래 코드를 복사합니다.

Document doc = new Document().setTitle("Transcript for " +
    AUDIO_FILENAME);
doc = service.documents().create(doc).execute();
String documentId = doc.getDocumentId();
return documentId;

이 함수는 Google 문서의 Drive 파일 ID를 반환합니다. 이 ID는 문서의 URL 내에서 확인할 수 있습니다.

다음으로 Speech-to-Text 클라이언트를 초기화합니다.

6. Speech to Text API 호출

코드에서 수행할 다음 작업은 오디오 파일의 텍스트 변환된 스크립트를 가져오는 것입니다. CreateTranscript.java에서 getTranscript() 함수를 찾습니다.

먼저 오디오 파일의 경로와 오디오 바이트를 가져옵니다.

SpeechClient speech = SpeechClient.create();
Path path = Paths.get(AUDIO_FILENAME);
byte[] data = Files.readAllBytes(path);
ByteString audioBytes = ByteString.copyFrom(data);

음성 인식 구성

다음으로 RecognitionConfig 변수를 올바르게 초기화해야 합니다.

여기서 config는 음성 인식기가 요청을 정확하게 처리하는 방법에 관한 정보를 제공합니다. 예를 들어 오디오 파일이 영어 이외의 언어로 되어 있는 경우 setLanguageCode()를 수정해야 하고, 오디오 파일의 샘플링 비율이 헤르츠로 다른 경우 (1600이 최적) setSampleRateHertz()를 변경해야 합니다.

RecognitionConfig config =
    RecognitionConfig.newBuilder()
        .setEncoding(AudioEncoding.LINEAR16)
        .setLanguageCode("en-US")
        .setSampleRateHertz(8000)
        .build();
RecognitionAudio audio =
    RecognitionAudio.newBuilder().setContent(audioBytes).build();
RecognizeResponse response = speech.recognize(config, audio);
List<SpeechRecognitionResult> results = response.getResultsList();

텍스트 준비

마지막으로 오디오 파일의 스크립트 result 변수를 처리하고 문서에 삽입할 준비를 합니다.

결과의 모든 항목은 SpeechRecognitionAlternatives 유형의 스크립트입니다. 따라서 각 항목에는 텍스트 스크립트와 API의 해당 신뢰도 점수라는 두 부분이 포함됩니다.

List<Request> requests = new ArrayList<>();
for (SpeechRecognitionResult result : results) {
     // Using the first + most likely alternative transcript
     SpeechRecognitionAlternative alternative =
         result.getAlternativesList().get(0);
     String toInsert = alternative.getTranscript();

     // Add requests array list to return.
     requests.add(
         new Request()
             .setInsertText(
                 new InsertTextRequest()
                     .setText(toInsert)
                     .setEndOfSegmentLocation(new
     EndOfSegmentLocation().setSegmentId(""))));
}
return requests;

7. 문서에 텍스트 삽입

이제 스크립트 텍스트를 Google 문서에 삽입합니다. 문서를 수정하려면 BatchUpdate 메서드를 사용해야 합니다. BatchUpdate는 다양한 유형의 쓰기 요청을 위한 컨테이너이며 여기서는 InsertTextRequest를 사용합니다.

EndOfSegmentLocation는 텍스트를 인쇄할 위치를 문서에서 지정하는 중요한 매개변수입니다. 소스 코드에서 문서 본문에 텍스트를 삽입합니다.

아래 코드를 함수에 삽입하여 Speech-to-Text API 결과와 Docs API 호출을 결합하면 Google 문서에 오디오 파일의 스크립트를 삽입할 수 있는 방법을 확인해 보겠습니다.

BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest();
service.documents().batchUpdate(docId,
    body.setRequests(insertRequests)).execute();

요청 만들기

BatchUpdate 요청을 할 때 인쇄할 내용 (.setText())과 문서에서 인쇄할 위치 (.setIndex(1))라는 두 가지 매우 중요한 사양을 설정합니다.

이제 생성한 문서에 오디오 파일의 스크립트를 삽입했습니다.

8. 코드 실행

이제 오디오 파일을 가져오고, 스크립트를 가져오고, 새로 만든 Google 문서에 스크립트를 인쇄하는 데 필요한 모든 코드가 있으므로 시작해 보겠습니다.

Gradle 빌드 시스템을 사용하여 Java 코드를 실행할 것이므로 build.gradle 파일에 빌드하고 실행할 항목을 정확하게 알려야 합니다. 이 프로젝트와 다른 프로젝트에서 mainClassName가 실행하려는 Java 클래스와 일치하는지 확인합니다.

좋습니다. 이제 코드를 실행할 준비가 되었습니다. 이렇게 하려면 명령줄에 다음을 입력합니다.

$ gradle run

최종 사용자 인증

이 코드를 처음 실행하면 서비스 계정에 로그인하고 Google Docs에 대한 액세스를 승인하라는 메시지와 함께 터미널에 URL이 출력됩니다. 액세스를 허용하면 디렉터리에 새 파일이 저장됩니다.

작업 디렉터리 내에 StoredCredential 파일이 포함된 tokens라는 새로 생성된 폴더가 표시됩니다. 이는 방금 제공한 인증 토큰으로, 클라이언트가 Google 인증 서버에 요청하고 응답에서 추출했으며 이제 호출하는 API를 통해 전송됩니다.

솔루션

코드가 작동하지 않으면 CreateTranscript.java 폴더 내의 CreateTranscript.java 파일을 살펴보세요. 이 파일에는 코드가 성공적으로 실행되는 데 필요한 모든 내용이 정확하게 포함되어 있습니다.

이제 결과를 살펴보겠습니다.

9. 결과 보기

오디오 파일의 스크립트가 포함된 새 Google 문서를 만들었으므로 살펴보겠습니다.

이 문서는 최종 사용자가 승인을 제공한 계정을 통해 생성되었습니다. 한 가지 가능한 확장 기능은 Drive API를 사용하여 이 문서를 다른 사용자와 자동으로 공유할 수 있다는 것입니다.

소스 코드와 제공된 오디오 파일을 사용하면 다음과 같이 표시됩니다.

ee73fcdd1dbcdcff.png

10. 축하합니다.

이제 Google 문서를 만들고, Speech-to-Text API를 호출하고, 오디오 파일의 스크립트를 만든 문서에 출력하는 방법을 배웠습니다.

가능한 개선사항

더욱 매력적인 통합을 만드는 방법에 대한 아이디어를 소개합니다.

  • 오디오 파일이 Google Cloud Storage 버킷 Drive에 추가된 시점을 수신하고 이 코드를 실행하도록 Google Cloud 함수를 트리거하도록 코드를 설정합니다.
  • 비어 있지 않은 Google 문서에 텍스트를 삽입해 보세요.

자세히 알아보기