通用音频合并工具

专为播客、有声书制作设计的自动化脚本 - 无需修改即可跨项目使用

使用说明

目录结构要求

项目根目录/
├── 开头/ # 存放所有故事的开头音频
│ ├── 济公传开头_001.mp3
│ └── 西游记开头_001.mp3
├── 正片/ # 存放所有故事的正片音频
│ ├── 济公传_001.mp3
│ └── 西游记_001.mp3
├── 结尾/ # 存放所有故事的结尾音频
│ ├── 济公传结尾_001.mp3
│ └── 西游记结尾_001.mp3
├── 合并开头.sh # 通用开头合并脚本
└── 合并结尾.sh # 通用结尾合并脚本

使用步骤

  1. 创建项目根目录,并在其中创建三个子目录:开头、正片、结尾
  2. 将开头音频放入"开头"目录,命名格式为: [任意名称]_[数字编号].mp3
  3. 将正片音频放入"正片"目录,命名格式为: [任意名称]_[数字编号].mp3
  4. 将结尾音频放入"结尾"目录,命名格式为: [任意名称]_[数字编号].mp3
  5. 将下方提供的脚本下载到项目根目录
  6. 打开终端,进入项目根目录
  7. 给脚本添加执行权限:chmod +x 合并开头.sh 合并结尾.sh
  8. 运行脚本:./合并开头.sh./合并结尾.sh
  9. 合并后的文件将生成在"合并结果"目录中

脚本下载

开头合并脚本

将"开头"目录中的音频合并到"正片"目录对应音频的开头

适用于添加报幕开头

结尾合并脚本

将"结尾"目录中的音频合并到"正片"目录对应音频的结尾

适用于添加报幕结尾

脚本特点

完全通用

不依赖特定故事名称,适用于任何项目

智能匹配

通过数字编号自动匹配文件

错误处理

自动跳过无法匹配的文件

中文提示

清晰的操作过程反馈

工作原理可视化

1

遍历文件

脚本自动扫描目录中的音频文件

2

提取编号

从文件名中识别数字编号

3

匹配文件

通过编号匹配对应的开头/结尾和正片

4

合并音频

使用FFmpeg合并音频文件

脚本源码预览

合并开头.sh

#!/bin/bash # 创建输出目录 mkdir -p "合并结果/开头合并" # 遍历所有开头文件 for intro_file in 开头/*; do # 提取文件名(不含路径和扩展名) base_name=$(basename "$intro_file") clean_name="${base_name%.*}" # 尝试从文件名中提取数字部分(支持各种格式) if [[ $clean_name =~ _([0-9]+)$ ]]; then num=${BASH_REMATCH[1]} elif [[ $clean_name =~ ([0-9]+)$ ]]; then num=${BASH_REMATCH[1]} else echo "⚠️ 跳过:$base_name 未找到数字编号" continue fi # 尝试在正片目录中查找匹配文件 story_file=$(find 正片/ -type f -name "*$num.*" | head -1) if [ -z "$story_file" ]; then echo "⚠️ 跳过:找不到匹配的正片文件(编号 $num)" continue fi # 准备输出文件名 output_name=$(basename "$story_file") output_clean="${output_name%.*}" output_file="合并结果/开头合并/${output_clean}_完整.mp3" # 执行合并(开头+正片) ffmpeg -i "$intro_file" -i "$story_file" -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" -y "$output_file" &> /dev/null echo "✅ 已合并:$base_name + $(basename "$story_file") → $(basename "$output_file")" done echo -e "\n🎉 开头合并完成!" echo "输出目录: $(pwd)/合并结果/开头合并" read -p "按回车键退出..."

合并结尾.sh

#!/bin/bash # 创建输出目录 mkdir -p "合并结果/结尾合并" # 遍历所有正片文件 for story_file in 正片/*; do # 提取文件名(不含路径和扩展名) base_name=$(basename "$story_file") clean_name="${base_name%.*}" # 尝试从文件名中提取数字部分 if [[ $clean_name =~ _([0-9]+)$ ]]; then num=${BASH_REMATCH[1]} elif [[ $clean_name =~ ([0-9]+)$ ]]; then num=${BASH_REMATCH[1]} else echo "⚠️ 跳过:$base_name 未找到数字编号" continue fi # 尝试在结尾目录中查找匹配文件 outro_file=$(find 结尾/ -type f -name "*$num.*" | head -1) if [ -z "$outro_file" ]; then echo "⚠️ 跳过:找不到匹配的结尾文件(编号 $num)" continue fi # 准备输出文件名 output_name=$(basename "$story_file") output_clean="${output_name%.*}" output_file="合并结果/结尾合并/${output_clean}_完整.mp3" # 执行合并(正片+结尾) ffmpeg -i "$story_file" -i "$outro_file" -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" -y "$output_file" &> /dev/null echo "✅ 已合并:$base_name + $(basename "$outro_file") → $(basename "$output_file")" done echo -e "\n🎉 结尾合并完成!" echo "输出目录: $(pwd)/合并结果/结尾合并" read -p "按回车键退出..."