ワンクリックで
tts-node
// Atomic reference for @panda-video-generator/tts-node: pnpm tts, cli.ts, processNarrationFile — Edge-TTS narration → audio.mp3 + audio.vtt; env vars TTS_*, EDGE_TTS_*, ffmpeg. Triggers: TTS, Edge-TTS, 口播音频, audio.mp3, public/tts.
// Atomic reference for @panda-video-generator/tts-node: pnpm tts, cli.ts, processNarrationFile — Edge-TTS narration → audio.mp3 + audio.vtt; env vars TTS_*, EDGE_TTS_*, ffmpeg. Triggers: TTS, Edge-TTS, 口播音频, audio.mp3, public/tts.
Multi-platform browser login and video upload via Playwright Test only (headed Chromium). Parallel uploads are allowed and encouraged: run one Playwright process per platform (e.g. separate terminals). Use when the user mentions publishing, uploading video, or logging in to Bilibili, Douyin, Kuaishou, Weixin Channels, or YouTube; or STEP3 / 多平台发布 / login:* / upload:*.
Prefer the hosting AI Agent to write narration into input.txt from crawl JSON (no external LLM). Fallback only: pnpm caption:env / generateVideoScript* (DeepSeek or Kimi) + optional WebVTT estimate. Triggers: 口播, input.txt, captions.vtt, LLM_PROVIDER, DEEPSEEK, MOONSHOT, KIMI.
Run Remotion renders from monorepo root: pnpm render:video, render:all / pipeline:tts-render, render:composition; sync-to-public, composition IDs, output/video paths, VIDEO_PUBLIC_DIR. Use for 渲染成片, output/video/video.mp4, remotion render, Cover-Still.
Atomic reference for three spider flows: spider:extract:file, spider:extract:url, spider:zhihu — inputs, outputs, env vars only.
Orchestrates repo pipeline from a single URL: branch Zhihu vs generic page → spider → DeepSeek caption when needed → Edge TTS → Remotion render to output/video/video.mp4. Use when the user gives a URL for 一条龙、网页转视频、爬取+口播+渲染、or automate spider→tts→render from link.
| name | tts-node |
| description | Atomic reference for @panda-video-generator/tts-node: pnpm tts, cli.ts, processNarrationFile — Edge-TTS narration → audio.mp3 + audio.vtt; env vars TTS_*, EDGE_TTS_*, ffmpeg. Triggers: TTS, Edge-TTS, 口播音频, audio.mp3, public/tts. |
包 @panda-video-generator/tts-node:读口播纯文本(非空行 = 一段),用 Microsoft Edge TTS 合成、ffmpeg 拼接并 atempo 加速,写出 audio.mp3 + audio.vtt。需 网络;ffmpeg 在 PATH。packages/tts-node/README.md 仅为路牌链回本文。
pnpm tts(生成 + 校验 + 同步到 public/)用法
pnpm tts
根脚本设 cross-env:SPIDER_OUTPUT_DIR=output/spider、TTS_OUTPUT_DIR=output/tts、TTS_PUBLIC_DIR=public/tts,执行 node scripts/run-tts.mjs:检查输入与 ffmpeg → tsx packages/tts-node/src/cli.ts → 再 node scripts/sync-outputs-to-public.mjs。
输入
| 项目 | 说明 |
|---|---|
| 口播文本文件 | 默认 $TTS_INPUT_FILE,未设则为 $SPIDER_OUTPUT_DIR/input.txt(路径相对仓库根,脚本内解析) |
输出
| 路径 | 内容 |
|---|---|
<TTS_OUTPUT_DIR>/audio.mp3 | 合并后的音频 |
<TTS_OUTPUT_DIR>/audio.vtt | 与真实分段时长对齐的 WebVTT |
<TTS_PUBLIC_DIR>/audio.mp3、<TTS_PUBLIC_DIR>/audio.vtt | sync 后的副本(供 Remotion 等) |
环境变量
| 变量 | 必填 | 默认 / 说明 |
|---|---|---|
SPIDER_OUTPUT_DIR | 否 | output/spider(参与默认输入路径) |
TTS_INPUT_FILE | 否 | <SPIDER_OUTPUT_DIR>/input.txt |
TTS_OUTPUT_DIR | 否 | output/tts |
TTS_PUBLIC_DIR | 否 | public/tts(sync 目标) |
EDGE_TTS_VOICE | 否 | zh-CN-YunjianNeural |
EDGE_TTS_BATCH_SIZE | 否 | 3,最大 8(并行段数) |
EDGE_TTS_TIMEOUT_MS | 否 | 120000(每段 WebSocket,下限 15000) |
sync-outputs-to-public)用法
在 monorepo 根(或自行保证 cwd 下相对路径正确):
pnpm exec tsx packages/tts-node/src/cli.ts [input_file] [output_dir]
省略参数时用环境变量默认值(见下),逻辑见 src/cli.ts:
pnpm exec tsx packages/tts-node/src/cli.ts
# → resolve(cwd, TTS_INPUT_FILE 或 <SPIDER_OUTPUT_DIR>/input.txt) → resolve(cwd, TTS_OUTPUT_DIR)
输入
| 项目 | 说明 |
|---|---|
input_file(可选 argv[2]) | 口播文本;未给则用 TTS_INPUT_FILE 或 <SPIDER_OUTPUT_DIR>/input.txt |
| 文本规则 | 非空行各为一段 TTS;全文为空或无非空行会 throw |
输出
| 路径 | 内容 |
|---|---|
<output_dir>/audio.mp3 | 合并后音频 |
<output_dir>/audio.vtt | WebVTT |
<output_dir>/sentence*.mp3 | 中间文件,流程结束会 删除 |
环境变量
| 变量 | 必填 | 默认 / 说明 |
|---|---|---|
SPIDER_OUTPUT_DIR | 否 | output/spider |
TTS_INPUT_FILE | 否 | <SPIDER_OUTPUT_DIR>/input.txt |
TTS_OUTPUT_DIR | 否 | output/tts(仅在未传 output_dir argv 时作为默认) |
EDGE_TTS_VOICE | 否 | 同用法 1 |
EDGE_TTS_BATCH_SIZE | 否 | 同用法 1 |
EDGE_TTS_TIMEOUT_MS | 否 | 同用法 1 |
cli.ts 不读取 TTS_PUBLIC_DIR(不同步 public)。
processNarrationFile用法
import { processNarrationFile } from '@panda-video-generator/tts-node';
await processNarrationFile('/abs/or/cwd-relative/input.txt', '/abs/or/cwd-relative/output/tts', {
voice: 'zh-CN-XiaoxiaoNeural',
speedFactor: 1.1,
batchSize: 3,
});
options 均可省略:voice / speedFactor(默认 1.1,ffmpeg atempo)/ batchSize(默认读 EDGE_TTS_BATCH_SIZE 或 3)。voice 未传时用 EDGE_TTS_VOICE 或 zh-CN-YunjianNeural;可用 normalizeVoiceForEdgeReadAloud(同包导出)纠正 Azure 式冒号命名。
输入
| 项目 | 说明 |
|---|---|
inputFile | 口播文件绝对路径或相对 当前 Node 进程 cwd |
outputDir | 输出目录(会 mkdir) |
输出
| 路径 | 内容 |
|---|---|
<outputDir>/audio.mp3、<outputDir>/audio.vtt | 同 CLI |
环境变量
| 变量 | 说明 |
|---|---|
EDGE_TTS_VOICE | options.voice 未传时使用 |
EDGE_TTS_BATCH_SIZE | options.batchSize 未传时使用 |
EDGE_TTS_TIMEOUT_MS | 每段超时 |
额外导出(按需):generateVtt、splitTextForVtt、formatVttTime(vtt.ts),一般 processNarrationFile 已写入 audio.vtt。