ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [yongggg's] Speech To Text (STT; whisper로 갖고 놀기)
    Machine & Deep Learning 2025. 3. 12. 13:24

    안녕하세요, 이번 장에는 음성을 텍스트로 바꿔주는 기술에 대해 이야기해보려고 합니다.

    STT opensource 모델인 구글의 whisper로 이를 구현해보았는데,

    mac M1 (16GB memory)에서도 돌아가니 관심이 있으시다면, 시도해보셔도 좋을 같습니다! 이제 설명 시작하겠습니다!

    1. STT

    STT는 'Speech-to-Text'의 줄임말으로 쉽게 말하자면, 사람이 말하는 소리를 듣고 그걸 텍스트로 변환해주는 기술이다.

    예를 들어, 너가 "안녕"이라고 말하면 그걸 "안녕"이라는 글자로 바꿔주는 것이다.  기술은 스마트폰 음성 비서, 회의 기록, 자막 생성 같은 데서 유용하게 쓰이며, AI 발전하면서 정확도 또한 높아져 실생활에서 점점 자주 사용되는 추세이다.

    2. Whisper Moel

    Whisper 오픈AI에서 만든 오픈소스 STT 모델이며, 영어뿐만 아니라 한국어를 포함한 여러 언어를 지원하고, 잡음이 섞인 환경에서도 알아듣는 특징이다. 개발자들이나 연구자들이 자유롭게 사용할 있게 코드도 공개돼 있어서 커뮤니티에서 계속 발전 중인 모델이다.

     

    Whisper 모델은 음성 데이터를 텍스트로 변환하는 사용되는 인코더-디코더 트랜스포머 아키텍처를 기반으로 한.

    입력 오디오가 로그- 스펙트로그램으로 변환되고, 이후  개의 1D 컨볼루션 레이어와 GELU 활성화 함수를 통해 처리된다. 이후 인코더는 셀프-어텐션과 MLP 포함한 트랜스포머 블록으로 구성되며, Sinusoidal Poisitional Encoding(가장 많이 알려져 있는 positional encoding)을 추가하여 순서 정보를 유지한다. 디코더는 self-attention, cross-attention, MLP 포함하며, 학습된 Positional Encoding 사용해 출력 순서를 관리한다. 모델은 다음 토큰 예측을 통해 텍스트를 생성한다.

    3. Multitask training format

    Whisper의 핵심 강점은 Multitask training 프레임워크에 있다. 모델은 전사, 번역, 언어 식별, 음성 활동 감지와 같은 여러 작업을 동시에 처리할 수 있다. 이를 위해 특수 토큰(예: <|startoftranscript|>, <|transcribe|>, <|translate|>, <|nospeech|>, <|endoftranscript|>을 사용하여 작업과 언어를 지정한다. 예를 들어, 영어 전사를 위해 <|startoftranscript|> < |transcribe|> < |en|>와 같은 시퀀스가 사용되며, 이 접근법은 모델이 다양한 작업에서 지식을 공유하도록 하여 일반화와 견고성을 높입니다.

    (example Detail)

    영어 전사:

    • 오디오: "Hello, how are you?"
    • 디코더 입력: <|startoftranscript|> < |transcribe|> < |en|> Hello, how are you? < |endoftranscript|>
    • 모델은 시퀀스의 토큰을 단계적으로 예측한다.

    스페인어에서 영어로 번역:

    • 오디오: "Hola, ¿cómo estás?"
    • 디코더 입력: <|startoftranscript|> < |translate|> < |en|> Hello, how are you? < |endoftranscript|>
    • 여기서 모델은 영어로 번역해야 함을 알며, 스페인어 오디오를 기반으로 영어 텍스트를 생성한다.
     

    한국어 전사:

    • 오디오: "안녕하세요"
    • 디코더 입력: <|startoftranscript|> < |transcribe|> < |ko|> 안녕하세요 < |endoftranscript|>
    • 모델은 한국어 오디오를 한국어 텍스트로 전사한다.

    음성 없음:

    • 오디오: 배경 음악
    • 디코더 입력: <|startoftranscript|> < |nospeech|> < |endoftranscript|>
    • 모델은 음성 없음을 나타내는 시퀀스를 출력한다.
    시간 정렬 전사는 "begin time", "text tokens", "end time" 토큰을 통해 지원된다. 예를 들어, 각 세그먼트에 대해 시작 시간, 텍스트, 종료 시간을 예측한다.

     

    Multitask training format은 디코더 입력에 특수 토큰 시퀀스를 사용하여 작업을 지정한다. 디코더는 이전 텍스트 컨텍스트에 50% 확률로 조건을 부여하여 모호성을 해결하는데, 이는 부분적인 전사나 컨텍스트가 이미 제공된 시나리오를 시뮬레이션하여 모델의 유연성을 높인다.

    4. youtube 동영상 STT 하기

    필자는 youtube 동영상에서 소리를 .wav 파일로 다운 받은 후, whisper의 'turbo' 사이즈 모델로 STT를 시도했다. 간단하게 만든 데모는 다음과 같다. 

    한글 뉴스임에도 불구하고 굉장히 수준 높은 STT 결과가 나온 것을 확인할 수 있다.

    try:
        model = whisper.load_model("turbo").to(device)
    except Exception as e:
        print(f"모델 로드 오류: {e}")
        model = whisper.load_model("turbo")

    model을 mac "mps" device에 올리려고 했으나, whisper 모델은 mps device 지원이 되지않은 결과로 cpu로 진행했다.

    그래도 나름 빠르게 결과를 얻을 수 있었다.

    result = model.transcribe(latest_file)
    transcribed_text = result["text"].strip()

    모델 사용은 다음과 같이 모델 정의 후, .wav 파일 경로를 transcribe 함수 안에 넣어주면 된다.

     

Designed by Tistory.