sentence_info text drifts away from its timestamps/speakers: Chinese VAD chunks are joined without a space before timestamp_sentence splits on spaces

Đang mở Phù hợp với người mới
#3,801 3 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
72/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
python, pytorch
Lĩnh vực
audio-video-rtc, backend

Hướng nghiên cứu

Bắt đầu với _join_vad_texts trong funasr/auto/auto_model.py và timestamp_sentence trong funasr/utils/timestamp_tools.py; theo dõi cách inference_with_vad cung cấp văn bản và dấu thời gian cho bộ tách câu. Tái hiện vấn đề với hai đoạn tiếng Trung trong issue và kiểm tra xem văn bản của mỗi câu có tiếp tục khớp với dấu thời gian và người nói tương ứng hay không, đồng thời dấu câu vẫn chính xác.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

Summary

With vad_model + punc_model (+ spk_model), the text of each sentence_info entry is shifted relative to its start/end/timestamp/spk. The shift grows by one unit at every VAD chunk boundary where two Chinese chunks meet, so on long audio the sentence text ends up far ahead of the time range and speaker it is attached to. The top-level text (punctuated) is correct; only sentence_info[*].text is wrong.

Version

  • funasr 1.4.16 (same code in 1.4.17 and current main)
  • AutoModel(model="paraformer-zh", vad_model="fsmn-vad", punc_model="ct-punc", spk_model="cam++"), Python 3.12, macOS, CPU

Minimal reproduction (no audio needed)

from funasr.auto.auto_model import _join_vad_texts
from funasr.utils.timestamp_tools import timestamp_sentence

chunks = ["今 天 天 气 很 好", "我 们 去 公 园 吧"]          # two VAD chunks
punc_input_text = _join_vad_texts(chunks)
print(repr(punc_input_text))   # '今 天 天 气 很 好我 们 去 公 园 吧'  ("好我" fused)

timestamps = [[i * 200, i * 200 + 200] for i in range(12)]
punc = [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 3]                 # "," after 好, "。" after 吧
print(len(punc_input_text.split()), "text units vs", len(timestamps), "timestamps")
for s in timestamp_sentence(punc, timestamps, punc_input_text):
    print(s["text"], s["start"], s["end"])

Output:

11 text units vs 12 timestamps
今天天气很好我, 0 1200
们去公园吧。 1200 2400

Expected 今天天气很好, / 我们去公园吧。.

Real-world impact

On a 19.5-minute Mandarin recording: 5299 timestamps and 5299 punctuation ids, but punc_input_text.split() yields only 5082 units (217 fused boundaries). Sentence text drifts up to ~217 characters (~50 s of speech) ahead of its timestamps, so:

  • sentences are cut 1–N characters off (e.g. 然, / 后用于…)
  • since speakers are distributed by time, text is attributed to the wrong speaker, often switching speaker mid-sentence

Cause

In AutoModel.inference_with_vad, punc_input_text = _join_vad_texts(...) intentionally joins Chinese chunks without a space (fine for the punctuation model, whose tokenizer splits CJK into characters, so punc_array length still matches). But the same string is then used as timestamp_text, and timestamp_sentence pairs units with timestamps via text_postprocessed.split(). The fused boundary units shift every following unit. The existing check punc_length != len(sentence_timestamps) doesn't catch it because the number of text units is never compared.

Suggested fix

Use a space-joined version of the chunk texts for timestamp_text (or have timestamp_sentence consume one unit per timestamp), and/or assert that the number of text units equals the number of timestamps.

Workaround we use for now: call generate(..., return_raw_text=True) and rebuild each sentence's text by taking len(sentence["timestamp"]) units from result["raw_text"].split() in order, keeping the trailing punctuation from sentence["text"]. With that, sentence boundaries and speaker turns line up correctly.

Ngôn ngữ chính
Python
Star
20.9k
Fork
2.1k
Merge trung bình
1 ngày 3 giờ
Pull request đã merge (30 ngày)
46

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của modelscope/FunASR

Tất cả issue của modelscope/FunASR

Issue tương tự

Thêm issue về Python

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.