Files
live-app-translator/tests/test_tiers.py
EJClaw 0201c7b913
Some checks failed
Windows / verify (push) Has been cancelled
feat: 자막 배경 여백 · 위치 조정 모드 · CPU 추천 · 마이크 입력
요청 네 가지를 넣는다.

1) 자막 배경 여백(padding)
   배경 상자를 창 전체가 아니라 **글자를 감싸는 크기**로 그리도록 바꿨다.
   창 전체를 칠하던 동안에는 여백을 키워도 글자만 안으로 밀릴 뿐 배경
   크기는 그대로여서, 설정 항목을 만들어도 의미가 없었다.

2) 평소 잠금 + '자막 위치 조정'
   locked 기본값을 True 로 바꾼다. 게임 중에 자막을 실수로 끌고 다니는
   사고를 막는 쪽이 기본이어야 한다. 자막 화면의 버튼으로 조정 모드를
   열면 그때만 이동·네 모서리 크기 조절·휠이 열린다. 조정 중에는 클릭
   통과를 강제로 끈다 — 켜둔 채로는 마우스가 창을 지나가 잡을 수 없다.
   크기를 바꾸면 글자 크기가 높이 비율을 그대로 따라간다. 상자만 커지고
   글자가 그대로면 여백만 늘어나 '자막을 키우는' 조작이 되지 않는다.
   조정 모드는 저장하지 않는다. 다음 실행은 다시 잠긴 상태로 시작한다.

3) GPU 가 없을 때 CPU 추천
   티어 표의 recommended 는 GPU 가 넉넉할 때를 전제한 값이라, 그대로
   쓰면 GPU 없는 사람에게 10GB 짜리를 권하게 된다. 환경을 보고 고르는
   recommended_tier() 를 만들고 배지도 그 결과로 붙인다. GPU 가 없으면
   CTranslate2 계열만 후보에 두고 가장 가벼운 쪽을 권한다 — LLM 계열은
   CPU 에서 한 문장에 수십 초가 걸려 실시간 자막이 되지 않는다.
   '추천대로 맞추기' 버튼과, 실제로는 CPU 로 도는데 화면은 GPU 라고
   표시하던 것도 같이 고친다. nvidia-smi 실패 문구가 명령줄을 통째로
   토해내던 것도 사람이 읽을 문장으로 바꿨다.

4) 마이크 등 입력 장치 선택
   InputDeviceCapture 를 추가하고 홈 화면에 목록 전환 버튼을 둔다.
   두 목록을 한 번에 섞지 않는다 — 다 합치면 정작 찾으려던 게임이
   라인입력들 사이에 파묻힌다. 버튼 글자는 '지금 상태'가 아니라
   '누르면 가는 곳'을 적는다. 고른 쪽은 설정에 기억한다.
2026-09-29 13:27:13 +09:00

70 lines
2.3 KiB
Python

from livesub.models.tiers import (
DEFAULT_TIER,
TIERS,
MTBackend,
PromptStyle,
get_tier,
ordered_tiers,
)
def test_exactly_five_tiers_ordered_by_quality():
tiers = ordered_tiers()
assert len(tiers) == 5
assert [t.order for t in tiers] == [1, 2, 3, 4, 5]
def test_latency_and_vram_increase_monotonically():
tiers = ordered_tiers()
latencies = [t.approx_latency_s for t in tiers]
vram = [t.min_vram_gb for t in tiers]
assert latencies == sorted(latencies)
assert vram == sorted(vram)
def test_exactly_one_recommended_and_one_finetune_pick():
assert sum(t.recommended for t in TIERS.values()) == 1
assert sum(t.best_after_finetune for t in TIERS.values()) == 1
def test_only_instruct_models_support_prompt_glossary():
"""LLM이라고 다 되는 게 아니다 — 지시문을 이해하는 instruct 모델만 가능하다.
Seed-X 는 번역 전용 completion 모델이라 지시문을 넣으면 오히려 망가진다.
"""
for tier in TIERS.values():
expected = tier.mt.prompt_style is PromptStyle.INSTRUCT
assert tier.mt.supports_prompt_glossary is expected, tier.key
def test_seq2seq_backends_have_no_prompt_style():
for tier in TIERS.values():
if tier.mt.backend is MTBackend.CTRANSLATE2:
assert tier.mt.prompt_style is PromptStyle.NONE, tier.key
def test_unknown_key_falls_back_to_default():
assert get_tier("does-not-exist").key == DEFAULT_TIER
def test_default_tier_exists():
assert DEFAULT_TIER in TIERS
def test_gpu_가_없으면_cpu_에서_도는_티어를_추천한다():
"""표에 박힌 '추천'은 GPU 가 넉넉할 때 얘기다. 없는 사람에게 10GB 짜리를
권하면 안내가 아니라 함정이 된다."""
from livesub.models.manager import GpuInfo, recommended_tier
key = recommended_tier(GpuInfo(False, reason="GPU 없음"))
tier = get_tier(key)
assert tier.mt.backend is MTBackend.CTRANSLATE2
assert tier.order == 1 # CPU 에서는 연산량이 그대로 지연이 된다
def test_vram_이_모자라면_추천도_내려간다():
from livesub.models.manager import GpuInfo, recommended_tier
small = get_tier(recommended_tier(GpuInfo(True, "RTX 5050", 7680, 7000)))
assert small.min_vram_gb <= 7.5