diff --git a/app/config.py b/app/config.py index c632a10..3369ed3 100644 --- a/app/config.py +++ b/app/config.py @@ -48,6 +48,7 @@ class AsrConfig(BaseModel): word_timestamps: bool = True vad_filter: bool = True batch_size: int = 8 # BatchedInferencePipeline 的音频块批大小;GPU 建议 16 + beam_size: int = 5 # beam search 宽度;GPU turbo 可降到 2 加速(候选数↓ 解码步数↓),质量损失小 class TranslationConfig(BaseModel): diff --git a/app/main.py b/app/main.py index 6e32ded..98eee80 100644 --- a/app/main.py +++ b/app/main.py @@ -171,6 +171,7 @@ def create_app() -> FastAPI: info["asr_model"] = s.asr.model info["asr_compute_type"] = s.asr.compute_type info["asr_batch_size"] = s.asr.batch_size + info["asr_beam_size"] = s.asr.beam_size info["asr_language"] = s.asr.language info["translation_device"] = s.translation.device info["translation_model"] = s.translation.model diff --git a/app/services/asr_service.py b/app/services/asr_service.py index d526f50..9d2e40b 100644 --- a/app/services/asr_service.py +++ b/app/services/asr_service.py @@ -37,7 +37,7 @@ def transcribe(wav_path: Path) -> list[Segment]: language=s.language, word_timestamps=s.word_timestamps, vad_filter=s.vad_filter, - beam_size=5, + beam_size=s.beam_size, # beam search 宽度(config 可调);GPU turbo 建议降到 2 加速 batch_size=s.batch_size, # 批量解码:多音频块一次性送 GPU without_timestamps=False, # BatchedInferencePipeline 默认 True,需显式关闭以生成段级时间戳 ) diff --git a/app/services/model_manager.py b/app/services/model_manager.py index 8b1cc49..27c418e 100644 --- a/app/services/model_manager.py +++ b/app/services/model_manager.py @@ -65,7 +65,8 @@ class ModelManager: ) self._asr = BatchedInferencePipeline(model=whisper) self._current = "asr" - logger.info("ASR 模型已就绪(batched, batch_size=%d)。", s.batch_size) + logger.info("ASR 模型已就绪(batched, batch_size=%d, beam_size=%d)。", + s.batch_size, s.beam_size) return self._asr def unload_asr(self) -> None: diff --git a/config.cpu.yaml b/config.cpu.yaml index 3547ad2..63ba5bc 100644 --- a/config.cpu.yaml +++ b/config.cpu.yaml @@ -31,6 +31,7 @@ asr: word_timestamps: true vad_filter: true batch_size: 8 # CPU 无 GPU 并行收益,保持小批 + beam_size: 5 # tiny.en CPU 质量优先,保持默认 beam(无加速诉求) translation: model: Helsinki-NLP/opus-mt-en-zh # 最轻量英译中(~300MB;NLLB-600M 需 ~2.4GB,2GB 机 OOM) diff --git a/config.example.yaml b/config.example.yaml index f8cb167..7d7af55 100644 --- a/config.example.yaml +++ b/config.example.yaml @@ -32,7 +32,8 @@ asr: language: en # 仅英语 word_timestamps: true # 词级时间戳:让断句精确而非纯匀速估算 vad_filter: true # 过滤静音段,提升质量与速度 - batch_size: 8 # CPU: 8 | GPU: 16(BatchedInferencePipeline 批量解码音频块) + batch_size: 8 # CPU: 8 | GPU: 32(BatchedInferencePipeline 批量解码音频块,拉长单次 GPU 解码掩盖 CPU 特征提取间隙) + beam_size: 5 # CPU: 5(默认)| GPU: 2(turbo 鲁棒可降,候选数↓解码步数↓,加速明显质量损失小) translation: # CPU dev:Helsinki-NLP/opus-mt-en-zh(~300MB,2GB 内存可跑) diff --git a/config.gpu.yaml b/config.gpu.yaml index e793899..9e414f1 100644 --- a/config.gpu.yaml +++ b/config.gpu.yaml @@ -29,7 +29,8 @@ asr: language: en word_timestamps: true vad_filter: true - batch_size: 16 # BatchedInferencePipeline:每批解码 16 个 30s 音频块,填充 GPU + batch_size: 32 # BatchedInferencePipeline:每批解码 32 个 30s 音频块,拉长单次 GPU 解码掩盖 CPU 特征提取间隙 + beam_size: 2 # turbo 鲁棒,beam=2 留一个候选做保险(vs beam=5 候选数↓ 解码步数↓,加速明显质量损失小) translation: model: facebook/nllb-200-distilled-1.3B # 质量最好