diff --git a/examples/subtitle/README.md b/examples/subtitle/README.md index f173b52e6..7624bbf18 100644 --- a/examples/subtitle/README.md +++ b/examples/subtitle/README.md @@ -22,6 +22,9 @@ python generate_subtitle.py audio.wav --device cpu # Preserve raw model sentence boundaries python generate_subtitle.py audio.wav --segment-mode sentence + +# Use shorter VAD segments when memory is limited +python generate_subtitle.py audio.wav --max-single-segment-time 30000 ``` ## Output Example (SRT) @@ -44,6 +47,7 @@ python generate_subtitle.py audio.wav --segment-mode sentence | `--segment-mode` | readable | Cue grouping: readable or raw sentence boundaries | | `--model` | SenseVoiceSmall | ASR model | | `--device` | cuda | Device: cuda or cpu | +| `--max-single-segment-time` | 60000 | Maximum VAD segment length in milliseconds; reduce it when memory is limited | | `--spk` | off | Add speaker labels | | `--lang` | auto | Language hint | | `-o` | input.srt | Output path | @@ -52,6 +56,10 @@ Readable mode joins only adjacent short or continuation cues within bounded gap, duration, length, and speaker limits. It does not rewrite recognized text or punctuation. +The default 60-second VAD limit gives subtitle generation more context at +speech boundaries. For memory-constrained machines, lower it explicitly (for +example, `--max-single-segment-time 30000`). + ## Install ```bash diff --git a/examples/subtitle/generate_subtitle.py b/examples/subtitle/generate_subtitle.py index bfa21c6b6..1caeddd3d 100644 --- a/examples/subtitle/generate_subtitle.py +++ b/examples/subtitle/generate_subtitle.py @@ -73,6 +73,13 @@ def main(): ) parser.add_argument("--model", default="iic/SenseVoiceSmall") parser.add_argument("--device", default="cuda") + parser.add_argument( + "--max-single-segment-time", + type=int, + default=60000, + metavar="MS", + help="Maximum VAD segment length in milliseconds (default: 60000)", + ) parser.add_argument("--spk", action="store_true", help="Include speaker labels") parser.add_argument("--lang", default="auto") args = parser.parse_args() @@ -88,7 +95,7 @@ def main(): from funasr import AutoModel kwargs = {"model": args.model, "vad_model": "fsmn-vad", "punc_model": "ct-punc", - "vad_kwargs": {"max_single_segment_time": 30000}, + "vad_kwargs": {"max_single_segment_time": args.max_single_segment_time}, "device": args.device, "disable_update": True} if args.spk: kwargs["spk_model"] = "cam++" diff --git a/tests/test_generate_subtitle.py b/tests/test_generate_subtitle.py index a7779e935..c4d4a3d1a 100644 --- a/tests/test_generate_subtitle.py +++ b/tests/test_generate_subtitle.py @@ -68,6 +68,7 @@ def test_generate_subtitle_requests_sentence_timestamps_and_writes_segmented_srt module.main() assert captured["model_kwargs"]["punc_model"] == "ct-punc" + assert captured["model_kwargs"]["vad_kwargs"] == {"max_single_segment_time": 60000} assert captured["generate_kwargs"]["language"] == "zh" assert captured["generate_kwargs"]["sentence_timestamp"] is True assert captured["generate_kwargs"]["output_timestamp"] is True