Deepseek中输入提示词:
写一个m4b格式文件(带有章节的 AAC 编码的音频文件)转换为mp3格式的Python脚本,具体步骤如下:
用户输入m4b格式音频的文件地址,比如:"F:\有声英文书\Life 3.0 Being Human in the Age of Artificial Intelligence (Unabridged).m4b"
接受这个文件地址,然后将其转换为mp3格式的音频;
新建一个子文件夹,文件名名称为m4b格式音频的主文件名;
读取m4b格式音频中的章节信息,将这个mp3文件按照m4b格式音频中的章节分割成多个mp3音频,保存在刚才新建的子文件夹中;
如果m4b格式音频中没有章节信息,就按照每段1个小时时长将这个mp3文件分割;
注意:每一步都要输出信息到屏幕上
如果用户输入的不是m4b格式音频,而是mp3音频文件,就跳过转换步骤,直接按照每段1个小时时长将其分割;
Deepseek的回复:
要实现将带有章节的 m4b 格式音频转换为 mp3 格式,并根据章节信息分割成多个 mp3 文件的 Python 脚本,可以使用 ffmpeg-python 库和 mutagen 库来读取章节信息。以下是实现该功能的完整脚本:
import os
import ffmpeg
import re
from mutagen.mp4 import MP4, MP4StreamInfoError
from mutagen.mp3 import MP3
from mutagen.id3 import ID3, TIT2, TALB, TPE1, TCON, TYER
def convert_m4b_to_mp3(input_path):
file_name, _ = os.path.splitext(os.path.basename(input_path))
output_folder = os.path.join(os.path.dirname(input_path), file_name)
os.makedirs(output_folder, exist_ok=True)
print(f"Created folder: {output_folder}")
if input_path.lower().endswith('.mp3'):
print(f"Input file is already an mp3 file: {input_path}")
output_mp3_path = input_path
else:
output_mp3_path = os.path.join(output_folder, f"{file_name}.mp3")
print(f"Converting {input_path} to {output_mp3_path}...")
ffmpeg.input(input_path).output(output_mp3_path, acodec='libmp3lame').run()
print(f"Conversion complete: {output_mp3_path}")
split_mp3_by_chapters_or_hour(output_mp3_path, output_folder)
def split_mp3_by_chapters_or_hour(input_mp3_path, output_folder):
file_name = os.path.basename(input_mp3_path).split('.')[0]
try:
audio = MP4(input_mp3_path)
chapters = audio.get('\xa9chp')
except MP4StreamInfoError:
chapters = None
if chapters:
print(f"Found {len(chapters)} chapters in {input_mp3_path}")
split_mp3_by_chapters(input_mp3_path, output_folder, chapters)
else:
print("No chapters found in the m4b file. Splitting by hour.")
split_mp3_by_hour(input_mp3_path, output_folder)
def split_mp3_by_chapters(input_mp3_path, output_folder, chapters):
file_name = os.path.basename(input_mp3_path).split('.')[0]
for i, chapter in enumerate(chapters):
start_time = chapter[0]
end_time = chapter[1] if i < len(chapters) - 1 else None
chapter_name = chapter[2]
output_segment_path = os.path.join(output_folder, f"{file_name}_chapter{i+1}_{chapter_name}.mp3")
print(f"Processing chapter {i+1} '{chapter_name}' starting at {start_time} seconds...")
if end_time:
ffmpeg.input(input_mp3_path, ss=start_time, to=end_time).output(output_segment_path).run()
else:
ffmpeg.input(input_mp3_path, ss=start_time).output(output_segment_path).run()
print(f"Chapter {i+1} saved as {output_segment_path}")
def split_mp3_by_hour(input_mp3_path, output_folder):
file_name = os.path.basename(input_mp3_path).split('.')[0]
hour_in_seconds = 3600
probe = ffmpeg.probe(input_mp3_path)
duration = float(probe['format']['duration'])
num_segments = int(duration // hour_in_seconds) + 1
print(f"Splitting {input_mp3_path} into {num_segments} segments...")
for i in range(num_segments):
start_time = i * hour_in_seconds
output_segment_path = os.path.join(output_folder, f"{file_name}_part{i+1}.mp3")
print(f"Processing segment {i+1} starting at {start_time} seconds...")
ffmpeg.input(input_mp3_path, ss=start_time).output(output_segment_path, t=hour_in_seconds).run()
print(f"Segment {i+1} saved as {output_segment_path}")
if __name__ == "__main__":
input_path = input("Enter the path to the m4b or mp3 file: ")
if not os.path.exists(input_path):
print(f"File not found: {input_path}")
else:
convert_m4b_to_mp3(input_path)
脚本说明:
输入路径:用户输入 m4b 或 mp3 文件的路径。
创建子文件夹:根据 m4b 或 mp3 文件的主文件名创建一个子文件夹。
转换为 mp3:如果输入文件是 m4b 格式,则使用 ffmpeg-python 将其转换为 mp3 格式,并保存在新建的子文件夹中。如果输入文件已经是 mp3 格式,则跳过转换步骤。
读取章节信息:使用 mutagen 库读取 m4b 文件中的章节信息。
分割 mp3 文件:根据章节信息将 mp3 文件分割成多个 mp3 文件,并保存在同一子文件夹中。
依赖库:
ffmpeg-python:用于调用 ffmpeg 进行音频处理。
mutagen:用于读取 m4b 文件中的章节信息。
安装依赖:
bash
复制
pip install ffmpeg-python mutagen
运行脚本:
将脚本保存为 convert_m4b_to_mp3.py,然后在终端或命令行中运行:
bash
复制
python convert_m4b_to_mp3.py
注意事项:
确保 ffmpeg 已安装并配置在系统路径中,以便 ffmpeg-python 可以调用它。
脚本会自动创建子文件夹并保存转换后的文件,因此请确保输入路径正确且有写权限。
如果 m4b 文件中没有章节信息,脚本会提示并跳过分割步骤。