diff --git a/README.md b/README.md
index b07c26560..ec1689f32 100644
--- a/README.md
+++ b/README.md
@@ -309,7 +309,7 @@ asset is published.
- 2026/07/19: **v1.3.18 on PyPI** — CLI SRT/TSV subtitle output now requests sentence timestamps and loads punctuation when needed, so `funasr audio.wav --output-format srt --output-dir ./subs` writes segmented subtitle cues instead of one full-text block. Install with `python -m pip install -U "funasr==1.3.18"`. [Release ->](https://github.com/modelscope/FunASR/releases/tag/v1.3.18)
- 2026/07/18: **v1.3.16 on PyPI** — client-driven realtime endpoints for Fun-ASR-Nano. Start one WebSocket session, stream PCM, and send `COMMIT` for each utterance without loading server-side VAD; short utterances finalize and timestamps remain monotonic across commits. Install with `pip install --upgrade funasr`, then run `funasr-realtime-server --endpoint-mode client`. [Guide →](examples/industrial_data_pretraining/fun_asr_nano/docs/realtime_demo.md)
- 2026/07/18: **llama.cpp runtime v0.1.7** — prebuilt Windows CUDA package for SenseVoiceSmall (`funasr-llamacpp-windows-x64-cuda.zip`) plus Linux / macOS / Windows CPU packages. Download the GGUF model, then run `llama-funasr-sensevoice ... --backend cuda` on supported NVIDIA GPUs. [Release →](https://github.com/modelscope/FunASR/releases/tag/runtime-llamacpp-v0.1.7)
-- 2026/06/20: **llama.cpp / GGUF runtime** — run SenseVoice / Paraformer / Fun-ASR-Nano on CPU & edge as a single self-contained binary (a whisper.cpp-style alternative), built-in FSMN-VAD, no Python at runtime. Prebuilt binaries for Linux / macOS / Windows + **q8 quantized models (~half the size, same accuracy)**. [runtime/llama.cpp/](./runtime/llama.cpp/) · [Releases](../../releases)
+- 2026/06/20: **llama.cpp / GGUF runtime** — run SenseVoice / Paraformer / Fun-ASR-Nano on CPU & edge as a single self-contained binary (a whisper.cpp-style alternative), built-in FSMN-VAD, no Python at runtime. Prebuilt binaries for Linux / macOS / Windows + **q8 quantized models (~half the size, same accuracy)**. [runtime/llama.cpp/](./runtime/llama.cpp/) · [Releases](https://github.com/modelscope/FunASR/releases)
- 2026/06/21: **v1.3.12** on PyPI — rolling fixes (qwen3-asr language codes, glm_asr, vLLM repetition_penalty). `pip install --upgrade funasr`
- 2026/05/24: **vLLM Inference Engine** — 2-3x faster LLM decoding for Fun-ASR-Nano. Streaming WebSocket service with VAD + Speaker Diarization. [Guide →](docs/vllm_guide.md) · [Realtime WS tuning →](docs/vllm_guide.md#67-production-concurrency-and-multi-process-deployment) · [API stability checklist →](docs/vllm_guide.md#production-api-stability-checklist)
- 2026/05/24: **Dynamic VAD** — adaptive silence threshold (default on). Short sentences stay intact, long segments get auto-split. [Details →](docs/vllm_guide.md#附录dynamicstreamingvad)
diff --git a/examples/industrial_data_pretraining/monotonic_aligner/README_zh.md b/examples/industrial_data_pretraining/monotonic_aligner/README_zh.md
index 8ddb202a2..68155ecb6 100644
--- a/examples/industrial_data_pretraining/monotonic_aligner/README_zh.md
+++ b/examples/industrial_data_pretraining/monotonic_aligner/README_zh.md
@@ -1,4 +1,4 @@
-(简体中文|[English](./README.md))
+(简体中文|[示例目录](../))
# 语音识别
diff --git a/examples/industrial_data_pretraining/paraformer-zh-spk/README_zh.md b/examples/industrial_data_pretraining/paraformer-zh-spk/README_zh.md
index 54a9401ed..2e1426503 100644
--- a/examples/industrial_data_pretraining/paraformer-zh-spk/README_zh.md
+++ b/examples/industrial_data_pretraining/paraformer-zh-spk/README_zh.md
@@ -1,4 +1,4 @@
-(简体中文|[English](./README.md))
+(简体中文|[示例目录](../))
FunASR开源了大量在工业数据上预训练模型,您可以在 [模型许可协议](https://github.com/modelscope/FunASR/blob/main/MODEL_LICENSE)下自由使用、复制、修改和分享FunASR模型,下面列举代表性的模型,更多模型请参考 [模型仓库](https://github.com/modelscope/FunASR/tree/main/model_zoo)。
@@ -433,4 +433,4 @@ result = model(wav_path)
print(result)
```
-更多例子请参考 [样例](https://github.com/modelscope/FunASR/tree/main/runtime/python/onnxruntime)
\ No newline at end of file
+更多例子请参考 [样例](https://github.com/modelscope/FunASR/tree/main/runtime/python/onnxruntime)
diff --git a/examples/industrial_data_pretraining/paraformer_streaming/README_zh.md b/examples/industrial_data_pretraining/paraformer_streaming/README_zh.md
index 54a9401ed..2e1426503 100644
--- a/examples/industrial_data_pretraining/paraformer_streaming/README_zh.md
+++ b/examples/industrial_data_pretraining/paraformer_streaming/README_zh.md
@@ -1,4 +1,4 @@
-(简体中文|[English](./README.md))
+(简体中文|[示例目录](../))
FunASR开源了大量在工业数据上预训练模型,您可以在 [模型许可协议](https://github.com/modelscope/FunASR/blob/main/MODEL_LICENSE)下自由使用、复制、修改和分享FunASR模型,下面列举代表性的模型,更多模型请参考 [模型仓库](https://github.com/modelscope/FunASR/tree/main/model_zoo)。
@@ -433,4 +433,4 @@ result = model(wav_path)
print(result)
```
-更多例子请参考 [样例](https://github.com/modelscope/FunASR/tree/main/runtime/python/onnxruntime)
\ No newline at end of file
+更多例子请参考 [样例](https://github.com/modelscope/FunASR/tree/main/runtime/python/onnxruntime)
diff --git a/model_zoo/modelscope_models_zh.md b/model_zoo/modelscope_models_zh.md
index e6e087fa2..14d49be8e 100644
--- a/model_zoo/modelscope_models_zh.md
+++ b/model_zoo/modelscope_models_zh.md
@@ -6,7 +6,7 @@
您可以在本协议的条件下自由使用、复制、修改和分享FunASR模型。在使用、复制、修改和分享FunASR模型时,您应当标明模型来源和作者信息。您应当在[FunASR软件]中保留相关模型的名称。完整的模型许可证请参见 [模型许可协议](https://github.com/modelscope/FunASR/blob/main/MODEL_LICENSE)
## 模型用法
-模型用法参考[文档](funasr/quick_start_zh.md)
+模型用法参考[文档](../runtime/quick_start_zh.md)
## 模型仓库
这里我们提供了在不同数据集上预训练的模型。模型和数据集的详细信息可在 [ModelScope](https://www.modelscope.cn/models?page=1&tasks=auto-speech-recognition)中找到.
diff --git a/model_zoo/readme.md b/model_zoo/readme.md
index e4c31b651..320a2e27e 100644
--- a/model_zoo/readme.md
+++ b/model_zoo/readme.md
@@ -15,7 +15,7 @@ Here we provided several pretrained models on different datasets. The details of
#### Paraformer
-FunASR has open-sourced a large number of pre-trained models on industrial data. You are free to use, copy, modify, and share FunASR models under the [Model License Agreement](./MODEL_LICENSE). Below are some representative models, for more models please refer to the [Model Zoo]().
+FunASR has open-sourced a large number of pre-trained models on industrial data. You are free to use, copy, modify, and share FunASR models under the [Model License Agreement](../MODEL_LICENSE). Below are some representative models, for more models please refer to the [Model Zoo](https://github.com/modelscope/FunASR/tree/main/model_zoo).
(Note: 🤗 represents the Huggingface model zoo link, ⭐ represents the ModelScope model zoo link)
diff --git a/model_zoo/readme_zh.md b/model_zoo/readme_zh.md
index bb794185d..2da684392 100644
--- a/model_zoo/readme_zh.md
+++ b/model_zoo/readme_zh.md
@@ -6,7 +6,7 @@
您可以在本协议的条件下自由使用、复制、修改和分享FunASR模型。在使用、复制、修改和分享FunASR模型时,您应当标明模型来源和作者信息。您应当在[FunASR软件]中保留相关模型的名称。完整的模型许可证请参见 [模型许可协议](https://github.com/modelscope/FunASR/blob/main/MODEL_LICENSE)
## 模型用法
-模型用法参考[文档](funasr/quick_start_zh.md)
+模型用法参考[文档](../runtime/quick_start_zh.md)
## 模型仓库
这里我们提供了在不同数据集上预训练的模型。模型和数据集的详细信息可在 [ModelScope](https://www.modelscope.cn/models?page=1&tasks=auto-speech-recognition)中找到.
@@ -24,4 +24,3 @@
| paraformer-zh-streaming
( [⭐](https://modelscope.cn/models/damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online/summary) [🤗]() ) | 语音识别,实时 | 60000小时,中文 | 220M |
| paraformer-zh-streaming-small
( [⭐](https://www.modelscope.cn/models/iic/speech_paraformer_asr_nat-zh-cn-16k-common-vocab8404-online/summary) [🤗]() ) | 语音识别,实时 | 60000小时,中文 | 220M |
| paraformer-en
( [⭐](https://www.modelscope.cn/models/damo/speech_paraformer-large-vad-punc_asr_nat-en-16k-common-vocab10020/summary) [🤗]() ) | 语音识别,非实时 | 50000小时,英文 | 220M |
-
diff --git a/runtime/docs/aliyun_server_tutorial.md b/runtime/docs/aliyun_server_tutorial.md
index 5cd47c244..c578d191d 100644
--- a/runtime/docs/aliyun_server_tutorial.md
+++ b/runtime/docs/aliyun_server_tutorial.md
@@ -59,6 +59,5 @@
-上图表示已经成功申请了云服务器,后续可以根据FunASR runtime-SDK部署文档进行一键部署([点击此处](./SDK_tutorial_cn.md))
-
+上图表示已经成功申请了云服务器,后续可以根据FunASR runtime-SDK部署文档进行一键部署([点击此处](./SDK_tutorial_zh.md))
diff --git a/runtime/grpc/Readme.md b/runtime/grpc/Readme.md
index 016e396e9..6976c7700 100644
--- a/runtime/grpc/Readme.md
+++ b/runtime/grpc/Readme.md
@@ -38,7 +38,7 @@ cd /cfs/user/burkliu/work2023/FunASR/funasr/runtime/grpc
```
### 4. Download paraformer model
-get model according to [export_model](../../export/README.md)
+get model according to [export_model](../docs/benchmark_onnx_cpp.md)
or run code below as default
```shell
diff --git a/tests/test_markdown_relative_links.py b/tests/test_markdown_relative_links.py
new file mode 100644
index 000000000..b414e512b
--- /dev/null
+++ b/tests/test_markdown_relative_links.py
@@ -0,0 +1,62 @@
+import re
+import urllib.parse
+from pathlib import Path
+
+
+ROOT = Path(__file__).resolve().parents[1]
+LINK_PATTERN = re.compile(
+ r"(?]*href=[\"']([^\"']+)[\"'])",
+ re.IGNORECASE,
+)
+SKIP_DIRS = {".git", ".venv", "venv", "node_modules", "site", "third_party"}
+
+
+def _iter_markdown_files():
+ for path in ROOT.rglob("*.md"):
+ if path.is_symlink():
+ continue
+ if not any(part in SKIP_DIRS for part in path.parts):
+ yield path
+
+
+def _is_external_or_anchor(url):
+ return url.startswith(
+ (
+ "#",
+ "http://",
+ "https://",
+ "mailto:",
+ "tel:",
+ "javascript:",
+ "data:",
+ )
+ )
+
+
+def test_relative_markdown_links_point_to_existing_paths():
+ missing = []
+
+ for markdown_path in _iter_markdown_files():
+ text = markdown_path.read_text(encoding="utf-8", errors="ignore")
+ for match in LINK_PATTERN.finditer(text):
+ raw_url = (match.group(1) or match.group(2) or "").strip()
+ url = raw_url.split()[0].strip("<>")
+ if not url:
+ missing.append(f"{markdown_path.relative_to(ROOT)} -> empty link")
+ continue
+ if _is_external_or_anchor(url):
+ continue
+
+ target = urllib.parse.unquote(url.split("#", 1)[0])
+ if not target:
+ continue
+
+ candidate = (
+ ROOT / target.lstrip("/")
+ if target.startswith("/")
+ else markdown_path.parent / target
+ )
+ if not candidate.exists():
+ missing.append(f"{markdown_path.relative_to(ROOT)} -> {raw_url}")
+
+ assert missing == []