Google Speech-to-Text API를 활용해서 음성파일을 텍스트로 변환하자 (녹취록 받아적기 귀찮으니까)

종종 긴 대화나 인터뷰가 녹음된 파일을 듣고 녹취록을 작성해야 할 때가 있다. 귀찮게 파일을 들으면서 받아 적고 싶진 않고. 방법이 있나 찾아보다가 Google Cloud에 Speech-to-Text API가 있어서 써보기로 했다.

참고로 난 개발자가 아니다. 문과생이다. 컴퓨터 공학, 프로그래밍 같은 건 잘 모른다. 회사에서 반복적인 업무 하기 귀찮아서 파이썬을 좀 독학했는데 신기하게 그게 계속 도움이 되고 있다. 대부분의 API들은 설명서가 잘 되어 있어서 나 같은 초보도 어느정도 접근할 수 있는 영역인 것 같다. 아무튼 일단 겁먹지 말고 해보자.

Google Cloud Speech-to-Text API 주요 기능

Google Cloud Speech-to-Text API는 머신러닝 기반의 음성-텍스트 변환 기술이다. 자세한 내용은 해당 사이트를 참고하자.

어쨌든 여기서는 크게 세 가지 기능을 제공한다.

  1. 짧은(1분 미만) 오디오 파일 스크립트 작성
  2. 긴(1분 이상) 오디오 파일 스크립트 작성
  3. 스트리밍 입력에서 오디오 스크립트 작성

우선 API를 사용하려면 준비 과정이 필요한데, 다른 분들이 작성해놓은 글들을 참고해서 나도 세팅을 완료했다. 세팅 과정은 아래 블로그에도 잘 정리되어 있는 것 같으니 필요하면 참고하자.

음성인식, Google Cloud Speech-to-Text API 사용해보기

참고로 구글 클라우드 플랫폼에 가입하면 무료 크레딧 300달러를 준다. 비용이 드는 기능도 어느정도 실습해볼 수 있다.

긴 오디오 파일 스크립트를 작성하려면

내가 하려고 하는 건 ‘긴 오디오 파일 스크립트 작성‘ 이다. 짧으면 그냥 받아 쓰는 게 더 빠르잖아. 다른 사람이 사용한 후기가 있는지 구글링을 좀 해봤는데, 다른 예제는 있어도 ‘ 오디오’에 대해 한글로 작성된 후기는 못 찾았다.

우선 API 문서를 읽어보자.

https://cloud.google.com/speech-to-text/docs/async-recognize

다른 예제들은 스트리밍을 하거나 동기인식을 통해 바로 파일을 올려서 스크립트를 받아볼 수 있지만 이렇게 긴 오디오 파일의 경우에는 반드시 Google Cloud Storage에 저장된 파일로만 수행이 가능하다.

그럼 여기서 시키는 대로 하나씩 해보자.

1. 일단 오디오 파일을 준비한다.

아래는 API에서 제공하는 샘플 파이썬 코드다. 먼저 살펴보자.

def transcribe_gcs(gcs_uri):
    """Asynchronously transcribes the audio file specified by the gcs_uri."""
    from google.cloud import speech
    from google.cloud.speech import enums
    from google.cloud.speech import types
    client = speech.SpeechClient()

    audio = types.RecognitionAudio(uri=gcs_uri)
    config = types.RecognitionConfig(
        encoding=enums.RecognitionConfig.AudioEncoding.FLAC,
        sample_rate_hertz=16000,
        language_code='en-US')

    operation = client.long_running_recognize(config, audio)

    print('Waiting for operation to complete...')
    response = operation.result(timeout=90)

    # Each result is for a consecutive portion of the audio. Iterate through
    # them to get the transcripts for the entire audio file.
    for result in response.results:
        # The first alternative is the most likely one for this portion.
        print(u'Transcript: {}'.format(result.alternatives[0].transcript))
        print('Confidence: {}'.format(result.alternatives[0].confidence))

코드를 살펴 보면 config 부분에 오디오 파일 인코딩 형식, sample rate, 언어 설정이 있는 걸 알 수 있다. 이걸 잘 맞춰주지 않으면 에러가 난다.

난 오디오 파일 인코딩에 대해서 잘 몰라서 구글에 ‘오디오 파일 인코딩’이라고 검색해서 나오는 첫 번째 사이트의 도움을 빌렸다.

https://online-audio-converter.com/ko/

