Skip to content

Commit b7f083d

Browse files
authored
Update Python subtitle script to support FireRedASR CTC and FunASR Nano. (k2-fsa#3400)
1 parent 5092b44 commit b7f083d

1 file changed

Lines changed: 95 additions & 1 deletion

File tree

python-api-examples/generate-subtitles.py

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,26 @@
115115
--model-type nemo_transducer \
116116
/path/to/test.mp4
117117
118+
(9) For FireRedAsr CTC models
119+
120+
./python-api-examples/generate-subtitles.py \
121+
--silero-vad-model=./silero_vad.onnx \
122+
--fire-red-asr-ctc=./sherpa-onnx-fire-red-asr2-ctc-zh_en-int8-2026-02-25/model.int8.onnx \
123+
--tokens=./sherpa-onnx-fire-red-asr2-ctc-zh_en-int8-2026-02-25/tokens.txt \
124+
--num-threads=2 \
125+
/path/to/test.mp4
126+
127+
(10) For FunASR Nano models
128+
129+
./python-api-examples/generate-subtitles.py \
130+
--silero-vad-model=./silero_vad.onnx \
131+
--funasr-nano-encoder-adaptor=./sherpa-onnx-funasr-nano-int8-2025-12-30/encoder_adaptor.int8.onnx \
132+
--funasr-nano-llm=./sherpa-onnx-funasr-nano-int8-2025-12-30/llm.int8.onnx \
133+
--funasr-nano-tokenizer=./sherpa-onnx-funasr-nano-int8-2025-12-30/Qwen3-0.6B \
134+
--funasr-nano-embedding=./sherpa-onnx-funasr-nano-int8-2025-12-30/embedding.int8.onnx \
135+
--num-threads=2 \
136+
/path/to/test.mp4
137+
118138
Please refer to
119139
https://k2-fsa.github.io/sherpa/onnx/index.html
120140
to install sherpa-onnx and to download non-streaming pre-trained models
@@ -205,6 +225,41 @@ def get_args():
205225
help="Path to the CTC model.onnx from WeNet",
206226
)
207227

