The words are right. Why is the punctuation wrong?
A transcript can keep every word and still split a thought in the wrong place. Before shifting subtitle times or transcribing the recording again, keep the raw text, generate a separate punctuation candidate, and check whether its meaning survives.
1. Keep the input and generate a candidate
Follow the installation and environment checks for CPU. Confirm compatible PyTorch and torchaudio imports, install funasr==1.4.15, and run python -m pip check. This standalone ct-punc call takes text, not audio or VAD output. The first run still downloads model weights.
import json
from funasr import AutoModel
model = AutoModel(model="ct-punc", device="cpu", disable_update=True)
texts = [
"我们都是木头人不许说话不许动",
"the meeting is at 3 pm please bring your laptop and the report",
"人不是石头人有主观价值",
]
observed = []
for original in texts:
candidate = model.generate(input=original)[0]["text"]
observed.append({"original": original, "candidate": candidate})
print(json.dumps(observed, ensure_ascii=False, indent=2))
Keep original unchanged and store candidate separately. Preserve whitespace and case initially so display cleanup does not hide differences. These short examples are demonstrations, not an accuracy benchmark.
2. Inspect what the model actually changed
[
{
"original": "我们都是木头人不许说话不许动",
"candidate": "我们都是木头人,不许说话,不许动。"
},
{
"original": "the meeting is at 3 pm please bring your laptop and the report",
"candidate": " The meeting is at 3 pm, please bring your laptop and the report."
},
{
"original": "人不是石头人有主观价值",
"candidate": "人不是石头人有主观价值。"
}
]
The first result adds readable pauses. The English result capitalizes the opening word but also contains a leading space. The last Chinese result only adds a full stop: it does not move the second “人” into the next clause. A readable string is not necessarily a correctly punctuated sentence.
A human edit, not the model output above:
人不是石头,人有主观价值。
A community sentence-boundary report separated player timing adjustments from punctuation errors. This is a reconstructed short text, not that recording's full context. It does not establish that the reported problem is fixed, or justify joining subtitle segments solely because the gap is short.
3. Review three things before delivery
- Sentence meaning: do names, negation, quotations and contrast still belong to the right clause? Listen to the surrounding audio when available, not just an isolated subtitle.
- Case and layout: the standalone implementation calls
.capitalize()on some ASCII tokens and rebuilds spaces. Check acronyms, brands and mixed-case names; this is not lossless punctuation insertion. - The ending: implementation rules can replace a trailing comma or add a full stop. A final period does not prove that the thought is complete. Keep the input before editing.
punc_array contains punctuation classes, not timestamps or confidence scores. A standalone text call does not locate the sentence in audio. Adding punctuation or shifting subtitle times cannot establish precise alignment. ASR+VAD pipelines also have separate text-reassembly logic, so their casing behavior need not match this standalone call.
With native Fun-ASR-Nano in Transformers, keep the original recognition result too. ct-punc is optional postprocessing, not native Nano timestamps, diarization or realtime streaming. Do not automatically repunctuate an already satisfactory transcript.
For subtitle delivery, continue with the SRT, VTT and listening-review workflow, treating text editing and timing checks as separate steps.
Reproduction environment and implementation
Run on 2026-09-10 with FunASR 1.4.15 and PyTorch / torchaudio 2.10.0 CPU. ModelScope artifact: iic/punc_ct-transformer_cn-en-common-vocab471067-large, cached revision master. That revision can change; it is not an immutable weight pin. The observed model.pt SHA256 is 7176cae922a872e130e6b88aef9a1153581711baf79c9124c7c95be383cd6f81. Check code and weight licensing separately in the repository and model card; this article is not an authorization statement.
See the pinned case and sentence-ending implementation and pipeline text reassembly. These observations are not an accuracy, realtime-latency or all-revisions guarantee.