相比于前面的单纯通过声音洗新闻稿件的文字内容,本次我们提升了一定的难度,面向连麦切片场景。
你怎么知道我喜欢看听勇哥和大冰的连麦?
那么,我们要处理的核心难点包括:
- 区分不同的发言人
- 最好能配一些连麦截图到文章里
先看看成品效果:
1. 架构总览
这套工作流通过 并行处理 极大提高了效率:
-
输入端:支持 YouTube URL 下载或本地视频文件。
-
音频线:提取音频 -> Deepgram (语音转文字 + 角色分离) -> 文本清洗。
-
视频线:智能截图 (FFmpeg) -> Qshell (上传七牛云) -> 生成图片链接。
-
汇聚端:文本 + 图片链接 -> DeepSeek (AI 深度改写与排版) -> 本地 Markdown 文件。
2. 环境准备
可以参考我之前的文章,基于node 16构建一个 debian 镜像,并内置 yt-dlp 和 FFmpeg。
除此之外,需要安装一个 OSS 工具,因为我用的七牛云,所以是 Qshell,这个根据自己的情况定制就行。
以下是我的 Dockerfile,仅供参考吧:
FROM node:20-bookworm
# 1. 接收构建参数
ARG HTTP_PROXY
ARG HTTPS_PROXY
USER root
# 2. 【系统层代理】
ENV http_proxy=${HTTP_PROXY}
ENV https_proxy=${HTTPS_PROXY}
# 安装系统工具 (Debian环境)
# 增加了 unzip,虽然 tar 也可以,但 unzip 处理某些 zip 包更方便,不过 qshell 是 tar.gz,这里只用 tar 即可
RUN apt-get update && \
apt-get install -y python3 python3-pip ffmpeg wget && \
rm -rf /var/lib/apt/lists/*
# -------------------------------------------------------
# 2.5 安装工具集:yt-dlp 和 Qshell (七牛命令行)
# -------------------------------------------------------
# 安装 yt-dlp
RUN wget https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -O /usr/local/bin/yt-dlp && \
chmod a+rx /usr/local/bin/yt-dlp
# 安装 Qshell (添加到这里)
# Qshell v2.13.0 是目前比较稳定的版本
RUN wget https://devtools.qiniu.com/qshell-v2.13.0-linux-amd64.tar.gz -O /tmp/qshell.tar.gz && \
tar -zxvf /tmp/qshell.tar.gz -C /tmp && \
# 注意:解压后的文件夹名称通常包含版本号,移动并重命名为 qshell
mv /tmp/qshell /usr/local/bin/qshell && \
chmod +x /usr/local/bin/qshell && \
rm /tmp/qshell.tar.gz
# -------------------------------------------------------
# 3. 【NPM 层代理】安装 n8n
RUN npm config set proxy ${HTTP_PROXY} && \
npm config set https-proxy ${HTTPS_PROXY} && \
npm install -g n8n && \
npm config delete proxy && \
npm config delete https-proxy
# 4. 权限与清理
RUN mkdir -p /home/node/.n8n /files && \
chown -R node:node /home/node/.n8n /files
# 清理环境变量
ENV http_proxy=""
ENV https_proxy=""
USER node
ENTRYPOINT ["n8n"]
启动命令 (在 docker-compose.yml 所在目录):
docker-compose up -d --build
3. 核心节点配置详解
看看节点布置吧。
3.1 截图节点 (Execute Command)
首先是截图,相比于新闻类的视频,连麦视频对于截图的精准性要求低很多。
以“大冰”的连麦视频为例,反正截来截去就是大冰一张瘦脸怼在哪里,所以啥时候截图问题不大,关键有图效果就会好很多。
不使用固定秒数,而是基于视频时长的 33% 和 66% 处截图,并加上 日期时间戳 防止文件名冲突。
- Command Shell 脚本:
#!/bin/sh
# ---------------- 配置区域 ----------------
VIDEO_PATH="{{ $json.full_path }}"
FOLDER_NAME="{{ $json.clean_name }}"
# 1. 确定输出目录
PARENT_DIR=$(dirname "$VIDEO_PATH")
OUTPUT_DIR="$PARENT_DIR/$FOLDER_NAME"
mkdir -p "$OUTPUT_DIR"
# 2. 获取视频时长 & 计算切入点
DURATION=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$VIDEO_PATH")
T1=$(awk "BEGIN {print $DURATION * 0.33}")
T2=$(awk "BEGIN {print $DURATION * 0.66}")
# 3. 生成当前系统时间戳 (防止文件名重复)
# 格式: 20250114-103005
NOW_STR=$(date +"%Y%m%d-%H%M%S")
# 4. 定义文件名 (带上序号)
IMG1="$OUTPUT_DIR/${NOW_STR}-1.jpg"
IMG2="$OUTPUT_DIR/${NOW_STR}-2.jpg"
# 5. 执行极速截图 (-ss 放在 -i 之前)
ffmpeg -ss "$T1" -i "$VIDEO_PATH" -frames:v 1 -q:v 2 -y "$IMG1" > /dev/null 2>&1
ffmpeg -ss "$T2" -i "$VIDEO_PATH" -frames:v 1 -q:v 2 -y "$IMG2" > /dev/null 2>&1
# 6. 输出 JSON 给后续节点
echo "{\"img1_path\": \"$IMG1\", \"img2_path\": \"$IMG2\", \"folder_path\": \"$OUTPUT_DIR\", \"clean_name\": \"$FOLDER_NAME\"}"
3.2 上传节点 (Execute Command - Qshell)
直接调用七牛云 CLI 上传文件夹,比 n8n 原生 S3 节点更稳定。
- Command Shell 脚本:
#!/bin/sh
# -------- 配置区域 --------
AK="你的AccessKey"
SK="你的SecretKey"
BUCKET="你的存储桶名称"
DOMAIN="https://你的域名" # 注意:末尾不要带斜杠
# -------------------------
LOCAL_FOLDER="{{ JSON.parse($json.stdout).folder_path }}"
# 1. 登录七牛 (清理旧配置以防报错)
rm -rf ~/.qshell/account.db > /dev/null 2>&1
qshell account "$AK" "$SK" default
# 2. 遍历上传并生成链接
IMG_URLS=""
for file in "$LOCAL_FOLDER"/*.jpg; do
if [ -f "$file" ]; then
FILENAME=$(basename "$file")
# 构造云端路径: pic/n8n/文件夹名/文件名
KEY="pic/n8n/{{ JSON.parse($json.stdout).clean_name }}/$FILENAME"
qshell fput "$BUCKET" "$KEY" "$file" --overwrite > /dev/null 2>&1
IMG_URLS="$IMG_URLS $DOMAIN/$KEY"
fi
done
# 3. 输出 URL 列表
echo "$IMG_URLS"
3.3 音频处理 (Deepgram)
Deepgram 是目前最强的声音处理AI厂商,关键还能白嫖200刀的额度。比如说连麦场景,它可以轻松分辨出不同发言人的声音。
这对我们的场景来说非常关键。
- Method: POST
- URL:
https://api.deepgram.com/v1/listen?model=nova-2&language=zh&diarize=true - 关键点: 必须开启
diarize=true才能区分不同说话人。
3.4 数据汇聚 (Merge Node - 关键)
为了让 DeepSeek 同时拿到“文本”和“图片”,必须正确设置 Merge 节点。
- Mode (模式):
Combine(合并) - Combine By (合并方式):
Merge By Position(按位置合并) - 效果: 将上游两条线的数据合并为同一个 JSON 对象。
3.5 AI 写作 (DeepSeek Chat Model)
这是赋予文章灵魂的一步。
- System Prompt: 设定为资深科技主笔。
- User Prompt (Expression 模式):
【对话素材】
{{ $json.text }}
【可用配图列表】
{{ $json.markdown_list }}
(共 {{ $json.count }} 张图片)
【任务】
请基于以上对话素材撰写文章,并遵循以下规则:
1. **智能配图**:你拥有 {{ $json.count }} 张图片的支配权。请根据文章篇幅和叙事节奏,将这些图片**均匀地**插入到文中(例如:文章前1/3处插入第一张,后1/3处插入第二张)。必须原样输出Markdown图片链接。
2. **角色识别**:
- 核心观点输出者是“{{ $('表单').item.json.player1 }}”(例如:大冰)。
- 寻求建议者是“{{ $('表单').item.json.player2 }}”(例如:连麦人)。
- 请识别文本中的 [发言人0] 和 [发言人1] 分别对应谁,并在文章中正确称呼,不要使用“发言人0”这种代号。
3. **风格要求**:拒绝流水账,使用深度分析或故事叙述风格,自动提炼小标题。
4. 使用说明
- 启动工作流:点击 n8n 界面上的
Test Workflow或使用 Webhook。 - 填写表单:
- Mode: 选择
download(下载 YouTube) 或local_video(处理 Docker 目录下的文件)。 - URL: 视频链接或文件名。
- 核心角色: 填入“大冰”或“罗翔”等。
- 对话人: 填入“连麦观众”或“学生”等。
- Mode: 选择
- 查看结果:
- 运行结束后,在 Docker 挂载的
/files目录下会生成一个视频文件名__对话.md文件。 - 文件内已自动排版并插入了七牛云的图片链接。
- 运行结束后,在 Docker 挂载的
5. 常见问题排查
- Qshell 报错
executable file not found:- 说明 Docker 镜像没构建好。请确保运行了
docker-compose up -d --build。
- 说明 Docker 镜像没构建好。请确保运行了
- DeepSeek 读不到文本或图片:
- 检查 Merge 节点是否设置为了
Combine+Merge By Position。这是最常见的错误点。
- 检查 Merge 节点是否设置为了
- 文件无法写入:
- 检查 Docker 挂载目录的权限。宿主机上执行
chmod -R 777 ./local_files解决权限问题。
- 检查 Docker 挂载目录的权限。宿主机上执行