내가 준비한 파일은 wav파일이기 때문에 예시로 수행할 파이썬 코드도 FLAC대신 LINEAR16으로, sample rate는 16000kHz, 언어는 ko-KR로 맞췄다. (자세한 내용은 API문서를 읽어보자.)

config = types.RecognitionConfig(
    encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,
    sample_rate_hertz=16000,
    language_code='ko-KR')

그리고 샘플 코드를 보면 알 수 있지만 오디오 파일을 끌어오는 곳이 gcs uri다. 구글 클라우드 플랫폼에 파일을 저장하고 거기서 제공하는 uri라는 걸 입력하라는 뜻이다. 그럼 이제 파일을 올려보자.

2. Google Cloud Platform Storage에 오디오 파일을 올린다.

https://console.cloud.google.com/

구글 클라우드 콘솔에서 스토리지에 들어가면 ‘버킷’이라는 걸 생성할 수 있다. 뭔지 잘은 모르겠지만 일종의 폴더 같은 거겠거니 하고 speechtotext-testresources라는 이름으로 생성해 파일을 올려봤다.

잘 올라간다. 구글 드라이브랑 똑같네 뭐. 이제 이 파일의 gcs uri를 알아야 하는데 이것도 굉장히 간단하다.

gs://버킷이름/파일이름

이게 끝이다.

3. 예제 코드를 활용하여 스크립트 파일을 생성한다.

def transcribe_gcs(gcs_uri):
    from google.cloud import speech
    from google.cloud.speech import enums
    from google.cloud.speech import types

    client = speech.SpeechClient()
    audio = types.RecognitionAudio(uri=gcs_uri)
    config = types.RecognitionConfig(
        encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,
        sample_rate_hertz=16000,
        language_code='ko-KR')

    operation = client.long_running_recognize(config, audio)
    response = operation.result()

    return response

response = transcribe_gcs("gs://버킷이름/파일이름")

with open(스크립트파일이름, "w") as script:
    for result in response.results:
        script.write(u'{}'.format(result.alternatives[0].transcript)+"\n")

print("completed")

몇 번의 시행착오 끝에 녹취록 스크립트 파일이 완성되는 모습을 봤다. 내가 올린 파일은 1시간 정도 되는 대화여서 그런지 완성되는 데 시간이 꽤 걸렸다. 시간을 찍어서 보진 않았지만 15분정도 걸린 것 같다.

4. 결과를 확인하자.

예제 코드를 보면 confidence를 찍어볼 수 있도록 되어 있다. 이게 대체 무슨 자신감(?)인지 자세히 찾아보진 않았지만 어쨌든 내가 스크립트를 보고 납득이 되어야 하니까 실제 내용과 음성인식 된 내용을 비교해봤다. (실제 인터뷰 내용은 대외비라서 맨 앞부분만 발췌하여 공개한다.)

실제로 녹음된 발화 내용은 아래와 같다.

본 인터뷰에서 녹취된 내용은 인사팀을 포함한 회사측에 제공되지 않으며, 개인적인 내용에 대해서는 비밀이 철저히 유지됩니다. 응답한 내용은 전문 평가자들에 의해 코드화 평정될 것이며 코드화 내용만이 공식적으로 활용됩니다. 따라서 본 인터뷰의 목적과 관련된 내용에 대해 제한적으로 인용될 것을 약속드립니다. 인터뷰에 동의해 주시겠습니까?

구글이 변환해준 스크립트는 다음과 같다.

돈 인터뷰에서 실행해 우리 인사팀을 포함한 회사 측에 제공되지 않으며 개인적인 내용에 대해서는 비밀 철저히 됩니다 응답한 내용은 전문 평가자들의 레코드와 평점 될 것이며 코드 이용 많이 공식적으로 활용됩니다 따라서 본 인터뷰 목적어 관련된 내용에 대해 제한적으로 인형 될 것을 약속드립니다 인천의 동의해 주시겠습니까

아직은 바로 사용하긴 어렵지만 초안 정도는 작성해볼 수 있을 거 같다. 읽으면 정확하진 않아도 대충 어떤 내용이 나오는지 짐작할 수 있기 때문이다. 앞으로 시간이 흐르고 학습이 잘 이루어지면 상당히 정확도가 높아질 거라 생각한다. 아나운서들의 뉴스 진행 같은 걸 오디오 파일로 넣으면 훨씬 정확하게 나오겠지.

세부적인 파라미터를 설정할 수 있긴 한데, 본 포스트에서 자세한 내용을 다루진 않았다. 우선 이번 테스트는 오디오 파일을 텍스트로 변환할 수 있다는 데에 의의를 두자.

