文档音频工作 流 (Docs TTS)
文档分类下的文章(如 docs/LookAround/)支持 TTS 朗读音频播放。与博客音频不同,文档音频播放器自动注入到页面布局中,无需在每篇文章的 MDX 文件里手动引入组件。
当前已接入音频的文档分类:
| 分类 | 目录 | 文章数 | 中文音频 | 英文音频 |
|---|---|---|---|---|
| 东张西望 (LookAround) | docs/LookAround/ | 4 | 已生成 | 未生成 |
架构概览
文档音频系统复用了博客音频的基础设施,通过少量改动实现了多清单支持。
组件关系
BlogAudioPlayer (核心播放逻辑)
├── 博客直接调用:<BlogAudioPlayer slug="xxx" />
│ └── 读取 blogAudioManifest.json(默认清单)
│
└── DocsAudioPlayer (薄包装)
└── <DocsAudioPlayer slug="xxx" />
└── 传入 docsAudioManifest.json + keyPrefix="docs/"
关键文件
| 文件 | 作用 |
|---|---|
src/components/BlogAudioPlayer/index.js | 核心播放器组件,支持 manifest 和 keyPrefix props |
src/components/DocsAudioPlayer/index.js | 文档音频薄包装,传入文档清单和前缀 |
src/utils/lookAroundDocs.js | LookAround 文档检测工具函数 |
src/theme/DocItem/Layout/index.js | 文档布局,自动注入播放器 |
src/data/docsAudioManifest.json | 文档音频清单(静态 import) |
static/audio/docs/manifest.json | 文档音频清单(备用访问路径) |
清单文件结构
docsAudioManifest.json 的 key 格式:
- 中文:
docs/{slug},如docs/omega-horizontal-vertical-analysis - 英文:
en/docs/{slug},如en/docs/omega-horizontal-vertical-analysis
每个条目包含:
{
"docs/omega-horizontal-vertical-analysis": {
"urls": [
"https://picture.nevergpdzy.cn/Audio/docs/omega-horizontal-vertical-analysis_001.mp3",
"https://picture.nevergpdzy.cn/Audio/docs/omega-horizontal-vertical-analysis_002.mp3"
],
"voice": "茉莉",
"generatedAt": "2026-05-01T16:46:32.495301+00:00"
}
}
OSS 路径
| 内容 | OSS 路径 |
|---|---|
| 中文文档音频 | Audio/docs/{slug}.mp3 或 Audio/docs/{slug}_001.mp3 等 |
| 英文文档音频 | Audio/docs/en/en_{slug}.mp3 或 Audio/docs/en/en_{slug}_001.mp3 等 |
| 文档音频清单 | Audio/docs/manifest.json |
与博客音频(Audio/blog/)完全独立,互不干扰。
生成音频
中文音频
cd ../tts-blog-generator
python generate.py --type docs
默认扫描 docs/LookAround/ 目录。脚本会:
- 提取每篇文章的纯文本(去除 frontmatter、代码块、markdown 格式等)
- 按 3500 字符限制分块
- 检测语言(CJK > 30% 为中文)
- 调用 MiMo-V2.5-TTS API 生成 WAV
- 通过 ffmpeg 转换为 MP3
- 上传到阿里云 OSS
英文音频
python generate.py --type docs --lang en \
--blog-dir "../Dev-Knowledge-Base/i18n/en/docusaurus-plugin-content-docs/current/LookAround"
英文音频使用 Chloe 语音,文件名带 en_ 前缀。
常用参数
| 参数 | 说明 |
|---|---|
--type docs | 生成文档音频(默认扫描 docs/LookAround/) |
--lang zh / --lang en | 指定语言 |
--blog-dir <path> | 自定义扫描目录 |
--force | 强制重新生成已存在的音频 |
--dry-run | 预览模式,不调用 API |
--skip-upload | 跳过 OSS 上传 |
复制清单文件到项目
生成完成后,将清单文件复制到项目中:
# 从 tts-blog-generator 目录执行
cp output/manifest.json ../Dev-Knowledge-Base/src/data/docsAudioManifest.json
cp output/manifest.json ../Dev-Knowledge-Base/static/audio/docs/manifest.json
output/manifest.json 同时包含博客和文档的条目。复制到项目后,DocsAudioPlayer 组件只会读取 docs/ 前缀的条目,不会影响博客音频。
播放器集成方式
自动注入(当前方式)
文档音频播放器在 src/theme/DocItem/Layout/index.js 中自动注入,无需修改任何 .md 文件。
注入逻辑:
import {isLookAroundDocMetadata, getLookAroundDocSlug} from '@site/src/utils/lookAroundDocs';
import DocsAudioPlayer from '@site/src/components/DocsAudioPlayer';
// 在 DocItemLayout 组件内:
const isLookAround = isLookAroundDocMetadata(metadata);
const lookAroundSlug = isLookAround ? getLookAroundDocSlug(metadata) : null;
// 渲染位置:面包屑和正文之间
<DocBreadcrumbs />
<DocVersionBadge />
{isLookAround && lookAroundSlug && <DocsAudioPlayer slug={lookAroundSlug} />}
{docTOC.mobile}
检测函数 isLookAroundDocMetadata() 通过 metadata.sourceDirName === 'LookAround' 判断当前文档是否属于 LookAround 分类。