AIAIAIAI

음성 텍스트 변환, Long audio STT Code

summerorange 2022. 5. 1. 14:31
반응형

어젠 구글 플랫폼에서 음성 파일을 텍스트로 변환했는데, 오늘은 Colab으로 코드를 다시 뜯어보기로 했다.

뜯어볼 코드는 구글 문서에 있는 샘플 코드이다. 여기 url로 들어가면 긴 오디오 파일을 텍스트 변환하는 안내 가이드가 있다. 어젠 무수히 많은 에러로 성공하지 못했지만 오늘은 하나하나 뜯어보면서 돌리기로 했다.

저기에 있는 코드를 가지고 옴

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

    client = speech.SpeechClient()

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

    operation = client.long_running_recognize(config=config, audio=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))

이렇게 되어 있다. 이 코드를 뜯어보겠음

그럼 시작!, 우선 구글 드라이브에 연결해주었다. 이유는 구글 API Json키가 구글 드라이브에 있어서 였다. 

from google.colab import drive
drive.mount('/content/drive')

그 다음으로 환경 설정

import os
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = '/content/이키발급은이전포스팅에있어요.json'

!ls -l $GOOGLE_APPLICATION_CREDENTIALS

이런 식으로 키 있는 지점으로 연결해주면 된다. 처음엔 구글 드라이브에 키가 있어서 연결하다가 뭔가 이후에 코드에서 에러가 나서 그냥 여기 현재 디렉토리에 apiJSON 파일을 올려두었다. 사실 키가 있는 위치만 설정해주면 되긴한다. 그 다음 !ls -l로 위치 확인 아니면

!echo $GOOGLE_APPLICATION_CREDENTIALS 로 위치 확인

저기 파일 화살표 눌러서 제이슨 키 파일 업로드 해준다

다음으로 google-cloud-speech 로 설치하고 업그레이드 해주기

%pip install --upgrade google-cloud-speech

추가 설치

%pip install pydub
%pip install sox
!apt -qq install -y sox

 

from google.colab import auth
from google.cloud import storage

여기 까지는 잘 왔는데

auth.authenticate_user()
project_id = '내 프로젝트 아이디'
!gcloud config set project {project_id}
!gsutil ls
bucket_name = '내 버킷 이름'

auth.authenticate_user()로 연결해주었는데

Failed to fetch usercredentials라고 뜬다. 그래서 이 부분은 일단 지나쳤다. 에러가 났지만 일단 지나쳐보자. 뒤에 뜯어야 할 코드가 많다.

# TEST
from google.cloud import storage
project_id = '프로젝트'
bucket_name = '버킷'
storage_client = storage.Client(project_id)
blobs = storage_client.list_blobs(bucket_name)

이렇게 치고

for blob in blobs:
      print(blob.name)

버킷에 있는 이름을 확인해보니 떴다.

저기 하단에 transcripts는 이미 있는데 어제 구글 플랫폼에서 돌린 것인듯. 이 포스팅을 한다고 30분짜리 stt 여러번 돌려서 api 비용 좀 나올 것 같다... ㅋㅋㅋㅠㅠ

#from google.cloud import speech_v1
# from google.cloud.speech_v1 import enums
from google.colab import auth
from google.cloud import storage

이렇게 #처리 되어 있는 건 해보고 에러나서... speech_v1은 안먹는 것 같고, enums도 사라졌다.

from google.cloud import speech

이렇게 다시 추가해주었다. 코드를 하나하나 돌려보면 뭐가 에러고 뭐가 돌아가는지 대충 감을 잡을 수 있다. 

# client = speech_v1.SpeechClient()
client = speech.SpeechClient()

그 다음 다음과 같이 객체를 만들어 주었다. 위에 # 으로 주석 처리 된건 speech_v1로 하고 이후 돌리다가 도저히 안되서 다른 방법으로 시도했다ㅎㅎ 내 코드에는... 수많은 주석이 있다ㅋㅋㅋ 한 번에 돌아가면 정말 좋겠는데 한번에 안돌아간다. 

