Skip to content

필사 모드: 음성 모델 고르기: STT와 TTS의 실전 기준

한국어
0%
정확도 0%
💡 왼쪽 원문을 읽으면서 오른쪽에 따라 써보세요. Tab 키로 힌트를 받을 수 있습니다.

모델 정보는 2026-08-12에 Hugging Face 페이지에서 직접 확인했습니다. 모델 카드와 라이선스는 바뀔 수 있으니 사용 전 원본을 다시 확인하세요.

음성은 요구사항이 모델보다 먼저 정해집니다

텍스트 모델은 일단 붙여 보고 품질을 비교할 수 있지만 음성은 그렇게 되지 않습니다. 어떤 언어를 받는지, 오디오가 얼마나 긴지, 결과가 몇 초 안에 나와야 하는지, 화자를 구분해야 하는지가 먼저 정해지고 나면 후보가 대부분 저절로 걸러집니다.

그래서 이 글은 모델을 나열하기 전에 그 네 가지 축부터 정리합니다. 카드가 제공하는 값 대부분이 이 축에 직접 대응하기 때문입니다.

STT: 다국어가 필요한 경우

저장소license크기언어카드에 적힌 제약
openai/whisper-large-v3apache-2.01550M99개 언어30초 수용 영역, 긴 오디오는 순차 또는 청크 알고리즘 필요
openai/whisper-large-v3-turbomit809M99개 언어디코딩 층이 32에서 4로 감소, 기본 상태로 실시간 전사용은 아님
nvidia/canary-1b-flashcc-by-4.0883M영어, 독일어, 프랑스어, 스페인어40초 미만 오디오를 대상으로 설계, 타임스탬프는 실험적 기능

두 Whisper 변형의 라이선스 표기가 서로 다르다는 점을 놓치기 쉽습니다. openai/whisper-large-v3apache-2.0, openai/whisper-large-v3-turbomit으로 표기됩니다. 같은 계열이라고 같은 조건이 아닙니다.

openai/whisper-large-v3-turbo 카드는 훨씬 빠른 대신 품질이 약간 떨어진다고 직접 적습니다. 어느 쪽을 고를지는 오탈자 하나가 어떤 비용을 만드는지에 달려 있습니다. 자막 초안이라면 속도가, 의료 기록이나 법적 근거라면 정확도가 우선입니다.

nvidia/canary-1b-flash는 영어와 독일어·프랑스어·스페인어 사이의 번역을 양방향으로 지원한다고 적습니다. 다만 40초 미만 오디오를 대상으로 설계되었고, 특수문자를 처리하지 않으며 역정규화가 필요할 수 있다고 카드가 밝힙니다.

STT: 영어에서 속도와 길이가 필요한 경우

nvidia/parakeet-tdt-0.6b-v2cc-by-4.0에 6억 파라미터이고, FastConformer 인코더와 TDT 디코더 구조라고 적혀 있습니다. 이 모델의 실무적 강점은 카드가 명시한 두 가지입니다. 한 번에 최대 24분 길이의 오디오 구간을 전사할 수 있고, 문자·단어·구간 단위 타임스탬프를 지원한다는 점입니다.

대신 언어는 영어 하나입니다. 그리고 NVIDIA NeMo 설치가 필요하다고 카드가 적습니다. 파이프라인이 transformers만으로 구성되어 있다면 런타임 하나를 더 들이는 결정이 됩니다. 카드는 전사가 100퍼센트 정확하지는 않으며 언어와 입력 오디오 특성에 따라 정확도가 달라진다고도 밝힙니다.

실시간이라는 말을 정확히 쪼개기

실시간이 필요하다는 요구는 대개 세 가지 중 하나입니다. 발화가 끝나기 전에 중간 결과가 보여야 하거나, 발화가 끝난 뒤 1초 안에 최종 결과가 나와야 하거나, 회의가 끝난 뒤 몇 분 안에 전체 결과가 나오면 되는 경우입니다.

Whisper 계열은 세 번째에 가장 잘 맞습니다. openai/whisper-large-v3 카드는 30초 수용 영역을 명시하고 긴 오디오에는 순차 또는 청크 알고리즘이 필요하다고 적으며, openai/whisper-large-v3-turbo 카드는 기본 상태로 실시간 전사를 위해 설계된 것은 아니라고 직접 적습니다. 첫 번째 요구가 진짜라면 모델 선택보다 스트리밍 구조 설계가 먼저입니다.

배포 형식도 지연에 영향을 줍니다. Systran/faster-whisper-large-v3openai/whisper-large-v3ct2-transformers-converter로 CTranslate2 형식으로 변환한 저장소이고, 가중치는 FP16으로 저장되어 있으며 CTranslate2의 compute_type 옵션으로 바꿀 수 있다고 적혀 있습니다. 같은 모델이라도 런타임이 다르면 지연 특성이 달라진다는 뜻입니다.

화자 분리는 별도의 모델입니다

회의록을 만든다면 받아쓰기만으로는 절반입니다. 누가 말했는지를 나누는 것은 다른 모델의 일입니다.

pyannote/speaker-diarization-3.1mit으로 표기되고, 16kHz 모노를 전제로 하며 스테레오나 다채널은 평균을 내어 자동으로 모노로 합치고 다른 샘플링 레이트는 자동으로 16kHz로 재변환한다고 적혀 있습니다. 화자 수는 num_speakers, min_speakers, max_speakers 옵션으로 조절할 수 있습니다.

이 저장소는 접근 조건에 동의하고 연락처를 공유해야 파일을 받을 수 있습니다. 자동 배포 파이프라인을 짜기 전에 확인해야 하는 항목입니다.