나도 파이썬 잘하고 싶다. 쩝…

추천 글

“Google Speech-to-Text API를 활용해서 음성파일을 텍스트로 변환하자 (녹취록 받아적기 귀찮으니까)”의 19개의 댓글

  1. 질문있는데요..
    with open(스크립트파일이름, “w”) as script:
    에서 스크립트파일이름은 어떤것을 입력해야 하는지요?
    파이썬 초초초보자 입니다.

    1. “script.txt” 이런 식으로 스크립트가 쓰여질 파일명을 입력하시면 됩니다. 이렇게 단순하게 파일명만 쓰셔도 되고, 아니면 경로까지 다 포함해서, “C:\Users\username\Desktop\script.txt” 이렇게 쓰셔도 될 거예요.

  2. 예제를 아래 것을 바꾸어 줘야 17줄, 18줄에서 들여쓰기 오류가 발생하지 않습니다. 다시 한번 좋은 정보 감사드립니다…..

    def transcribe_gcs(gcs_uri):
    from google.cloud import speech
    from google.cloud.speech import enums
    from google.cloud.speech import types
    client = speech.SpeechClient()
    audio = types.RecognitionAudio(uri=gcs_uri)
    config = types.RecognitionConfig(
    encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,
    sample_rate_hertz=16000,
    language_code=’ko-KR’)
    operation = client.long_running_recognize(config, audio)
    response = operation.result()
    return response
    response = transcribe_gcs(“gs://xxxxxxx/test.wav”)
    with open(“longsound.txt”, “w”) as script:
    for result in response.results:
    script.write(u'{}’.format(result.alternatives[0].transcript)+”\n”)
    print(“completed”)

  3. 자꾸만 남기게 되네요… 17번줄 script.write… 와 18번 줄 print를 16번 줄 for 안쪽으로 들여쓰기되어야 합니다…

  4. 녹취풀기귀찮음

    좋은 정보 감사합니다. 전 지금 DefaultCredentialsError 에서 벗어나지 못하고 있어요ㅠ
    워낙 초보라 구글에서 key 를 받았는데 어떻게 써야할지도 모르겠네요.
    이건 어떻게 하면 될까요?

    1. https://webnautes.tistory.com/1247

      이 블로그에서 안내한 대로 하셨는데
      그런 증상이 나타나는 거면 저도 잘은 모르겠네요.

      일단 json 파일을 폴더에 잘 넣어두셨는지 확인해보시고,
      환경변수 설정을 해놓았는데도 안 되는 거라면
      권한을 다시 한 번 설정해보세요.

      저는 확인해보니 이렇게 막강 권한(?)으로 설정 해놨네요.
      http://hleecaster.com/wp-content/uploads/2019/08/캡처.png

      정 안 되시면 구글 콘솔에서 프로젝트도 지우고
      아예 처음부터 다시 세팅해보는 것도…?

  5. 완성도가 높아지면 활용성이 높겠네요. 그런데 어순 등이 뒤바뀐 것으로 보아 왠지 있는 그대로의 음성인식이 아니라 번역된 느낌이 드네요

  6. 위에 댓글 정정합니다. 아마도 인식이 안되는 부분에 대한 누락으로 보이는 부분이 있는 것 같은데, 그때문에 제가 오해를 한 것 같습니다.

  7. 안녕하세요? 블로그 잘 봤습니다. 혹시 회사 홈페이지 주소를 좀 알 수 있을까요? 사업영역에 해당되면 저희도 의뢰를 드릴 부분이 있는 것 같아서요.

    1. 안녕하세요 🙂

      우선 관심 정말 감사합니다만
      제 블로그는 회사의 사업이나 입장과는 무관하기 때문에
      회사 정보를 직접 공개하는 건 조금 조심스럽네요.

      남겨주신 댓글 작성 시 남겨주신 이메일로
      조금 더 자세히 답변 드리겠습니다.

  8. 구글플랫폼어려워

    예제코드는 스크립트는 어디에 생성하는건가요? ㅠㅠ 다따라가다가 여기서 막혔네요.

    1. “스크립트파일이름”이라고 되어 있는 곳에
      “test.txt” 이런 식으로 파일명을 작성하시면
      이 파이썬 스크립트가 실행되는 경로에 생성될 거고요.
      아니면 절대경로로 (예를 들어 윈도우 바탕화면이라면)
      “C:\\Users\\사용자이름\\Desktop\\test.txt” 이런식으로 작성하실 수도 있습니다.

댓글 남기기