#44100,
config = {
      "sample_rate_hertz": 48000, 
      "language_code": "ko-KR",
      "encoding": speech.RecognitionConfig.AudioEncoding.LINEAR16,
      "audio_channel_count": 2,
  }

config는 다음과 같이 설정했다. audio_channel_count는 에러가 떠서 이렇게 지정해주어야 했다. sample_rate_herts 부분도 다른 걸로 하다가 48000하니 돌아가서 그냥 이걸로 픽스. 위에 주석 처리된 거 보면 디폴트는 44100인데 이걸로 하면 내 파일은 에러가 난다. 오디오 파일 주파수 알아야하는 것 같은데 솔직히 몰라서 되는 걸로 했음

audio = {"uri": 'gs://버킷이름/파일이름.wav'}

그 다음 구글 클라우드 버킷에 올려둔 url 주소를 다음과 같이 쳤다. 구글 클라우드 버킷 만드는 건 어제 포스팅 했다.

그 다음 돌리다가 이런 404에러가 떴다. 파라미터 까먹음

# response = client.recognize(config=config, audio=audio,)
response =client.long_running_recognize(config=config, audio=audio)

이렇게 만들어주고, 그냥 recognize(config= , audio= ) 이렇게 하니 1분 이상의 코드는 long_running_recognize로 해주어야 한다고 떴다. 그래서 다시 주석 처리하고 해당 코드를 돌리고,

response.result()

이젠 에러없이 무사히 돌아가길래 이렇게 쳐서 결과를 봤다. 참고로 response.result 라고 치면 객체만 나온다. () 괄호 빼먹지 않기. 이것 때문에 또 헤맸음ㅋㅋㅋ

드디어

이런 식으로 Json 형태로 결과값이 나왔다. 기뻐!

그럼 저걸 객체로 받아서 다시 출력해주면 된다.

response = response.result()

위의 코드와 동일하다 response라는 객체로 받았음

# response = response.result()
for result in response.results:
        alternative = result.alternatives[0]
        print(u"Transcript: {}".format(alternative.transcript))
        print("Confidence: {}".format(alternative.confidence))

이렇게 쳐주면

겨우 겨우 결과값이ㅠㅠ

결과 가 나온다. 그냥 스크립트만 본다면 저기 하단에 print("Confidence~  이 부분은 주석처리하면 된다.

메모장에 저장하기 위해서는

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

이렇게 쳐주면

이렇게 해당 스크립트만 저장할 수 있다. Confidence도 함께 작성하고 싶으면 추가해주면 된다. script.write('Confidence: {}'.result.alternatives[0].confidence) 등등.

이렇게 한 줄 한 줄 쳐보고 STT를 돌렸다. 참고로

response =client.long_running_recognize(config=config, audio=audio) 이 코드 한 줄 돌릴 때 마다 신중해져야 했다. 오디오 파일이 긴데 이걸 여러번 돌렸으니ㅋㅋㅋ 숏 버전은 api 쓰는데 결제 되지 않겠지만 long version은 api를 쓸 때 결제가 될 것이다. 보니까. 예상 요금이 나온다. 호호... 어제 텍스트 파일 만들어서 끝났는데 이상하게 코드로도 돌려보고 싶단 생각에 이렇게 여러번 돌려보게 되었다. 

 
추가로 에러: 에러 나온 것들은 다음과 같다. 에러가 정말 많이 나왔는데 특히 speech_v1 라이브러리와 관련해서ㅠㅠ 많이 나왔고, 버전 안 맞다는 에러도 있었는데 캡쳐를 못했다. 캡쳐는 에러 잡으면서 할 수 있는 것만 했었다.
 
 

400 Sync input too long. For audio longer than 1 min use LongRunningRecognize with a 'uri' parameter.

-> 이 부분은 response =client.long_running_recognize(config=config, audio=audio) 이렇게 써서 해결

이건 response = response.result() 이렇게 다시 수정해서 치고 (이 때 () 이 거 넣는 거 까먹고 돌렸을 때, )

for result in response.results: 로 하니 돌아간다. 아니면 response.result().results 일듯


끝.

반응형