关于 podcast-edit
用于将原始录音处理成成品播客音频或视频的技能,涵盖基于转录的剪辑、音频增强和成品局部重剪,也可制作精彩片段与短集锦。
主要功能
- 01基于转录定位开头和结尾
- 02移除口头填充词与静音
- 03降噪并平衡说话人音量
- 04规范播客响度
- 05对成品进行局部重剪
- 06制作精彩片段和短集锦
适用场景
- 01润色原始播客或会议录音
- 02移除口头填充词和长时间停顿
- 03让视频剪辑与音频剪辑保持一致
- 04从节目中制作可分享片段
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ openclaudia/ openclaudia-skills --skill podcast-edit安装后在 Claude Code 中输入/podcast-edit确认已加载。
附带文件filler_removal.pyvideo_cut.py
详细介绍
播客编辑技能
将原始播客/会议录音处理成精良的播客节目。
功能
- 智能裁剪 — 通过转录并检测片头和片尾,找到播客的实际起止位置
- 删除填充词 — 删除口头语:嗯、呃、啊、哦、对对对、um、uh 等
- 裁剪静音 — 将长时间静音(>2s)缩短为自然的停顿(约 0.6s)
- 音频增强 — 降噪、均衡、多说话人音量平衡,以及标准化到播客标准的响度(−16 LUFS)
- 重新剪辑已完成的节目 — 无需重新运行整个流程,即可从已渲染的节目中精准删除标记的片段
- 精彩片段和串烧 — 剪出适合分享的精彩音频片段,并配乐拼接成约 1 分钟的串烧
- 视频剪辑 — 对 Zoom/Riverside 视频录制应用相同的编辑(参见“视频节目”)
前置条件
- 已安装
ffmpeg和ffprobe - 环境中设置了
OPENAI_API_KEY(用于 Whisper API 转录) - Python 3,仅使用标准库(辅助脚本无需额外依赖)
- 可选:
resemblyzer(pip install resemblyzer)— 仅在制作精彩片段串烧时用于说话人分离
工作流程
步骤 1:检查音频文件
ffprobe -v quiet -print_format json -show_format -show_streams "INPUT_FILE"
注意:时长、采样率、声道数、编解码器、比特率。
步骤 2:查找播客起止位置(如果用户要求裁剪开头/结尾)
将音频拆分为 5 分钟的片段,并通过 OpenAI Whisper API 转录,获取片段级时间戳:
# Extract chunk
ffmpeg -y -i "INPUT_FILE" -ss OFFSET -t 300 -ar 16000 -ac 1 /tmp/chunk_OFFSET.mp3
# Transcribe
curl -s https://api.openai.com/v1/audio/transcriptions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-F file="@/tmp/chunk_OFFSET.mp3" \
-F model="whisper-1" \
-F response_format="verbose_json" \
-F language="LANG" \
-F 'timestamp_granularities[]=segment' > /tmp/transcript_OFFSET.json
扫描转录文本,查找:
- 开始标记:“welcome”“hello everyone”“大家好”“欢迎”、片头音乐、第一句实质性话题内容
- 结束标记:“see you next time”“bye”“下期见”“感谢收听”,之后接着节目后的闲聊
使用 -ss START -to END 和 -c copy(不重新编码)进行初步裁剪,生成工作文件。
步骤 3:删除填充词
将裁剪后的文件拆分为 5 分钟的片段,并逐段进行转录,获取词级时间戳:
# Extract chunks
for i in $(seq 0 300 DURATION); do
ffmpeg -y -i "TRIMMED_FILE" -ss $i -t 300 -ar 16000 -ac 1 /tmp/wchunk_${i}.mp3
done
# Transcribe each chunk (can run in parallel)
for i in $(seq 0 300 DURATION); do
curl -s https://api.openai.com/v1/audio/transcriptions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-F file="@/tmp/wchunk_${i}.mp3" \
-F model="whisper-1" \
-F response_format="verbose_json" \
-F language="LANG" \
-F 'timestamp_granularities[]=word' \
-F 'timestamp_granularities[]=segment' > /tmp/wtranscript_${i}.json &
done
wait
然后运行此技能附带的填充词删除脚本:
python3 ./filler_removal.py \
--total-duration DURATION \
--end-at END_TIMESTAMP \
--cut START1:END1 --cut START2:END2 \
--chunk-offsets 0,300,600,900,...
参数:
--total-duration:裁剪后输入文件的时长,单位为秒(必填)--end-at:裁剪此时间戳之后的所有内容(例如,节目后闲聊的开始时间)--cut START:END:裁剪指定范围。可重复使用。--chunk-offsets:以逗号分隔的片段偏移量(默认:自动使用 0,300,600,…)
脚本会输出 /tmp/ffmpeg_filter.txt,其中包含 atrim+concat 滤镜。
分两次应用此滤镜:
# Step A: Cut fillers → intermediate WAV (avoids re-encoding artifacts)
ffmpeg -y -i "TRIMMED_FILE" \
-filter_complex_script /tmp/ffmpeg_filter.txt \
-map '[out]' -c:a pcm_s16le -ar 44100 /tmp/podcast_cut.wav
# Step B: Enhance audio → final MP3
ffmpeg -y -i /tmp/podcast_cut.wav \
-af "ENHANCEMENT_CHAIN" \
-c:a libmp3lame -b:a 192k "OUTPUT_FILE"
局限: Whisper 对中文的词级时间戳可能会漏掉与相邻语音连在一起的填充词。脚本能可靠地捕捉独立出现的填充词,但可能会漏掉约 10–20% 与语音连在一起的填充词。
步骤 4:音频增强滤镜链
默认滤镜链(适合嘉宾 — 可处理多说话人音量不均衡)。 以往操作中最大的错误是使用噪声门(agate),导致音量较小的嘉宾完全无声。绝不要将 agate 加回默认滤镜链。
highpass=f=80, # Remove room rumble
lowpass=f=12000, # Remove hiss (use 7500 for 16kHz sources)
afftdn=nf=-25:nr=8:nt=w, # Gentle FFT noise reduction
equalizer=f=180:t=q:w=1.5:g=-2, # Cut mud
equalizer=f=2500:t=q:w=1.2:g=3, # Boost presence
equalizer=f=4500:t=q:w=1.5:g=1.5, # Boost clarity
dynaudnorm=f=200:g=5:p=0.95:m=5:s=0, # Rolling-window normalization — lifts the quieter speaker independently
acompressor=threshold=-20dB:ratio=2:attack=5:release=200:makeup=1, # Gentle glue
loudnorm=I=-16:TP=-1.5:LRA=13 # Podcast standard loudness
为什么 dynaudnorm 是关键: 它会以 200 ms 的滚动窗口进行标准化,因此嘉宾说话时,其所在窗口会单独提升,不受主持人较大音量窗口的影响。顺序很重要 — 先运行 dynaudnorm,再运行 acompressor,这样压缩器接收到的信号才是平衡的。
切勿将以下滤镜加入默认滤镜链:
agate(噪声门)— 会切断所有音量低于阈值的说话人;会让嘉宾无声。- 重度压缩(比例 >3:1、增益补偿 >2 dB)— 会压平动态范围,让嘉宾听起来音量忽高忽低。
- 在
loudnorm中使用较窄的 LRA(<12)— 会破坏自然的语音动态范围。
根据源采样率调整低通滤波器:
- 16kHz 源文件 →
lowpass=7500 - 44.1kHz+ 源文件 →
lowpass=12000(或跳过)
渲染后验证嘉宾是否清晰可听: 运行 ffmpeg -i OUTPUT -af "ebur128=peak=true" -f null -,检查 I: 是否接近 −16 LUFS,且 LRA: 是否为 4–6 LU(由于 dynaudnorm 已先进行逐窗口平衡,更窄的 LRA 也可以接受)。如果输出听起来像是嘉宾被切掉了,检查是否误加了噪声门或激进的压缩器。
步骤 5:验证输出
ls -lh "OUTPUT_FILE"
ffprobe -v quiet -show_entries format=duration -of csv=p=0 "OUTPUT_FILE"
报告:时长、文件大小、移除了什么(填充词数量、静音数量、节省的时间)。
视频单集(Zoom / Riverside 录制内容)
如果源文件是视频,且用户希望拿到剪辑后的视频(例如,联合主持人需要将剪辑后的单集配音成另一种语言),请完全按照上述步骤 1–3 操作——使用 -vn 直接从 mp4 中提取音频片段——然后在一次处理中将相同的剪辑点应用于画面和声音:
# 1) same chunks + transcription as Step 3, but sourced from the video
for i in $(seq 0 300 DURATION); do
ffmpeg -y -v error -ss $i -t 300 -i SOURCE.mp4 -vn -ar 16000 -ac 1 /tmp/wchunk_${i}.mp3 &
done; wait
# 2) filler_removal.py as usual -> /tmp/ffmpeg_filter.txt
# 3) turn its keep segments into a combined video+audio filter
python3 video_cut.py /tmp/video_filter.txt
# 4) one render pass (hardware encoder; ~7 min for a 60-min 1080p episode)
ffmpeg -y -i SOURCE.mp4 -filter_complex_script /tmp/video_filter.txt \
-map '[vout]' -map '[aout]' \
-c:v h264_videotoolbox -b:v 3500k -c:a aac -b:a 160k \
-movflags +faststart episode-edited.mp4
在非 Apple 硬件上,使用 -c:v libx264 -crf 21 -preset veryfast,而不是 h264_videotoolbox。
注意:
- 使用
$(seq 0 300 3600 | paste -sd, -)构建--chunk-offsets。 末尾带有空字段会导致参数解析器崩溃。 - 输出采用跳切风格。这是预期效果,对于面对镜头的网格画面来说也没问题;在 400 多个剪辑点使用短暂的淡化效果,比硬切更糟。
video_cut.py会在同一次处理中应用增强链,因此与音频流程不同,不需要两遍处理的 WAV 中间文件。之后不要再次运行增强链。- 60 分钟的 1080p 输出需预留约 1.5 GB 空间——文件太大,无法通过电子邮件发送,因此请上传并分享链接。
- 将保留片段列表保存在单集文件旁边。 若没有该列表,之后收到“用同样的剪辑方式处理视频”的请求时,就必须重新推导剪辑点,而且它们将与已交付的音频版本不匹配。
输出规范
- 格式:MP3,192 kbps,单声道(除非源文件是立体声,且每个声道有不同的发言者)
- 响度:−16 LUFS(播客标准)
- 始终采用两遍处理:先剪辑为 WAV,再增强为 MP3
重新剪辑已完成的单集
如果用户指出已发布单集中的具体问题(“有几句话还留在里面”“剪掉关于 X 的部分”“结尾是重新录制的”“删掉重复的开场白”),不要从原始文件重新运行整个流程。 从已完成的 MP3 中精准剪掉有问题的片段,并重新编码一次:
- 将最终版文件按 5 分钟分块重新转录(分段粒度)→ 生成一份包含绝对时间戳的统一转录文本。这就是你的剪辑地图。
- 针对每个标记的问题,仅获取包含该内容的片段的词级时间戳(这些短语通常嵌在句子中间,而不是位于分段边界)。精确定位起止点。
- 构建一个
atrim+concat滤镜,保留所有剪辑范围之外的内容;渲染为 WAV(pcm_s16le),然后进行一次 MP3 处理。不要重新应用增强链——最终版已经过增强和响度标准化;再次运行会导致重复处理。 - 验证每个拼接点:在新时间轴上,以每个新拼接点为中心提取约 11 秒的片段,并重新转录。确认问题音频已删除,且拼接处衔接自然。
- 重新计算任何节目说明中的时间轴:每个剪辑点之后的时间戳都要提前,提前量为该点之前所有剪辑时长之和。如果已发布文件在开头加有精彩片段集锦,还要将集锦时长计入偏移量(重新剪辑集锦会改变其长度,因此整个单集的时间也会发生偏移)。
重新剪辑检查清单——首轮处理中常见的残留内容
这些内容与实际句子融在一起,因此会在移除填充词和静音后残留下来。请明确扫描转录文本,查找以下内容:
- 会议/技术闲聊:“你静音了/取消静音”“你声音太小/听得到吗”“你能看到我的屏幕吗”“等一下我看一下”。剪掉相关短语,保留周围内容。
- **无果而终的话题:**讨论组提出了一个无人调研过的产品或案例,随后说“我们就跳过吧/咱们跳过吧”——应剪掉整个岔题,而不只是跳过的那句话。
- **重新录制的片段(尤其是结尾):**先录了一遍不理想的内容,随后出现“重新开始/从头来/咱们重新来/感觉重复了”之类的提示,再录一遍干净版本。剪掉第一次失败的录音,保留重录内容。务必检查最后约 3 分钟的内容。
- **节目开始前的内容/重复开场白:**正式开始前录制的自我介绍,之后又重复了一遍——剪掉节目开始前的版本。
Whisper API 不稳定
并行调用词级时间戳接口有时会返回空结果(0 字节)。请将空结果按顺序重试,每次调用之间执行 sleep 1。
精彩片段与 1 分钟混剪
从已完成的单集节目中剪出简短、适合分享的精彩语录(有争议性或富有见地的时刻),并可选择将它们剪辑成约 1 分钟的混剪,配上音乐。
挑选精彩语录
- 每段约 2 句话,8–20 秒。优先选择有争议性、出人意料或值得引用的话。
- 涵盖每位发言者——包括主持人。 对于多人嘉宾圆桌讨论,不要让混剪只剩下最健谈的 1–2 个声音——每位参与者至少挑选一段有力的精彩语录,并在制作前核实发言者归属。(这是头号常见错误:所谓的“精彩片段”其实只有一个人在说。)主持人/主持方最容易被漏掉,因为他们大多在提问——找一句值得引用的主持人发言(反应、笑话或犀利的提问框架),也将它加入混剪。
- 无法仅凭转录文本判断发言者——不要尝试,也不要让用户代劳。 Whisper 能识别说了什么,却无法识别是谁说的;根据措辞猜发言者行不通(读起来像主持人说的话,往往实际是嘉宾说的)。如果混剪需要包含特定人物,请对音频进行说话人分离(方法见下文),这样发言者归属就能通过测量确定,而不是靠猜测。
- 按照流畅的节奏编排混剪(引子 → …… → 有力的收尾),绝不要让同一位发言者连续出现。
确认谁在说话——说话人分离(resemblyzer)
如果需要某位特定人物的片段(或用户说“混剪里没有 X”),应通过声音而非转录文本来判断。pip install resemblyzer(自带编码器,无需 HF 令牌)。以下方法已在一场 5 人嘉宾圆桌讨论中验证有效:
- 为每位可识别的人物建立干净的声音参考样本,从他们自我介绍(开场)或推介自己的产品(结尾宣传)的片段中提取——这些片段可确保只有一位发言者。每人平均取 2–3 个窗口以提高稳定性:
enc.embed_utterance(preprocess_wav(slice, source_sr=16000)),取平均值并进行 L2 归一化。 - 不要盲目对整集节目进行聚类——Whisper 的片段包含串话,因此
AgglomerativeClustering会将片段压成一个巨大簇加上一些单例。应计算每个片段的嵌入向量与干净参考样本的余弦相似度。与所有参考样本都不太匹配的片段(最佳相似度 ≲ 0.78,而真实匹配通常为 0.88–0.94)就是未识别的第 N 位发言者。 - 确认这些片段来自同一个人:取出这些低匹配片段,检查它们彼此相似(≳0.87),且整体上与所有已知参考样本不同。用这些片段建立一个参考样本,然后重新计算所有片段的分数——高置信度匹配的片段应该都来自这个人。
- 与已知人物进行合理性检查:已确认的片段(例如某人的产品推介)与其本人参考样本的匹配分数必须最高(≳0.9)。如果各参考样本之间无法区分,请延长窗口并增加平均样本数。
通过 ffmpeg 管道(-f f32le -)将整集节目一次性载入为 16 kHz 单声道浮点音频,并在内存中切片——这比每个片段都单独调用一次 ffmpeg 快得多。
剪辑前进行核实(必须)
对于每个候选片段,提取相应窗口并重新转录,以便 (a) 确认内容和发言者无误,(b) 找到干净的句子边界。Whisper 经常会把名字转错——切勿相信初次转录的拼写。使用词级粒度确定起点,避免切掉第一个词,并确定终点,去掉结巴和重复。
两个会浪费时间的注意事项
-ss/-to必须是输入选项(放在-i之前)。 将它们作为输出选项会导致静音或时间范围错误。ffmpeg -ss START -to END -i in.mp3 ...- zsh 数组从 1 开始索引。 使用
for s in "${SEG[@]}"(遍历值)——切勿在i=0时使用${SEG[$i]}。 - 如果在制作母版之后又编辑了单集节目(剪掉了开场或低音质片段),请从编辑后的文件中提取源片段,并调整时间戳(将每个剪辑点之前删除的秒数减去)。
制作一个片段(去除停顿 + 调整淡入淡出)
# 1) extract + remove pauses (collapse gaps >0.2s; gaps sit near -25dB after dynaudnorm, so threshold ~-23dB)
ffmpeg -y -ss START -to END -i FINAL.mp3 -ar 44100 -ac 1 \
-af "silenceremove=start_periods=1:start_silence=0.04:start_threshold=-30dB:stop_periods=-1:stop_duration=0.20:stop_threshold=-23dB:detection=peak" sr.wav
# 2) speech fades (compute fade-out start from sr.wav duration)
ffmpeg -y -i sr.wav -af "afade=t=in:st=0:d=0.12,afade=t=out:st=${DUR-0.3}:d=0.3" f.wav
# 3) tune in -> speech -> tune out
ffmpeg -y -i sting_in.wav -i f.wav -i sting_out.wav \
-filter_complex "[0][1]acrossfade=d=0.18:c1=tri:c2=tri[a];[a][2]acrossfade=d=0.18:c1=tri:c2=tri[out]" \
-map "[out]" -c:a libmp3lame -b:a 192k clip.mp3
合成提示音(无需音频素材)——柔和的钟声音和低音量:
# tune-in: bright C-E-G bell
ffmpeg -y -f lavfi -i "sine=f=523.25:d=0.85" -f lavfi -i "sine=f=659.25:d=0.85" -f lavfi -i "sine=f=783.99:d=0.85" \
-filter_complex "[0][1][2]amix=inputs=3:normalize=1,afade=t=in:st=0:d=0.02,afade=t=out:st=0.2:d=0.65,lowpass=f=3800,volume=0.30[s]" -map "[s]" -ar 44100 -ac 1 sting_in.wav
# tune-out: lower, gentler G-C bell
ffmpeg -y -f lavfi -i "sine=f=392:d=0.75" -f lavfi -i "sine=f=523.25:d=0.75" \
-filter_complex "[0][1]amix=inputs=2:normalize=1,afade=t=in:st=0:d=0.06,afade=t=out:st=0.15:d=0.6,lowpass=f=3200,volume=0.22[s]" -map "[s]" -ar 44100 -ac 1 sting_out.wav
1 分钟混剪(拼接 + 背景音乐 + 淡入/淡出)
通过 concat 解复用器拼接已裁去静音的语音片段(前后各留 1.5 秒静音,片段间隔约 0.35 秒),然后在下方混入柔和的合成器铺底音,并为整段音频添加淡入/淡出。不要在混剪中重复使用每个片段的短音效——统一添加一次整体淡入/淡出会更干净。
# music bed: warm 4-chord pad (C-G-Am-F), each chord 4s, lowpass+tremolo, concat -> pad16.wav, then loop
# (mkchord mixes 3 sines, normalize=1, lowpass=f=750, tremolo=f=4.5:d=0.25, afade in/out)
ffmpeg -y -i speech_reel.wav -stream_loop 6 -i pad16.wav \
-filter_complex "[1]atrim=0:${TOT},volume=0.075[m];[0][m]amix=inputs=2:normalize=0:duration=first[mix];[mix]afade=t=in:st=0:d=1.3,afade=t=out:st=${TOT-1.6}:d=1.6[out]" \
-map "[out]" -c:a libmp3lame -b:a 192k highlight.mp3
- 铺底音量约为 0.075,可确保语音始终占主导(重新转录最终混音以核实——每句话都应仍然清晰可辨)。使用
amix … normalize=0,避免语音音量被压低。 - 目标响度保持在 −16 LUFS;音乐不应将响度推高至超过约 −16.5 LUFS。
输出目录结构
- 单个片段:
episodes/ep{NNN}/highlights/ep{NNN}-clip{N}-{who}.mp3 - 单条混剪:
episodes/ep{NNN}/ep{NNN}-highlight.mp3
封面图生成(可选)
使用 OpenAI GPT Image API(gpt-image-1)生成节目封面图,并保持与节目的一贯风格一致。提供一张自己的风格参考图(之前的封面、文字标识或配色方案)——模型会模仿它。
import openai, base64
client = openai.OpenAI() # uses OPENAI_API_KEY from env
style_img = open("YOUR_STYLE_REFERENCE.png", "rb")
result = client.images.edit(
model="gpt-image-1",
image=[style_img], # add a content reference as a 2nd image if you have one
prompt="""Create an illustration in the EXACT same art style as this image
(match the line work, color palette, background, and decorative elements).
Depict: [DESCRIBE THE SCENE]. Keep [YOUR SHOW NAME / wordmark] in the same
style and position as the reference.""",
size="1024x1024",
)
with open("cover.png", "wb") as f:
f.write(base64.b64decode(result.data[0].b64_json))
注意:从环境中读取 OPENAI_API_KEY,输出 1024×1024 的 PNG,并确保各期节目中的文字标识和品牌形象保持一致。
节目说明 — 双语写作(如适用)
如果主持人要撰写中英双语的节目说明,中文部分必须使用真正的中文——不要用中文语法夹杂英文动词和名词。像“拿下一个订单”“搭建出 Agent”或“PR 不是买来的”这样的中英夹杂读起来像草稿,是最应该避免的错误。
翻译规则
将以下常见的初创企业/科技英语借词译成中文:
- close deal → 拿下订单 / 成交 / 签下
- build (a product) → 搭建 / 做出 / 打造
- integration → 集成
- view (video/page views) → 播放 / 浏览
- stack (tech stack) → 体系 / 技术栈
- category leader → 品类领导者
- front-end / front end (product sense) → 外壳 / 前端
- success story → 客户案例 / 成功故事
- SMB → 中小企业
- Enterprise (segment) → 大型企业 / 企业级
- aha moment → 顿悟时刻
- onboarding → 上手 / 入门
- retention → 留存
- churn → 流失
- pipeline → 销售漏斗 / 业务线
中文文本中应保留的英文
- 品牌和产品名称——公司、产品和人物名称保持原样
- 非常常见的初创企业缩写——CEO、CTO、CMO、PMF、ARR、MRR、PR、AI、AI Agent、SaaS、API
- 数字前缀货币金额——
$20K、$200K或200 美金(与数字搭配时均可)
定稿前
以中文读者的视角重新通读中文部分。如果某句话读起来像是翻译了一半——例如单独出现“build”“close”“deal”“view”“stack”或“leader”——就把这些词改写成中文。重新通读后,唯一应保留的英文是品牌名称和上述缩写。
名称核实(至关重要)
Whisper 经常会把公司名称、产品名称和人名转录错误。在生成节目说明或任何包含名称和链接的内容之前:
- 转录后,提取所有专有名词——公司名称、产品名称、人名和提及的网址。
- 请用户确认或更正——Whisper 对品牌名称可能会听错,转录成发音相似但错误的词。
- 绝不要根据转录的名称猜测网址——听起来像“Acme”的名称,其网址可能是
acme.com、acmehq.com,也可能完全不同。务必询问。 - 在节目说明、标题、单集元数据和所有输出中始终使用已确认的名称。
在生成反向链接或社交媒体帖子时,这一点尤其重要——域名拼错会让链接白白浪费。
节目笔记结构(推荐)
分成两个独立部分——先中文,再英文(或节目面向的其他语言)。不要交替排列,也不要并排放置。
标题规则:标题层级要浅且保持一致——选择一个层级(例如 H2),并将所有子部分统一到该层级。有些发布平台只会渲染一个标题层级和粗体;如果你的平台如此,请按此格式处理。
**时间戳格式:**始终使用 MM:SS,并在前面补零(例如 08:25、00:00、42:10)。不要使用 0:00 或 1:05。
EP{NNN}: {Episode title}
---
## 中文
**嘉宾:** {中文姓名 English Name}, {中文职位} {公司} (URL)
## 简介
{完整中文段落}
## 时间轴
- 00:00 — {中文描述}
- 08:25 — {中文描述}
## 核心要点
- {中文要点}
## 相关链接
- {品牌名}:{URL}
---
## English
**Guest:** {English Name}, {Title} at {Company} (URL)
## Summary
{Full English paragraph}
## Timestamps
- 00:00 — {English description}
- 08:25 — {English description}
## Key Takeaways
- {English takeaway}
## Links
- {Brand}: {URL}
**为什么分成两个部分,而不是使用双语项目符号:**中文读者希望看到通顺的中文,英文读者希望看到通顺的英文。每条项目符号都交替使用“中文 / English”,会让两种语言的内容都更难阅读。撰写每个部分时,都要将其视为唯一的部分。
归档与命名约定(推荐)
将每集单独存放在自己的文件夹中。简单的零填充目录结构易于扩展:
episodes/
├── ep001/
│ ├── ep001-final.mp3 # the finished episode
│ ├── ep001-highlight.mp3 # optional 1-min reel
│ ├── cover.png
│ └── shownotes.md
└── ep002/
└── ...
- 目录:
ep{NNN}(3 位数字,不足位数补零) - 音频:
ep{NNN}-final.mp3;精彩片段放在ep{NNN}/highlights/ep{NNN}-clip{N}-{who}.mp3下 - 节目标题:以吸引人且描述性强的标题开头(吸引读者,而不只是陈述主题)。
快速裁剪(不移除填充内容)
如果用户只想简单裁剪(例如,“剪掉开头 3 秒”):
ffmpeg -y -i "INPUT" -ss 3 -c copy "OUTPUT"
无需音频处理时,使用 -c copy 即可快速无损裁剪。