Skip to content

Split View: 음성 모델 고르기: STT와 TTS의 실전 기준

✨ Learn with Quiz
|

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

모델 정보는 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의 지원 언어와 기능은 페이지에 명시되어 있지 않아 이 글에 적지 않았습니다.
  • 라이선스 전문을 직접 읽고, 상업적 사용은 법무 검토를 거치세요.

Choosing Speech Models: Practical Criteria for STT and TTS

Model details were read directly from the Hugging Face pages on 2026-08-12. Model cards and licenses change, so check the original again before you use anything.

In Speech, Requirements Come Before Models

With text models you can wire something up and compare quality afterwards. Speech does not work that way. Once you fix which languages come in, how long the audio runs, how many seconds you have before a result is needed, and whether speakers must be separated, most candidates fall away on their own.

So this post sorts out those four axes before listing models, because most of the values a card provides map directly onto them.

STT: When You Need Multiple Languages

RepositorylicenseSizeLanguagesConstraints as stated
openai/whisper-large-v3apache-2.01550M99 languages30-second receptive field; long audio needs sequential or chunked algorithms
openai/whisper-large-v3-turbomit809M99 languagesDecoding layers reduced from 32 to 4; not designed for real-time transcription out of the box
nvidia/canary-1b-flashcc-by-4.0883MEnglish, German, French, SpanishDesigned for audio smaller than 40 seconds; timestamps are an experimental feature

It is easy to miss that the two Whisper variants carry different license tags. openai/whisper-large-v3 is marked apache-2.0 and openai/whisper-large-v3-turbo is marked mit. Same family does not mean same terms.

The openai/whisper-large-v3-turbo card states plainly that the model is way faster at the expense of a minor quality degradation. Which side you take depends on what a single misheard word costs. For a subtitle draft, speed; for a medical record or legal evidence, accuracy.

nvidia/canary-1b-flash states it supports translation between English and German, French, or Spanish in both directions. But the card also states it is designed for audio smaller than 40 seconds, that it does not handle special characters, and that it may need inverse text normalization.

STT: When English Needs Speed and Length

nvidia/parakeet-tdt-0.6b-v2 is cc-by-4.0 with 600 million parameters, described as a FastConformer encoder with a TDT decoder. Its practical strengths are the two things the card names: efficient transcription of audio segments up to 24 minutes in a single pass, and timestamp support at char, word, and segment level.

The trade is that the language is English only. And the card states that NVIDIA NeMo is required. If your pipeline is built purely on transformers, this is a decision to take on one more runtime. The card also states that transcripts may not be 100 percent accurate and that accuracy varies with language and the characteristics of the input audio.

Decomposing the Word Real-Time

A request for real-time is usually one of three things: partial results must appear before the utterance ends, a final result must arrive within a second after it ends, or the full result must be ready a few minutes after the meeting is over.

The Whisper family fits the third best. The openai/whisper-large-v3 card states a 30-second receptive field and that longer audio requires sequential or chunked algorithms, while the openai/whisper-large-v3-turbo card states outright that it is not designed for real-time transcription out of the box. If the first requirement is genuine, designing the streaming architecture comes before choosing a model.

Distribution format affects latency too. Systran/faster-whisper-large-v3 is a repository converting openai/whisper-large-v3 into the CTranslate2 format with ct2-transformers-converter, with weights saved in FP16 and the note that this can be changed with the CTranslate2 compute_type option. The same model under a different runtime has different latency behavior.

Diarization Is a Separate Model

If you are producing meeting minutes, transcription is only half of it. Splitting who spoke is a different model's job.

pyannote/speaker-diarization-3.1 is marked mit, assumes 16kHz mono, and states that stereo or multi-channel files are automatically downmixed to mono by averaging channels and that other sample rates are automatically resampled to 16kHz. Speaker counts can be steered with the num_speakers, min_speakers, and max_speakers options.

This repository requires accepting the access conditions and sharing contact information before files can be retrieved. That is something to confirm before you write an automated deployment pipeline.

TTS: Where Does the Voice Come From

RepositorylicenseSizeLanguagesCharacteristics as stated
hexgrad/Kokoro-82Mapache-2.082M8 languages, 54 voicesStyleTTS 2 architecture with an ISTFTNet vocoder; decoder only
coqui/XTTS-v2coqui-public-model-licenseNot stated17 languages including KoreanVoice cloning from a 6-second clip; cross-language cloning
SWivid/F5-TTScc-by-nc-4.0Not statedNot stated on the pageLists the Emilia dataset as training data
microsoft/speecht5_ttsmitNot statedNot stated on the pageRequires speaker x-vector embeddings and a separate vocoder

The first question in picking a TTS model is where the voice comes from. If you choose from a prepared voice list, as with hexgrad/Kokoro-82M, the decision is simple. If you clone from a 6-second reference clip, as coqui/XTTS-v2 supports, then how you obtained those six seconds and whether that speaker consented becomes a blocker well before any technical question.

microsoft/speecht5_tts is assembled rather than dropped in. The card states you must supply speaker x-vector embeddings and load the microsoft/speecht5_hifigan vocoder alongside it. It is not a one-repository integration, and its supported languages along with bias, risks, limitations, and evaluation data remain More Information Needed on the card.

The SWivid/F5-TTS page does not state supported languages or a capability description. This post did not fill those blanks from memory. To actually use it you have to check the linked code repository and paper yourself.

The Warnings on Speech Cards Are Not Decoration

Speech is the modality where a card warning turns into a design constraint more directly than anywhere else.

The openai/whisper-large-v3 card states that predictions may include text not actually spoken in the audio, along with a tendency to generate repetitive text and uneven performance across languages. The same card says not to transcribe recordings taken without consent, and warns against deployment in high-risk decision-making contexts. The openai/whisper-large-v3-turbo card adds disparate performance across accents and dialects.

Those sentences become requirements verbatim. Output from a model with a documented hallucination risk must not become a finalized record without human review, and a service with no recording-consent procedure has a design problem that precedes model selection. The hexgrad/Kokoro-82M card stating that it was trained exclusively on permissive and non-copyrighted audio, and warning about fake sites impersonating it, belongs to the same category.

Code Examples

# Example: transcribe long audio using the chunked approach
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"])

Diarization is attached as a separate pipeline and merged on the time axis.

# Example: get speaker turns and align them with the transcript in time
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)

The Order to Decide In

  1. Fix your target languages. English-only changes the candidate set dramatically.
  2. Look at the distribution of audio lengths and check it against the receptive field and recommended length on the card.
  3. Rewrite the real-time requirement as one of the three concrete cases.
  4. If diarization is needed, plan the separate model and its gating conditions together.
  5. If you use voice cloning, put consent and rights verification ahead of the technical decision.
  6. Copy the hallucination and bias warnings from the card directly into your human-review requirements.

Try It Yourself

Series Navigation

References

  • Every value in the tables was read directly from that model page on Hugging Face on 2026-08-12. Anything absent from the page is written as not stated.
  • The supported languages and capabilities of SWivid/F5-TTS are not stated on its page, so they are not written here.
  • Read the full license text yourself and put commercial use through legal review.