mcpField
P
podcast-edit

podcast-edit

github.com/openclaudia创意与媒体722260 次安装1 周前更新
代码仓库

关于 podcast-edit

用于将原始录音处理成成品播客音频或视频的技能,涵盖基于转录的剪辑、音频增强和成品局部重剪,也可制作精彩片段与短集锦。

主要功能

  1. 01基于转录定位开头和结尾
  2. 02移除口头填充词与静音
  3. 03降噪并平衡说话人音量
  4. 04规范播客响度
  5. 05对成品进行局部重剪
  6. 06制作精彩片段和短集锦

适用场景

  1. 01润色原始播客或会议录音
  2. 02移除口头填充词和长时间停顿
  3. 03让视频剪辑与音频剪辑保持一致
  4. 04从节目中制作可分享片段

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/openclaudia/openclaudia-skills --skill podcast-edit

安装后在 Claude Code 中输入/podcast-edit确认已加载。

附带文件filler_removal.pyvideo_cut.py

详细介绍

播客编辑技能

将原始播客/会议录音处理成精良的播客节目。

功能

  1. 智能裁剪 — 通过转录并检测片头和片尾,找到播客的实际起止位置
  2. 删除填充词 — 删除口头语:嗯、呃、啊、哦、对对对、um、uh 等
  3. 裁剪静音 — 将长时间静音(>2s)缩短为自然的停顿(约 0.6s)
  4. 音频增强 — 降噪、均衡、多说话人音量平衡,以及标准化到播客标准的响度(−16 LUFS)
  5. 重新剪辑已完成的节目 — 无需重新运行整个流程,即可从已渲染的节目中精准删除标记的片段
  6. 精彩片段和串烧 — 剪出适合分享的精彩音频片段,并配乐拼接成约 1 分钟的串烧
  7. 视频剪辑 — 对 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 中精准剪掉有问题的片段,并重新编码一次:

  1. 将最终版文件按 5 分钟分块重新转录(分段粒度)→ 生成一份包含绝对时间戳的统一转录文本。这就是你的剪辑地图。
  2. 针对每个标记的问题,仅获取包含该内容的片段的词级时间戳(这些短语通常嵌在句子中间,而不是位于分段边界)。精确定位起止点。
  3. 构建一个 atrim+concat 滤镜,保留所有剪辑范围之外的内容;渲染为 WAV(pcm_s16le),然后进行一次 MP3 处理。不要重新应用增强链——最终版已经过增强和响度标准化;再次运行会导致重复处理。
  4. 验证每个拼接点:在新时间轴上,以每个新拼接点为中心提取约 11 秒的片段,并重新转录。确认问题音频已删除,且拼接处衔接自然。
  5. 重新计算任何节目说明中的时间轴:每个剪辑点之后的时间戳都要提前,提前量为该点之前所有剪辑时长之和。如果已发布文件在开头加有精彩片段集锦,还要将集锦时长计入偏移量(重新剪辑集锦会改变其长度,因此整个单集的时间也会发生偏移)。
重新剪辑检查清单——首轮处理中常见的残留内容

这些内容与实际句子融在一起,因此会在移除填充词和静音后残留下来。请明确扫描转录文本,查找以下内容:

  • 会议/技术闲聊:“你静音了/取消静音”“你声音太小/听得到吗”“你能看到我的屏幕吗”“等一下我看一下”。剪掉相关短语,保留周围内容。
  • **无果而终的话题:**讨论组提出了一个无人调研过的产品或案例,随后说“我们就跳过吧/咱们跳过吧”——应剪掉整个岔题,而不只是跳过的那句话。
  • **重新录制的片段(尤其是结尾):**先录了一遍不理想的内容,随后出现“重新开始/从头来/咱们重新来/感觉重复了”之类的提示,再录一遍干净版本。剪掉第一次失败的录音,保留重录内容。务必检查最后约 3 分钟的内容。
  • **节目开始前的内容/重复开场白:**正式开始前录制的自我介绍,之后又重复了一遍——剪掉节目开始前的版本。
