일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Flask
- 과일종류예측
- 서버
- ubuntu
- 스파르타코딩클럽
- Linux
- html
- Django
- Ubuntu2004
- KoBERT
- 가장쉽게배우는머신러닝
- AWS
- 우분투2004
- Custom Classes
- Kaggle
- FastAPI
- 모델적응
- ajax
- EC2
- KoBART
- jquery
- Transfer_Learning
- UbuntuServer
- 4주차
- Phrase Sets
- Model Adaptations
- mnist
- keras
- Google Speech To Text
- model
- Today
- Total
영웅은 죽지 않는다
[Google Cloud] Speech-To-Text의 모델 적응 기능 활용해 STT 성능 높이기 본문
[Google Cloud] Speech-To-Text의 모델 적응 기능 활용해 STT 성능 높이기
YoungWoong Park 2022. 10. 27. 13:14
음성 녹음 파일 속 자연어처리 모델을 구체화하는 단계에서
STT 성능이 우선적으로 우수해야 한다는 생각에 성능 개선 방안을 모색하던 도중
구글 클라우드 내에서 자체적으로 제공하는 기능을 활용하기로 결정했다
가장 먼저 알아보았던 전화 고급 모델(phone_call)을 활용하는 부분은
지원 언어를 알아보니 한국어는 적용이 불가능했다 ㅠ
결국 한국어도 지원이 가능한 Model Adaptation Client라는 기능을 활용하기로 결정
Model Adaptation Client
레퍼런스를 참고해보면, 모델 적응 기능은 오디오 데이터를 텍스트로 변경하는 STT의 과정에서
특정 단어가 인식될 확률, 즉 단어 인식률을 높이는 것을 목적으로 한다
초기에는 오탈자를 수정하는 로직인가 싶었으나, 이는 단어를 수정하는 것이 아니라
특정 단어와 발음이 비슷한 여러 단어들에 대해, 모델 적응 기능에 등록된 단어에 가중치를 더 부여하여
해당 단어로 인식될 확률을 높여주는 것으로 보인다
ex) 바너나, 버나나, 바나너, 버너나 -----> "바나나"
모델 적응 기능은 아래와 같이 크게 두 가지로 나뉜다
1. Custom Class
자연어에서 발생하는 다양한 단어들에 대해, 자신의 프로젝트에 맞게끔 단어 인식을 편향되게 조절하는 기능이다.
예를 들어 "티스토리" 라는 단어의 경우 STT 모델에서 자체적으로 학습하지는 못한 단어일 것이기에
"티스토리"와 비슷한 단어가 인식된다고 하더라도 "티스트 리", "티슈 트리" 등 다양한 형태로 인식될 가능성이 높다
하지만 Custom Class의 Resource로 "티스토리"를 등록해 놓게 되면,
"티스토리"와 비슷한 형태의 단어가 인식될 시 올바르게 인식하게끔 가중치를 두어 편향을 유도하는 것이다
특히 이는 고유명사에 대해 강력한 기능을 보이는 것으로 판단된다.
자체적으로 전문 용어나 고유명사가 많이 존재하는 프로젝트를 진행하는 경우 이 기능이 필수적이라고 할 수 있다.
2. Phrase Sets
Phrase는 구(句)를 뜻하는데, 이는 둘 또는 그 이상의 어절로 이루어져 한 덩어리로서 절이나 문장의 성분이 되는 통사적인 말의 단위이다. 즉, 여기서는 간단히 문장 성분이라고 보면 된다.
구문 집합(Phrase Sets)에는 구의 value 값으로 custom class 값을 포함하고, 그 값을 마스킹한 문장이 들어간다.
레퍼런스에 나와있는 예시를 살펴보면
"나는 1월에 태어났습니다"
"나는 2월에 태어났습니다"
이처럼 미리 빌드된 형식이 있는 구문인 경우, $MONTH 클래스를 이용해
"나는 ${MONTH}월에 태어났습니다" 처럼 커스텀 단어를 마스킹하여 phrase set을 정의할 수 있다.
특정 커스텀된 값을 내포한 문장이 value값으로 들어가게 되는 것인데, 레퍼런스에서는 이를 Hint가 포함된 구 라고 표현하기도 한다.
이는 특정 단어에 대해, 그 값이 한 단어가 아닌 전체 문장의 맥락 구조에 따라 인식/변경되어야 하는 경우 적용하는 기능인 것으로 판단한다
적용 예시 (Python)
Custom Class와 Phrase Sets을 생성하고 적용하는 코드는 Python이 유일하다
(참고 : Model Adapation 기능은 google-cloud-speech 2.x 이상의 버전부터 적용이 가능하다. 2.x 미만의 버전인 경우 AttributeError: module 'google.cloud.speech_v1p1beta1' has no attribute 'AdaptationClient' 에러가 발생하니 참고)
구글 클라우드 레퍼런스에서 제공하는 기본 코드 샘플을 활용해 적용해 보았다.
코드 샘플은, Custom Class와 Phrase Sets을 생성하고 바로 적용하는 코드인데
나는 생성API와 적용API을 따로 분할하여 사용하고 싶었다
더불어 두 모델 적응 기능에 각 class와 phrase을 추가하는 것에 있어서,
여러개의 class, 여러개의 phrase가 포함된 속성(Resource)을 생성/삭제하는 기능은 있지만
수정하는 기능은 발견하지 못했다
그래서 실시간 혹은 주기적으로 데이터를 업데이트 해야하는 경우
해당 Resource를 삭제한 후 재생성하는 코드를 작성했다
- Custom Sets, Phrase Sets 생성 (또는 초기화)
import os
from google.cloud import speech_v1p1beta1 as speech
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "{KEY_PATH}"
def transcribe_with_model_adaptation(
project_id, location, storage_uri, ws_id
):
"""
Create`PhraseSet` and `CustomClasses` to create custom lists of similar
items that are likely to occur in your input data.
"""
# Create the adaptation client
adaptation_client = speech.AdaptationClient()
# The parent resource where the custom class and phrase set will be created.
parent = f"projects/{project_id}/locations/{location}"
# Delete the adaptation client
try:
# Phrase Sets 존재 시 삭제
request = speech.DeletePhraseSetRequest(
name=parent + f"/phraseSets/{ws_id}"
)
adaptation_client.delete_phrase_set(
request=request
)
print("Phrase Set Delete success :", ws_id)
except Exception as e:
print(e)
pass
try:
# Custom Class 존재 시 삭제
request = speech.DeleteCustomClassRequest(
name=parent + f"/customClasses/{ws_id}"
)
adaptation_client.delete_custom_class(
request=request
)
print("Custom Class Delete success :", ws_id)
except Exception as e:
print(e)
pass
items = [
{"value": "토마토"},
{"value": "애플"},
{"value": "바나나"},
{"value": "멜론"},
]
# Create the custom class resource
adaptation_client.create_custom_class(
{
"parent": parent,
"custom_class_id": ws_id,
"custom_class": {
"items": items
},
}
)
custom_class_name = (
f"projects/{project_id}/locations/{location}/customClasses/{ws_id}"
)
# Create the phrase set resource
phrase_set_response = adaptation_client.create_phrase_set(
{
"parent": parent,
"phrase_set_id": ws_id,
"phrase_set": {
"boost": 10,
"phrases": [
{"value": f"내가 제일 좋아하는 과일은 ${{{custom_class_name}}}입니다",
"boost": 20},
],
},
}
)
phrase_set_name = phrase_set_response.name
# The next section shows how to use the newly created custom
# class and phrase set to send a transcription request with speech adaptation
# Speech adaptation configuration
speech_adaptation = speech.SpeechAdaptation(phrase_set_references=[phrase_set_name])
# speech configuration object
config = speech.RecognitionConfig(
encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16,
sample_rate_hertz=8000,
language_code="ko-KR",
adaptation=speech_adaptation,
)
# The name of the audio file to transcribe
# storage_uri URI for audio file in Cloud Storage, e.g. gs://[BUCKET]/[FILE]
audio = speech.RecognitionAudio(uri=storage_uri)
# Create the speech client
speech_client = speech.SpeechClient()
response = speech_client.recognize(config=config, audio=audio)
for result in response.results:
print("Transcript: {}".format(result.alternatives[0].transcript))
- KEY_PATH : 구글 클라우드에서 인증 정보 json 파일을 다운받고, 파일 경로를 입력
- project_id : 구글 클라우드 프로젝트에 나와 있는 프로젝트 번호 입력
- location : 데이터 세트 위치 (일반적으로 global)
- storage_url : 음성 파일 (.wav)
- ws_id : 각 사업장 또는 프로젝트 별 공간 id를 입력
각 프로젝트 별로 적용해야 하는 Customizing과 Phrase가 다르기 때문에,
하나의 클라우드 프로젝트 내에서 세부 프로젝트를 분할하여 사용했다
이후 본인의 구글 클라우드 Speech-to-Text 프로젝트에 들어가서
Model Adaptations 항목에 Phrase Sets와 Custom Classes를 확인해본다
오류가 없다면 잘 추가가 된 것을 확인할 수 있다
또는 자동화 모듈을 만드는 것이 아니라면, 클라우드 GUI 상으로 직접 추가, 수정, 삭제가 가능하기도 하니
각자 목적에 맞게 잘 사용할 것
그러나 내가 생각하기에 이 Model Adaptations 기능의 최대 단점은
디버깅이 조금은 애매하다는 것
나는 일부러 틀리게 STT된 녹음 파일을 적용해서
이게 잘 바뀌는지 테스트해보려고 했는데
일단 특정 단어에 대해 조금은 비스무리하게, 하지만 인식은 틀리게 되게끔 말하는 것도 쉽지 않았고
한번 디버깅 하는 것이 되게 번거로웠다
그래서 오히려 맞는 단어를 비슷한 틀린 말로 입력하게 되면
그게 그 "틀린 말"로 잘 바뀌는지를 테스트 하는 방식으로 디버깅을 했었는데
모델의 내부 코드나 알고리즘은 알 수 없어서 검토는 필요하겠으나
결과는 좋았음!
'Programming > Machine Learning' 카테고리의 다른 글
딥러닝 때려 부수기 - 전이 학습(TL), 캐글 데이터를 이용한 과일 종류 예측 모델 (0) | 2021.08.19 |
---|---|
딥러닝 때려 부수기 - 합성곱 신경망(CNN), 캐글 데이터를 이용한 수화 알파벳(MNIST) 분류 모델 (0) | 2021.08.18 |
딥러닝 때려 부수기 - 신경망 개념&스킬, 캐글 데이터를 이용한 XOR문제 해결 (0) | 2021.08.14 |
머신러닝 때려 부수기 - 캐글 데이터를 이용한 논리 회귀(Logistic Regression), 전처리(Preprocessing) (0) | 2021.08.01 |
머신러닝 때려 부수기 - 캐글 데이터를 이용한 선형 회귀 (Linear Regression) (0) | 2021.07.23 |