部署DeepSeek模型,进群交流最in玩法!
立即加群
发布
社区首页 >专栏 >用AI将m4b格式音频批量转换为mp3格式

用AI将m4b格式音频批量转换为mp3格式

作者头像
AIGC部落
发布2025-01-15 22:06:20
发布2025-01-15 22:06:20
440
举报
文章被收录于专栏:Dance with GenAI

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}")

# 检查输入文件是否已经是mp3格式

if input_path.lower().endswith('.mp3'):

print(f"Input file is already an mp3 file: {input_path}")

output_mp3_path = input_path

else:

# 转换为mp3格式

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}")

# 读取章节信息并分割mp3文件

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]

# 分割mp3文件,每章节一段

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__":

# 用户输入m4b或mp3文件路径

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 文件中没有章节信息,脚本会提示并跳过分割步骤。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Dance with GenAI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档