228+
parser.add_argument(
229+
"--fire-red-asr-ctc",
230+
default="",
231+
type=str,
232+
help="Path to the FireRedAsr CTC model.onnx",
233+
)
234+
235+
parser.add_argument(
236+
"--funasr-nano-encoder-adaptor",
237+
default="",
238+
type=str,
239+
help="Path to FunASR Nano encoder_adaptor.onnx",
240+
)
241+
242+
parser.add_argument(
243+
"--funasr-nano-llm",
244+
default="",
245+
type=str,
246+
help="Path to FunASR Nano llm.onnx",
247+
)
248+
249+
parser.add_argument(
250+
"--funasr-nano-tokenizer",
251+
default="",
252+
type=str,
253+
help="Path to FunASR Nano tokenizer directory (e.g., Qwen3-0.6B)",
254+
)
255+
256+
parser.add_argument(
257+
"--funasr-nano-embedding",
258+
default="",
259+
type=str,
260+
help="Path to FunASR Nano embedding.onnx",
261+
)
262+
208263
parser.add_argument(
209264
"--num-threads",
210265
type=int,
@@ -358,6 +413,8 @@ def create_recognizer(args) -> sherpa_onnx.OfflineRecognizer:
358413
assert len(args.whisper_decoder) == 0, args.whisper_decoder
359414
assert len(args.fire_red_asr_encoder) == 0, args.fire_red_asr_encoder
360415
assert len(args.fire_red_asr_decoder) == 0, args.fire_red_asr_decoder
416+
assert len(args.fire_red_asr_ctc) == 0, args.fire_red_asr_ctc
417+
assert len(args.funasr_nano_encoder_adaptor) == 0, args.funasr_nano_encoder_adaptor
361418
assert len(args.moonshine_preprocessor) == 0, args.moonshine_preprocessor
362419
assert len(args.moonshine_encoder) == 0, args.moonshine_encoder
363420
assert (
@@ -388,6 +445,8 @@ def create_recognizer(args) -> sherpa_onnx.OfflineRecognizer:
388445
assert len(args.whisper_decoder) == 0, args.whisper_decoder
389446
assert len(args.fire_red_asr_encoder) == 0, args.fire_red_asr_encoder
390447
assert len(args.fire_red_asr_decoder) == 0, args.fire_red_asr_decoder
448+
assert len(args.fire_red_asr_ctc) == 0, args.fire_red_asr_ctc
449+
assert len(args.funasr_nano_encoder_adaptor) == 0, args.funasr_nano_encoder_adaptor
391450
assert len(args.moonshine_preprocessor) == 0, args.moonshine_preprocessor
392451
assert len(args.moonshine_encoder) == 0, args.moonshine_encoder
393452
assert (
@@ -412,6 +471,8 @@ def create_recognizer(args) -> sherpa_onnx.OfflineRecognizer:
412471
assert len(args.whisper_decoder) == 0, args.whisper_decoder
413472
assert len(args.fire_red_asr_encoder) == 0, args.fire_red_asr_encoder
414473
assert len(args.fire_red_asr_decoder) == 0, args.fire_red_asr_decoder
474+
assert len(args.fire_red_asr_ctc) == 0, args.fire_red_asr_ctc
475+
assert len(args.funasr_nano_encoder_adaptor) == 0, args.funasr_nano_encoder_adaptor
415476
assert len(args.moonshine_preprocessor) == 0, args.moonshine_preprocessor
416477
assert len(args.moonshine_encoder) == 0, args.moonshine_encoder
417478
assert (
@@ -432,6 +493,8 @@ def create_recognizer(args) -> sherpa_onnx.OfflineRecognizer:
432493
assert len(args.whisper_decoder) == 0, args.whisper_decoder
433494
assert len(args.fire_red_asr_encoder) == 0, args.fire_red_asr_encoder
434495
assert len(args.fire_red_asr_decoder) == 0, args.fire_red_asr_decoder
496+
assert len(args.fire_red_asr_ctc) == 0, args.fire_red_asr_ctc
497+
assert len(args.funasr_nano_encoder_adaptor) == 0, args.funasr_nano_encoder_adaptor
435498
assert len(args.moonshine_preprocessor) == 0, args.moonshine_preprocessor
436499
assert len(args.moonshine_encoder) == 0, args.moonshine_encoder
437500
assert (
@@ -455,6 +518,8 @@ def create_recognizer(args) -> sherpa_onnx.OfflineRecognizer:
455518
assert_file_exists(args.whisper_decoder)
456519
assert len(args.fire_red_asr_encoder) == 0, args.fire_red_asr_encoder
457520
assert len(args.fire_red_asr_decoder) == 0, args.fire_red_asr_decoder
521+
assert len(args.fire_red_asr_ctc) == 0, args.fire_red_asr_ctc
522+
assert len(args.funasr_nano_encoder_adaptor) == 0, args.funasr_nano_encoder_adaptor
458523
assert len(args.moonshine_preprocessor) == 0, args.moonshine_preprocessor
459524
assert len(args.moonshine_encoder) == 0, args.moonshine_encoder
460525
assert (
@@ -476,6 +541,8 @@ def create_recognizer(args) -> sherpa_onnx.OfflineRecognizer:
476541
elif args.moonshine_preprocessor:
477542
assert len(args.fire_red_asr_encoder) == 0, args.fire_red_asr_encoder
478543
assert len(args.fire_red_asr_decoder) == 0, args.fire_red_asr_decoder
544+
assert len(args.fire_red_asr_ctc) == 0, args.fire_red_asr_ctc
545+
assert len(args.funasr_nano_encoder_adaptor) == 0, args.funasr_nano_encoder_adaptor
479546
assert_file_exists(args.moonshine_preprocessor)
480547
assert_file_exists(args.moonshine_encoder)
481548
assert_file_exists(args.moonshine_uncached_decoder)
@@ -500,6 +567,32 @@ def create_recognizer(args) -> sherpa_onnx.OfflineRecognizer:
500567
decoding_method=args.decoding_method,
501568
debug=args.debug,
502569
)
570+
elif args.fire_red_asr_ctc:
571+
assert len(args.funasr_nano_encoder_adaptor) == 0, args.funasr_nano_encoder_adaptor
572+
573+
assert_file_exists(args.fire_red_asr_ctc)
574+
575+
recognizer = sherpa_onnx.OfflineRecognizer.from_fire_red_asr_ctc(
576+
model=args.fire_red_asr_ctc,
577+
tokens=args.tokens,
578+
num_threads=args.num_threads,
579+
decoding_method=args.decoding_method,
580+
debug=args.debug,
581+
)
582+
elif args.funasr_nano_encoder_adaptor:
583+
assert_file_exists(args.funasr_nano_encoder_adaptor)
584+
assert_file_exists(args.funasr_nano_llm)
585+
assert_file_exists(args.funasr_nano_tokenizer)
586+
assert_file_exists(args.funasr_nano_embedding)
587+
588+
recognizer = sherpa_onnx.OfflineRecognizer.from_funasr_nano(
589+
encoder_adaptor=args.funasr_nano_encoder_adaptor,
590+
llm=args.funasr_nano_llm,
591+
embedding=args.funasr_nano_embedding,
592+
tokenizer=args.funasr_nano_tokenizer,
593+
num_threads=args.num_threads,
594+
debug=args.debug,
595+
)
503596
else:
504597
raise ValueError("Please specify at least one model")
505598

@@ -528,7 +621,8 @@ def __str__(self):
528621

529622
def main():
530623
args = get_args()
531-
assert_file_exists(args.tokens)
624+
if not args.funasr_nano_encoder_adaptor:
625+
assert_file_exists(args.tokens)
532626
if args.silero_vad_model:
533627
assert_file_exists(args.silero_vad_model)
534628
elif args.ten_vad_model:

0 commit comments

Comments
 (0)