TTS: 목소리를 어디서 가져오는가

저장소license크기언어카드에 적힌 특징
hexgrad/Kokoro-82Mapache-2.082M8개 언어, 54개 음성StyleTTS 2 구조에 ISTFTNet 보코더, 디코더만 공개
coqui/XTTS-v2coqui-public-model-license명시되어 있지 않음17개 언어, 한국어 포함6초 오디오로 음성 복제, 교차 언어 복제
SWivid/F5-TTScc-by-nc-4.0명시되어 있지 않음페이지에 명시되어 있지 않음학습 데이터로 Emilia 데이터셋을 표기
microsoft/speecht5_ttsmit명시되어 있지 않음페이지에 명시되어 있지 않음화자 x-vector 임베딩과 별도 보코더 필요

TTS를 고를 때 첫 질문은 목소리를 어디서 가져오느냐입니다. hexgrad/Kokoro-82M처럼 미리 준비된 음성 목록에서 고르는 방식이라면 결정이 단순합니다. coqui/XTTS-v2처럼 6초짜리 참조 오디오로 복제하는 방식이라면, 그 6초를 어떻게 확보했고 그 화자가 동의했는지가 기술 문제보다 먼저 걸립니다.

microsoft/speecht5_tts는 구조 자체가 조립식입니다. 카드가 화자 x-vector 임베딩을 넣어야 하고 microsoft/speecht5_hifigan 보코더를 함께 불러와야 한다고 적습니다. 저장소 하나를 붙이면 끝나는 형태가 아니라는 뜻이고, 지원 언어를 포함해 편향·위험·한계·평가 데이터 항목이 카드에서 More Information Needed로 남아 있습니다.

SWivid/F5-TTS는 페이지에 지원 언어와 기능 설명이 명시되어 있지 않습니다. 이 글은 그 빈칸을 기억으로 채우지 않았습니다. 실제로 쓰려면 연결된 코드 저장소와 논문을 직접 확인해야 합니다.

음성 모델의 경고는 장식이 아닙니다

음성은 다른 어떤 모달리티보다 카드의 경고가 곧 설계 제약이 되는 영역입니다.

openai/whisper-large-v3 카드는 예측에 실제로 말해지지 않은 문장이 포함될 수 있다고 명시하고, 반복적인 텍스트를 생성하는 경향과 언어별로 성능이 고르지 않다는 점을 함께 적습니다. 같은 카드는 동의 없이 녹음된 음성을 전사하지 말라고 하고, 의사결정 같은 고위험 영역에 배치하지 말라고 씁니다. openai/whisper-large-v3-turbo 카드도 억양과 방언에 따라 성능이 달라진다는 점을 덧붙입니다.

이 문장들은 그대로 요구사항이 됩니다. 환각 가능성이 명시된 모델의 출력을 사람 검토 없이 확정 기록으로 삼으면 안 되고, 녹취 동의 절차가 없는 서비스는 모델 선택 이전에 설계가 잘못된 것입니다. hexgrad/Kokoro-82M 카드가 허용된 비저작권 오디오만으로 학습했다고 밝히고 이 모델을 사칭하는 가짜 사이트를 경고하는 것도 같은 맥락입니다.

코드 예시

# 예시: 긴 오디오를 청크 방식으로 전사합니다
from transformers import pipeline

asr = pipeline(
    "automatic-speech-recognition",
    model="openai/whisper-large-v3-turbo",
    chunk_length_s=30,
    return_timestamps=True,
)

result = asr("meeting.wav", generate_kwargs={"language": "korean"})
for chunk in result["chunks"][:3]:
    print(chunk["timestamp"], chunk["text"])

화자 분리는 별도 파이프라인으로 붙여 결과를 시간축에서 합칩니다.

# 예시: 화자 구간을 얻어 전사 결과와 시간축에서 맞춥니다
from pyannote.audio import Pipeline

diarizer = Pipeline.from_pretrained(
    "pyannote/speaker-diarization-3.1",
    use_auth_token="hf_...",
)

for turn, _, speaker in diarizer("meeting.wav").itertracks(yield_label=True):
    print(f"{turn.start:.1f}-{turn.end:.1f}", speaker)

고를 때의 순서

  1. 대상 언어를 확정합니다. 영어 단일이면 후보가 크게 달라집니다.
  2. 오디오 길이 분포를 봅니다. 카드에 적힌 수용 영역과 권장 길이를 넘는지 확인합니다.
  3. 실시간 요구를 세 가지 중 어느 것인지로 다시 씁니다.
  4. 화자 분리가 필요하면 별도 모델과 게이트 조건을 함께 계획합니다.
  5. 음성 복제를 쓴다면 동의와 권리 확인 절차를 기술 결정보다 앞에 둡니다.
  6. 카드의 환각·편향 경고를 그대로 사람 검토 절차 요구사항으로 옮겨 적습니다.

직접 해보기

시리즈 안내

참고 자료

  • 표의 모든 값은 2026-08-12에 해당 모델의 Hugging Face 페이지에서 직접 읽었습니다. 페이지에 없던 항목은 명시되어 있지 않음으로 적었습니다.
  • SWivid/F5-TTS의 지원 언어와 기능은 페이지에 명시되어 있지 않아 이 글에 적지 않았습니다.
  • 라이선스 전문을 직접 읽고, 상업적 사용은 법무 검토를 거치세요.

현재 단락 (1/63)

모델 정보는 2026-08-12에 Hugging Face 페이지에서 직접 확인했습니다. 모델 카드와 라이선스는 바뀔 수 있으니 사용 전 원본을 다시 확인하세요.

작성 글자: 0원문 글자: 4,605작성 단락: 0/63