diff --git a/examples/industrial_data_pretraining/fun_asr_nano/demo_spk.py b/examples/industrial_data_pretraining/fun_asr_nano/demo_spk.py index d80657d6f..940d9664d 100644 --- a/examples/industrial_data_pretraining/fun_asr_nano/demo_spk.py +++ b/examples/industrial_data_pretraining/fun_asr_nano/demo_spk.py @@ -29,7 +29,6 @@ def main(): vad_model="fsmn-vad", vad_kwargs={"max_single_segment_time": 30000}, spk_model="cam++", - punc_model="ct-punc", device=device, hub="ms", ) diff --git a/examples/industrial_data_pretraining/sense_voice/demo_spk.py b/examples/industrial_data_pretraining/sense_voice/demo_spk.py index e38a5c93f..6a0be2a0b 100644 --- a/examples/industrial_data_pretraining/sense_voice/demo_spk.py +++ b/examples/industrial_data_pretraining/sense_voice/demo_spk.py @@ -28,7 +28,6 @@ def main(): vad_model="fsmn-vad", vad_kwargs={"max_single_segment_time": 30000}, spk_model="cam++", - punc_model="ct-punc", device=device, ) diff --git a/funasr/auto/auto_model.py b/funasr/auto/auto_model.py index 4b538b03d..73f8b4c81 100644 --- a/funasr/auto/auto_model.py +++ b/funasr/auto/auto_model.py @@ -491,6 +491,7 @@ class AutoModel: self._reset_runtime_configs() if self.spk_model is not None and "output_timestamp" not in cfg: cfg["output_timestamp"] = True + cfg["return_time_stamps"] = True kwargs = self.kwargs # step.1: compute the vad model deep_update(self.vad_kwargs, cfg) diff --git a/funasr/models/qwen3_asr/model.py b/funasr/models/qwen3_asr/model.py index 4ee62d077..fb86a6cd0 100644 --- a/funasr/models/qwen3_asr/model.py +++ b/funasr/models/qwen3_asr/model.py @@ -90,11 +90,18 @@ class Qwen3ASR(nn.Module): time1 = time.perf_counter() language = kwargs.get("language", None) - return_time_stamps = kwargs.get("return_time_stamps", False) + return_time_stamps = kwargs.get("return_time_stamps", False) or kwargs.get("output_timestamp", False) context = kwargs.get("context", "") if isinstance(data_in, (list, tuple)): - audio_inputs = list(data_in) + audio_inputs = [] + for item in data_in: + if isinstance(item, np.ndarray): + audio_inputs.append((item.astype(np.float32), 16000)) + elif isinstance(item, torch.Tensor): + audio_inputs.append((item.cpu().numpy().astype(np.float32), 16000)) + else: + audio_inputs.append(item) elif isinstance(data_in, str): audio_inputs = [data_in] elif isinstance(data_in, torch.Tensor): @@ -114,6 +121,12 @@ class Qwen3ASR(nn.Module): time2 = time.perf_counter() meta_data["load_data"] = f"{time2 - time1:0.3f}" + # If timestamps requested but forced_aligner not configured, fall back to no timestamps + if return_time_stamps and self.qwen3_asr_model.forced_aligner is None: + logging.warning("return_time_stamps requires forced_aligner. Skipping timestamps. " + "Initialize with forced_aligner='Qwen/Qwen3-ForcedAligner-0.6B' to enable.") + return_time_stamps = False + results = self.qwen3_asr_model.transcribe( audio=audio_inputs, context=context, @@ -132,7 +145,7 @@ class Qwen3ASR(nn.Module): result_dict["language"] = r.language if return_time_stamps and r.time_stamps is not None: result_dict["timestamp"] = [ - [ts.start_time, ts.end_time, ts.text] + [int(ts.start_time), int(ts.end_time)] for ts in r.time_stamps.items ] output.append(result_dict) diff --git a/tests_models/test_fun_asr_nano_spk.py b/tests_models/test_fun_asr_nano_spk.py index 3c00d138c..707a2bc45 100644 --- a/tests_models/test_fun_asr_nano_spk.py +++ b/tests_models/test_fun_asr_nano_spk.py @@ -15,7 +15,6 @@ def main(): vad_model="iic/speech_fsmn_vad_zh-cn-16k-common-pytorch", vad_kwargs={"max_single_segment_time": 30000}, spk_model="iic/speech_campplus_sv_zh-cn_16k-common", - punc_model="iic/punc_ct-transformer_zh-cn-common-vocab272727-pytorch", device="cpu", disable_update=True, hub="hf", @@ -53,7 +52,7 @@ def main(): print("[Fun-ASR-Nano-SPK] sentence_info:") for s in si: - print(" spk=%d | [%d-%d] %s" % (s["spk"], s["start"], s["end"], s["text"])) + print(" spk=%d | [%d-%d] %s" % (s["spk"], s["start"], s["end"], s.get("text", s.get("sentence", "")))) has_spk = all("spk" in s for s in si) if not has_spk: diff --git a/tests_models/test_sensevoice_spk.py b/tests_models/test_sensevoice_spk.py index 0955c8f96..f29c53a9a 100644 --- a/tests_models/test_sensevoice_spk.py +++ b/tests_models/test_sensevoice_spk.py @@ -14,7 +14,6 @@ def main(): vad_model="iic/speech_fsmn_vad_zh-cn-16k-common-pytorch", vad_kwargs={"max_single_segment_time": 30000}, spk_model="iic/speech_campplus_sv_zh-cn_16k-common", - punc_model="iic/punc_ct-transformer_zh-cn-common-vocab272727-pytorch", device="cpu", disable_update=True, ) @@ -60,7 +59,7 @@ def main(): print("[SenseVoice-SPK] sentence_info:") for s in si: - print(" spk=%d | [%d-%d] %s" % (s["spk"], s["start"], s["end"], rich_transcription_postprocess(s["text"]))) + print(" spk=%d | [%d-%d] %s" % (s["spk"], s["start"], s["end"], rich_transcription_postprocess(s.get("text", s.get("sentence", ""))))) has_spk = all("spk" in s for s in si) if not has_spk: