Skip to main content

GitHub license Downloads PyPI version Tests Tested Python

Nlptutti: 한국어 STT 평가 패키지

nlptutti는 한국어 STT(Speech-to-Text) 출력의 CER, WER, CRR, 키워드와 개체명 보존 성능을 계산하고 여러 시스템의 결과를 재현 가능한 JSON과 Markdown으로 비교하는 Python 패키지입니다.

Microsoft Azure Speech, Amazon Transcribe, Google Cloud Speech-to-Text 같은 클라우드 STT와 OpenAI Whisper, FunASR 같은 오픈소스 도구가 만든 출력을 평가합니다. 음성을 전사하거나 모델을 내려받는 패키지는 아닙니다.

표준 CER·WER와 Nlptutti normalized 오류율 공식

1분 빠른 시작

1. 설치

python -m pip install -U nlptutti
python -c "import nlptutti; print('nlptutti ready')"

성공하면 nlptutti ready가 출력됩니다. Python 3.8부터 3.14까지의 환경을 CI에서 테스트합니다.

2. 한 문장 평가

import nlptutti as metrics

result = metrics.get_cer(
    "오늘 날씨가 맑습니다",
    "오늘 날씨는 맑습니다",
    rate_mode="standard",
)

print(round(result["cer"], 4))       # 0.1111
print(result["substitutions"])       # 1

CER와 WER는 낮을수록 좋고 완전 일치는 0.0입니다. CRR은 높을수록 좋고 완전 일치는 1.0입니다.

3. 두 STT 시스템 비교

import nlptutti as metrics

report = metrics.compare_systems(
    ["오늘 날씨가 맑습니다", "서울은 따뜻합니다"],
    {
        "baseline": ["오늘 날씨는 맑습니다", "서울은 춥습니다"],
        "candidate": ["오늘 날씨가 맑습니다", "서울은 따뜻합니다"],
    },
    rate_mode="standard",
)

for system in report["systems"]:
    print(
        system["id"],
        round(system["metrics"]["cer"]["micro"], 4),
        round(system["metrics"]["wer"]["micro"], 4),
    )

# baseline 0.2353 0.4
# candidate 0.0 0.0

micro는 코퍼스 전체의 편집 횟수를 합산한 점수이고, macro는 문장별 점수의 단순 평균입니다. 논문이나 모델 벤치마크에서는 보통 rate_mode="standard"micro를 먼저 봅니다.

4. JSON과 Markdown으로 저장

저장소의 examples/comparison_input.json은 바로 위 Python 예제와 같은 입력입니다.

python -c "from urllib.request import urlretrieve; urlretrieve('https://raw.githubusercontent.com/hyeonsangjeon/computing-Korean-STT-error-rates/main/examples/comparison_input.json', 'comparison_input.json')"
nlptutti compare comparison_input.json \
  --rate-mode standard \
  --output-dir comparison-report

성공하면 다음 두 파일이 생성됩니다.

comparison-report/report.json
comparison-report/report.md

report.json은 자동화에서 읽는 버전 스키마이고, report.md는 사람이 검토할 표입니다. 입력, 옵션, 패키지 버전이 같으면 실행할 때마다 같은 내용을 만듭니다. 원문은 기본 보고서에서 빠지며 include_transcripts=True 또는 --include-transcripts를 직접 선택해야 포함됩니다.

입력 형식, 오류 처리, paired bootstrap과 결과 해석은 시스템 비교 매뉴얼에 정리했습니다.

기본값부터 확인하기

기존 사용자 결과를 바꾸지 않기 위해 정규화 관련 기본값은 그대로 유지합니다.

옵션 기본값 의미
rate_mode "normalized" 삽입 오류를 분모에도 넣는 Nlptutti 기존 계산식입니다. 입력 문자열을 바꾸는 옵션이 아닙니다.
rate_mode="standard" 직접 지정 참조 길이를 분모로 쓰는 표준 CER/WER입니다. 삽입이 많으면 1보다 클 수 있습니다.
rm_punctuation True 평가 전에 문장부호를 제거합니다. CER/CRR은 이 값과 관계없이 공백을 제거합니다.
unicode_normalization None Unicode 표현을 그대로 둡니다. 조합형 혼입을 정리할 때만 "NFC" 등을 지정합니다.

기존 결과를 재현할 때는 기본 normalized를 유지하고, 새 공식 비교에서는 standard를 직접 지정합니다. 두 모드의 숫자는 같은 열에서 비교하면 안 됩니다.

어떤 함수를 선택할까

목적 API 성공 기준과 경계
문자 전사 품질 get_cer 낮을수록 좋습니다. 공백을 항상 제거하므로 띄어쓰기 자체는 평가하지 않습니다.
단어·띄어쓰기 포함 품질 get_wer 낮을수록 좋습니다. 시스템 간 토큰화 정책을 같게 맞춰야 합니다.
높을수록 좋은 문자 지표 get_crr round(1 - CER, 2)인 보조 지표입니다. 독립 정렬 점수가 아닙니다.
여러 문장 micro/macro evaluate_corpus 같은 길이의 reference와 hypothesis 목록이 필요합니다.
둘 이상의 시스템 비교 compare_systems 정렬된 입력, 시스템별 점수, pairwise delta를 반환합니다.
핵심어 누락·오탐 evaluate_keywords 제공한 키워드 사전의 precision, recall, F1을 계산합니다.
개체명 구간 품질 evaluate_entities 제공한 개체명 사전의 Entity CER와 언급 F1을 계산합니다. NER 모델은 아닙니다.
오류 원인 확인 explain_errors 문자 또는 단어 정렬과 상위 치환·삭제·삽입을 반환합니다.
JSON·SRT·TSV 평가 parse_transcript + evaluate_transcript 필드와 시간 단위를 검증하고 평가 provenance를 남깁니다.

