feat(site): attribute ecosystem repository traffic (#3441)

Route Fun-ASR, SenseVoice, and FunClip repository links through fixed funasr.com conversion endpoints so ecosystem traffic can be measured per repository.

Signed-off-by: Zhifu Gao <[email protected]>
This commit is contained in:
zhifu gao
2026-07-30 03:53:11 +08:00
committed by GitHub
parent 30caaf8e18
commit 088da0487e
8 changed files with 42 additions and 10 deletions
+3
View File
@@ -1,6 +1,9 @@
map $uri $funasr_conversion_target {
default "";
/go/github https://github.com/modelscope/FunASR;
/go/fun-asr https://github.com/QwenAudio/Fun-ASR;
/go/sensevoice https://github.com/QwenAudio/SenseVoice;
/go/funclip https://github.com/modelscope/FunClip;
/go/docs https://github.com/modelscope/FunASR/tree/main/docs;
/go/releases https://github.com/modelscope/FunASR/releases;
/go/deploy-vllm https://www.funasr.com/deploy/vllm.html;
@@ -37,7 +37,7 @@
"css/index.1682178c.css": "b5f6034ce886c25773928c114e4290d1c491a3d081677b488810198efd76b4e1",
"decoder.js": "f2023a28036b1ff58e5bdabbb72ea427f8faaf60e89acd78ff183c313bdb0a2c",
"donors.html": "eec6b789b29c27d372925ae0ad3e13d4c6e62978b3c38c4da9e3aec129f10934",
"ecosystem.html": "1774b107ae9c29dea63889df7fc72ce9f20482c9531c20a93b956e6d1e735c14",
"ecosystem.html": "3b227e085d285018188ac3c2891d8940455f661fa7dcfa3a69ef4c4b12a8a7db",
"en/blog/cantonese-speech-recognition.html": "b9bd146198206f781c37f341c370a690dc83cd7163334e34b4e7f65e69af8ff2",
"en/blog/chinese-speech-recognition.html": "16b68bd2a1122236c580c62275002ae2c0875ca14e32686e88d3b5ccfa9f56ef",
"en/blog/fun-asr-nano-guide.html": "1746c708bd0606188de4266d8255984dd9e14634af33c54ad65a5f05b767be1b",
@@ -67,10 +67,10 @@
"en/blog/voice-activity-detection-python.html": "d12f5d0f4ae07c3434f6188d12f5603b8abb9578413b79133668638d1c5e18a7",
"en/blog/which-funasr-model.html": "1207180aa929a3aa51db136c1098f4edc8f07405e2b56fe033998bf996f8ec7f",
"en/donors.html": "eacb7f9434b1b29e13e9b0175bb9680556ee72ab4dbd155e68f9c912eb0212b1",
"en/ecosystem.html": "ba37210274c38f1a8aa3cee762e866f2dc5fb70c7690d7313d45f40f9274aa43",
"en/ecosystem.html": "e07daf9a241d28b9a25df7d58c693289d61e056cb864faf71095aa6cef7b5b32",
"en/index.html": "4950bc2e0b337637300c5bcd45d1820d9636c4f1dab34e0ec8d3443be44bd277",
"en/llama-cpp.html": "dbfbd125ebbf07f7d923c91b122818f8b09484ce54c1e80eba66a89d22dfb5b4",
"en/models.html": "07421617d1e56a6b5d239fc683bdf62d6bd9e5ecb0f4f82013ee9929cfd91829",
"en/models.html": "c2add621edc3aa63e6d49587f089ee5ac6c05faf5f68e14fef70a7a5ab443a4d",
"en/quickstart.html": "2735cc9e608bfc7860eaa0c0e1242088d98204bca92cfec7ae7923a056f968c4",
"en/vs-whisper.html": "1779f98b2eae8579f3694577bc9dda81bd954423b49dd201ff17dcfb5e630ab1",
"favicon.ico": "e5edd9f12088fa920b848485c62c72a093f27bfba7b6a46b4e7b63c34eb5126a",
@@ -94,7 +94,7 @@
"lang-redirect.js": "e1189080a8e81eb76cf39e0538d0378b6631f5aa87e4679c0fd4fd34d1f6c197",
"llama-cpp.html": "892b5c05e3375bcc7cd0af343b629f069d8ec4f372e6470cd830cdf2181a11d5",
"logo.png": "ac0ff97f2b0203c3fad4ac5e90231d93e36d98cc8e90d383483de150b0dd0728",
"models.html": "c05da7a2b1aaa7390d0e8d5135ed08646bfb50c357919ad160fd30049eb82364",
"models.html": "2fa557c327c81717e5ae145ae96436168ea51f58301bd7bb6357d4e15686cdfc",
"quickstart.html": "90c5f25b428b064be02df11c38d24556ec97f4bc80900398c223424aaa48e7b8",
"robots.txt": "1305b0f680b3e9f73b01301dc474423230dffab85731a379a694f30c73c07f2d",
"sitemap.xml": "055e1fbf6da8689720eca3ce508b7115dfbb90ebf45cd4cab18d0b13d01aa139",
+1 -1
View File
@@ -82,7 +82,7 @@ footer a{color:#60a5fa}
<h2>视频与媒体工具</h2>
<div class="card-grid">
<div class="card">
<div class="card-title"><a href="https://github.com/modelscope/FunClip">FunClip</a></div>
<div class="card-title"><a href="/go/funclip">FunClip</a></div>
<div class="card-stars">6K+ stars</div>
<div class="card-desc">基于语音识别的智能视频剪辑。自动生成字幕,支持按关键词和说话人剪辑视频片段。<a href="https://github.com/modelscope/FunClip/releases/tag/v2.1.0">下载 v2.1.0</a></div>
<div><span class="card-tag">视频</span><span class="card-tag green">官方</span></div>
@@ -83,7 +83,7 @@ footer a{color:#60a5fa}
<h2>Video & Media Tools</h2>
<div class="card-grid">
<div class="card">
<div class="card-title"><a href="https://github.com/modelscope/FunClip">FunClip</a></div>
<div class="card-title"><a href="/go/funclip">FunClip</a></div>
<div class="card-stars">6K+ stars</div>
<div class="card-desc">ASR-powered video clipping. Automatic subtitles, keyword and speaker-based clip extraction. <a href="https://github.com/modelscope/FunClip/releases/tag/v2.1.0">Download v2.1.0</a></div>
<div><span class="card-tag">Video</span><span class="card-tag green">Official</span></div>
+2 -2
View File
@@ -87,7 +87,7 @@ footer a{color:#60a5fa}
<div class="model-card">
<div class="model-name">Fun-ASR-Nano <span class="badge badge-orange">⭐ Flagship / default</span></div>
<div class="model-meta">800M params &middot; LLM-based (SenseVoice encoder + Qwen3-0.6B) &middot; <a href="https://github.com/QwenAudio/Fun-ASR">GitHub</a> &middot; <a href="https://huggingface.co/FunAudioLLM/Fun-ASR-Nano-2512">HuggingFace</a></div>
<div class="model-meta">800M params &middot; LLM-based (SenseVoice encoder + Qwen3-0.6B) &middot; <a href="/go/fun-asr">GitHub</a> &middot; <a href="https://huggingface.co/FunAudioLLM/Fun-ASR-Nano-2512">HuggingFace</a></div>
<div class="model-desc">Next-generation LLM-based ASR model. Combines SenseVoice's audio encoder with Qwen3-0.6B language model for superior context understanding. Supports vLLM acceleration for high-throughput batch inference and real-time streaming. The released <code>model.pt</code> checkpoint does not provide reliable checkpoint-native character timestamps (<a href="https://github.com/QwenAudio/Fun-ASR/issues/106" target="_blank" rel="noopener">issue #106</a>).</div>
<div class="model-features">
<span class="badge badge-green">vLLM accelerated</span>
@@ -122,7 +122,7 @@ result = model.generate(input="audio.wav")</pre>
<div class="model-card">
<div class="model-name">SenseVoice Small</div>
<div class="model-meta">234M params &middot; Non-autoregressive &middot; <a href="https://github.com/QwenAudio/SenseVoice">GitHub</a> &middot; <a href="https://huggingface.co/FunAudioLLM/SenseVoiceSmall">HuggingFace</a></div>
<div class="model-meta">234M params &middot; Non-autoregressive &middot; <a href="/go/sensevoice">GitHub</a> &middot; <a href="https://huggingface.co/FunAudioLLM/SenseVoiceSmall">HuggingFace</a></div>
<div class="model-desc">Ultra-fast speech recognition with built-in emotion and audio event detection. Supports 50+ languages including Chinese, English, Japanese, Korean, French, German, and more. Non-autoregressive architecture delivers 170x realtime speed on GPU.</div>
<div class="model-features">
<span class="badge badge-green">170x realtime</span>
+2 -2
View File
@@ -87,7 +87,7 @@ footer a{color:#60a5fa}
<div class="model-card">
<div class="model-name">Fun-ASR-Nano <span class="badge badge-orange">⭐ 旗舰 / 默认推荐</span></div>
<div class="model-meta">800M 参数 &middot; LLM 架构 (SenseVoice 编码器 + Qwen3-0.6B) &middot; <a href="https://github.com/QwenAudio/Fun-ASR">GitHub</a> &middot; <a href="https://huggingface.co/FunAudioLLM/Fun-ASR-Nano-2512">HuggingFace</a></div>
<div class="model-meta">800M 参数 &middot; LLM 架构 (SenseVoice 编码器 + Qwen3-0.6B) &middot; <a href="/go/fun-asr">GitHub</a> &middot; <a href="https://huggingface.co/FunAudioLLM/Fun-ASR-Nano-2512">HuggingFace</a></div>
<div class="model-desc">新一代 LLM 架构 ASR 模型。融合 SenseVoice 音频编码器与 Qwen3-0.6B 语言模型,具备更强的上下文理解能力。支持 vLLM 加速的高吞吐批量推理与实时流式服务。发布的 <code>model.pt</code> checkpoint 不提供可靠的原生字级时间戳(<a href="https://github.com/QwenAudio/Fun-ASR/issues/106" target="_blank" rel="noopener">issue #106</a>)。</div>
<div class="model-features">
<span class="badge badge-green">vLLM 加速</span>
@@ -122,7 +122,7 @@ result = model.generate(input="audio.wav")</pre>
<div class="model-card">
<div class="model-name">SenseVoice Small</div>
<div class="model-meta">234M 参数 &middot; 非自回归 &middot; <a href="https://github.com/QwenAudio/SenseVoice">GitHub</a> &middot; <a href="https://huggingface.co/FunAudioLLM/SenseVoiceSmall">HuggingFace</a></div>
<div class="model-meta">234M 参数 &middot; 非自回归 &middot; <a href="/go/sensevoice">GitHub</a> &middot; <a href="https://huggingface.co/FunAudioLLM/SenseVoiceSmall">HuggingFace</a></div>
<div class="model-desc">极速语音识别,内置情感和音频事件检测。支持 50+ 语种,包括中文、英文、日文、韩文、法文、德文等。非自回归架构在 GPU 上实现 170 倍实时速度。</div>
<div class="model-features">
<span class="badge badge-green">170 倍实时</span>
@@ -139,6 +139,26 @@ def test_old_llama_routes_point_to_product_pages(built_site):
)
@pytest.mark.parametrize('relative', ('models.html', 'en/models.html'))
def test_model_pages_use_attributed_repository_routes(built_site, relative):
soup = read_soup(built_site / relative)
hrefs = {link.get('href') for link in soup.select('a[href]')}
assert '/go/fun-asr' in hrefs
assert '/go/sensevoice' in hrefs
assert 'https://github.com/QwenAudio/Fun-ASR' not in hrefs
assert 'https://github.com/QwenAudio/SenseVoice' not in hrefs
@pytest.mark.parametrize('relative', ('ecosystem.html', 'en/ecosystem.html'))
def test_ecosystem_pages_use_attributed_funclip_route(built_site, relative):
soup = read_soup(built_site / relative)
hrefs = {link.get('href') for link in soup.select('a[href]')}
assert '/go/funclip' in hrefs
assert 'https://github.com/modelscope/FunClip' not in hrefs
@pytest.mark.parametrize('relative', ('ecosystem.html', 'en/ecosystem.html'))
def test_ecosystem_surfaces_orca_sensevoice_desktop_integration(built_site, relative):
soup = read_soup(built_site / relative)
@@ -13,11 +13,19 @@ CONVERSION_MAP = REPO_ROOT / 'web-pages' / 'nginx' / 'conversion-map.conf'
NGINX_CONFIG = REPO_ROOT / 'web-pages' / 'nginx' / 'funasr.com.conf'
EXPECTED_FIXED_ROUTES = {
'/go/github',
'/go/fun-asr',
'/go/sensevoice',
'/go/funclip',
'/go/docs',
'/go/releases',
'/go/deploy-vllm',
'/go/deploy-llama-cpp',
}
EXPECTED_REPOSITORY_ROUTES = {
'/go/fun-asr': 'https://github.com/QwenAudio/Fun-ASR',
'/go/sensevoice': 'https://github.com/QwenAudio/SenseVoice',
'/go/funclip': 'https://github.com/modelscope/FunClip',
}
def executable(path: Path, body: str) -> Path:
@@ -120,6 +128,7 @@ def test_conversion_map_contains_only_fixed_redirects():
routes[route] = target
assert set(routes) == EXPECTED_FIXED_ROUTES
assert EXPECTED_REPOSITORY_ROUTES.items() <= routes.items()
assert all(
target.startswith('https://github.com/') or target.startswith('https://www.funasr.com/')
for target in routes.values()