如何提取mdd字典中音频文件并转化为mp3

平时,我们都会使用goldendict或者mdict等字典软件,通过加载一些字典可以轻松查阅读带图片、音频和文字的单词详情,帮助我们更好地学习英语、翻译文章等。但有时,我们想把字典文件中的音频提取出来,作为一个音频库来本地使用,那么如何实现这个过程呢。

一、问题分析

为了提取mp3,首先我们要使用把mdx文件解包,然后提取出后缀为spx的文件,再通过FFmpeg把spx文件批量转化为mp3格式,为了实现批量的转换,我们还需要调用Python来执行这个操作。

二、实现过程

1. 我们要下载mdx的解包工具,叫MdxExport.exe,这个软件很小,只有64kb。

导出mdd文件中的资源

2. 点击开始后,我们就可以把mdx文件中的图片和spx文件导出到OALD7_FULL这个文件夹下面

导出spx文件

3. 接下来,我们下载ffmpeg.exe这个小工具到当前页面,然后通过Python编程来批量读取文件夹中的spx文件,并存入到7000这个目录里面,详细代码如下:

import os
import subprocess
import logging

# 配置日志
logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s - %(levelname)s - %(message)s')

def convert_spx_to_mp3(input_file, output_file, bitrate="192k"):
    """使用ffmpeg转换单个SPX文件为MP3"""
    try:
        # 检查输入文件是否存在
        if not os.path.exists(input_file):
            raise FileNotFoundError(f"输入文件不存在: {input_file}")
        
        # 创建输出目录(如果不存在)
        os.makedirs(os.path.dirname(output_file), exist_ok=True)
        
        # 使用ffmpeg转换音频
        command = [
            'ffmpeg',
            '-i', input_file,
            '-ab', bitrate,
            '-ac', '2',  # 立体声
            '-ar', '44100',  # 采样率
            '-y',  # 覆盖已存在文件
            output_file
        ]
        
        # 运行命令并捕获输出
        result = subprocess.run(command, check=True, 
                               stdout=subprocess.PIPE, 
                               stderr=subprocess.PIPE,
                               text=True)
        
        logging.info(f"成功转换: {input_file} → {output_file}")
        return True
    except subprocess.CalledProcessError as e:
        logging.error(f"ffmpeg转换失败: {input_file} | 错误: {e.stderr}")
        return False
    except Exception as e:
        logging.error(f"转换失败: {input_file} | 错误: {str(e)}")
        return False

def batch_convert_spx_to_mp3(input_dir, output_dir, bitrate="192k"):
    """批量转换目录下的所有SPX文件"""
    # 验证输入目录
    if not os.path.isdir(input_dir):
        logging.error(f"输入目录无效: {input_dir}")
        return
    
    # 统计信息
    total_files = 0
    success_files = 0
    
    # 遍历目录
    for root, _, files in os.walk(input_dir):
        for file in files:
            if file.lower().endswith(".spx"):
                total_files += 1
                
                # 构造完整路径
                input_path = os.path.join(root, file)
                
                # 保持原始目录结构
                relative_path = os.path.relpath(root, input_dir)
                output_subdir = os.path.join(output_dir, relative_path)
                
                # 确保输出文件名正确
                output_filename = os.path.splitext(file)[0] + ".mp3"
                output_path = os.path.join(output_subdir, output_filename)
                
                # 执行转换
                if convert_spx_to_mp3(input_path, output_path, bitrate):
                    success_files += 1
    
    # 输出统计信息
    logging.info(f"转换完成! 总计: {total_files}, 成功: {success_files}, 失败: {total_files - success_files}")

if __name__ == "__main__":
    # 配置路径
    INPUT_DIR = "OALD7_FULL"    # 原始SPX文件目录
    OUTPUT_DIR = "7000"         # 输出MP3目录
    BITRATE = "192k"            # MP3比特率
    
    # 执行批量转换
    batch_convert_spx_to_mp3(INPUT_DIR, OUTPUT_DIR, BITRATE)

如果我们想使转化后的音频个头小点,就把bitrate改成96k,这样占据的空间会更小点。使用时,可以把INPUT_DIR和OUTPUT_DIR修改一下,并确保目录均是可用的。

转化成的mp3

4. 生成的mp3名称是乱的,我们还需要对其进行重命名,经过观察,我们可以遍历7000这个文件夹下面的mp3,然后通过split的方法,按照"_"切分文件名,并保存就可以了。最终的代码如下:

from pathlib import Path
path = Path("7000")
files = path.glob("*.mp3")
for file in files:
    file.replace(path.joinpath(file.parts[1].split("_")[1]+".mp3"))

上面代码中,我们先遍历指定文件夹,然后切分路径,再按照“_”分割,获得mp3文件。接着用file.replace()直接在原文件名上重命名。

三、学后总结

1. 本次提取字典中音频综合运用Python和大语言模型来解决现实问题,同时还向群友进行了咨询,给我很大启发。

2. 本次转化过程发挥了Python在格式转化和批量重命名的作用,进一步简化了流程,彰显出Python在批量音频文件处理中的巨大作用。

3. 如果你想学习Python,就不妨读一读这本书,或许可以帮助你步步为赢,掌握Python技巧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PythonFun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值