Whisper API 不稳定

并行调用词级时间戳接口有时会返回空结果(0 字节)。请将空结果按顺序重试,每次调用之间执行 sleep 1。

精彩片段与 1 分钟混剪

从已完成的单集节目中剪出简短、适合分享的精彩语录(有争议性或富有见地的时刻),并可选择将它们剪辑成约 1 分钟的混剪,配上音乐。

挑选精彩语录
  • 每段约 2 句话,8–20 秒。优先选择有争议性、出人意料或值得引用的话。
  • 涵盖每位发言者——包括主持人。 对于多人嘉宾圆桌讨论,不要让混剪只剩下最健谈的 1–2 个声音——每位参与者至少挑选一段有力的精彩语录,并在制作前核实发言者归属。(这是头号常见错误:所谓的“精彩片段”其实只有一个人在说。)主持人/主持方最容易被漏掉,因为他们大多在提问——找一句值得引用的主持人发言(反应、笑话或犀利的提问框架),也将它加入混剪。
  • 无法仅凭转录文本判断发言者——不要尝试,也不要让用户代劳。 Whisper 能识别说了什么,却无法识别是谁说的;根据措辞猜发言者行不通(读起来像主持人说的话,往往实际是嘉宾说的)。如果混剪需要包含特定人物,请对音频进行说话人分离(方法见下文),这样发言者归属就能通过测量确定,而不是靠猜测。
  • 按照流畅的节奏编排混剪(引子 → …… → 有力的收尾),绝不要让同一位发言者连续出现。
确认谁在说话——说话人分离(resemblyzer)

如果需要某位特定人物的片段(或用户说“混剪里没有 X”),应通过声音而非转录文本来判断。pip install resemblyzer(自带编码器,无需 HF 令牌)。以下方法已在一场 5 人嘉宾圆桌讨论中验证有效:

  1. 为每位可识别的人物建立干净的声音参考样本,从他们自我介绍(开场)或推介自己的产品(结尾宣传)的片段中提取——这些片段可确保只有一位发言者。每人平均取 2–3 个窗口以提高稳定性:enc.embed_utterance(preprocess_wav(slice, source_sr=16000)),取平均值并进行 L2 归一化。
  2. 不要盲目对整集节目进行聚类——Whisper 的片段包含串话,因此 AgglomerativeClustering 会将片段压成一个巨大簇加上一些单例。应计算每个片段的嵌入向量与干净参考样本的余弦相似度。与所有参考样本都不太匹配的片段(最佳相似度 ≲ 0.78,而真实匹配通常为 0.88–0.94)就是未识别的第 N 位发言者。
  3. 确认这些片段来自同一个人:取出这些低匹配片段,检查它们彼此相似(≳0.87),且整体上与所有已知参考样本不同。用这些片段建立一个参考样本,然后重新计算所有片段的分数——高置信度匹配的片段应该都来自这个人。
  4. 与已知人物进行合理性检查:已确认的片段(例如某人的产品推介)与其本人参考样本的匹配分数必须最高(≳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 经常会把公司名称、产品名称和人名转录错误。在生成节目说明或任何包含名称和链接的内容之前:

  1. 转录后,提取所有专有名词——公司名称、产品名称、人名和提及的网址。
  2. 请用户确认或更正——Whisper 对品牌名称可能会听错,转录成发音相似但错误的词。
  3. 绝不要根据转录的名称猜测网址——听起来像“Acme”的名称,其网址可能是 acme.com、acmehq.com,也可能完全不同。务必询问。
  4. 在节目说明、标题、单集元数据和所有输出中始终使用已确认的名称。

在生成反向链接或社交媒体帖子时,这一点尤其重要——域名拼错会让链接白白浪费。

节目笔记结构(推荐)

分成两个独立部分——先中文,再英文(或节目面向的其他语言)。不要交替排列,也不要并排放置。

标题规则:标题层级要浅且保持一致——选择一个层级(例如 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 即可快速无损裁剪。

评论

支持 Markdown