선택 기능

Paired bootstrap 신뢰구간

문장 쌍을 유지한 채 percentile bootstrap을 실행하면 pairwise CER/WER delta의 신뢰구간도 보고서에 남습니다. 기본값 bootstrap=0에서는 실행하지 않습니다.

report = metrics.compare_systems(
    references,
    systems,
    rate_mode="standard",
    bootstrap=1000,
    seed=42,
    confidence=0.95,
)

한국어 오류 진단

diagnostic_profile="korean-v1"을 지정하면 띄어쓰기 경계, 숫자·단위, 조사·어미 인접 치환, 상위 문자 편집을 따로 보여 줍니다. 전체 CER/WER에는 영향을 주지 않으며 기본값은 None입니다. 숫자·단위와 조사·어미 규칙은 형태소 분석이 아닌 experimental 단계의 휴리스틱입니다.

자세한 규칙과 오분류 가능성은 한국어 오류 진단 프로필에 정리했습니다.

STT 도구별 JSON 읽기

parse_provider_transcript()는 네트워크나 SDK를 사용하지 않고 저장된 JSON만 읽습니다. 현재 테스트로 확인한 형식은 다음 두 가지입니다.

  • Microsoft Azure Speech short-audio REST simple 성공 응답
  • 오픈소스 openai/whispertranscribe() 반환 구조

공급자와 schema version은 반드시 직접 지정해야 하며 자동으로 감지하지 않습니다. Azure의 다른 REST 형식, OpenAI API, AWS, Google, FunASR 전용 형식은 현재 지원 범위에 포함되지 않습니다. 일반 text/JSON/SRT/TSV는 특정 공급자에 종속되지 않는 parse_transcript()로 평가할 수 있습니다.

지원 필드와 공식 출처는 공급자 출력 어댑터에 정리했습니다.

문서

이 패키지를 만든 배경과 한국어 ASR/STT 평가 실험은 한국어 프롤로그영문 글에 정리되어 있습니다.

계산식

표준 CER/WER는 치환(S), 삭제(D), 삽입(I), 정답 토큰(C)을 사용합니다.

standard:   (S + D + I) / (S + D + C)
normalized: (S + D + I) / (S + D + I + C)

구현은 Levenshtein 최소 편집거리를 사용합니다. backtrace가 필요한 오류 설명과 개체명 평가는 동률일 때 선택 순서가 고정된 같은 정렬 커널을 사용합니다.

관련 논문과 공개 구현

evaluate_entities()는 위 구현을 포팅한 코드가 아닙니다. 공통 평가 원칙을 한국어 문자 span과 aliases로 직접 지정하는 별칭 정책에 맞춰 독립 구현했으며 차이는 test_entity_reference_implementations.py에 고정했습니다.

라이선스

코드는 MIT License로 배포됩니다. 이 저장소는 STT 모델, 가중치, 음성 데이터셋을 포함하지 않으며 외부 모델·데이터의 라이선스는 각각 별도로 확인해야 합니다.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nlptutti-0.0.0.21.tar.gz (90.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nlptutti-0.0.0.21-py3-none-any.whl (44.2 kB view details)

Uploaded Python 3

File details

Details for the file nlptutti-0.0.0.21.tar.gz.

File metadata

  • Download URL: nlptutti-0.0.0.21.tar.gz
  • Upload date:
  • Size: 90.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for nlptutti-0.0.0.21.tar.gz
Algorithm Hash digest
SHA256 7b2423386d325f691ee81fbf76c19ad4026776daf67904796a65d1b155ba06c7
MD5 cf5f7ae997aadc689427e82cadc88490
BLAKE2b-256 98768779df53dcab8fc5a872c7de01bcf4db713d5713dec3b7d3b987d4a74895

See more details on using hashes here.

Provenance

The following attestation bundles were made for nlptutti-0.0.0.21.tar.gz:

Publisher: publish-to-pypi.yml on hyeonsangjeon/computing-Korean-STT-error-rates

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nlptutti-0.0.0.21-py3-none-any.whl.

File metadata

  • Download URL: nlptutti-0.0.0.21-py3-none-any.whl
  • Upload date:
  • Size: 44.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for nlptutti-0.0.0.21-py3-none-any.whl
Algorithm Hash digest
SHA256 fc1d986e3b07e74258c31d21e5c68c2b9497ef820ba168b10dde65e384216724
MD5 87023309219a0761031cc87eb74ba0fa
BLAKE2b-256 7360b1b24ce7f29e41413271441b26519336180dbf2cedf3f6edde2b90b32801

See more details on using hashes here.

Provenance

The following attestation bundles were made for nlptutti-0.0.0.21-py3-none-any.whl:

Publisher: publish-to-pypi.yml on hyeonsangjeon/computing-Korean-STT-error-rates

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.0.0.22

2 files

This release

0.0.0.21 This release

2 files

0.0.0.20

2 files

0.0.0.19

2 files

0.0.0.18

2 files

0.0.0.17

2 files

0.0.0.16

2 files

0.0.0.15

2 files

0.0.0.14

2 files

0.0.0.13

2 files

0.0.0.12

2 files

0.0.0.11

2 files

0.0.0.10

2 files

0.0.0.9

2 files

0.0.0.8

1 file

0.0.0.7

1 file

0.0.0.6

1 file

0.0.0.5

1 file

0.0.0.4

1 file

0.0.0.3

1 file

0.0.0.2

1 file

0.0.0.1

1 file

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page