使用 python 自动执行任务

Automate tasks with python

我正在寻找一种在外部程序中使用 python 自动执行任务的方法。

我有大量 AAC 格式的音频文件。我需要将它们转换成mp3,然后放大它们(避免失真)。

我用 pydub 库编写了一个程序,该程序非常适合小文件,但我的文件太大(超过 2hs 或 200mb)并且我 运行 内存不足(因为该库存储了完整的RAM 中的文件,我认为)。我无法将文件分割成块,因为之前的原因我无法再次合并它们,我需要一个文件。

所以,我想编写一个程序打开另一个程序将文件转换为 mp3(mediahuman 音频转换器),然后用另一个程序(WavePad 音频编辑器)放大转换后的文件,但我不知道如果可以的话。

目前,我是手动完成的,但这需要很长时间的等待,并且需要不到 10 次点击(分布在整个过程中),这很乏味。

我离开我写的程序。我把它转录下来去掉了一些不相关的和这个过程无关的函数,再加上我把注释、变量等东西翻译成了英文,所以可能会有一些错误,但原程序运行良好:

import glob
import os
from pydub import AudioSegment

#convert to mp3 128 bits
sound = AudioSegment.from_file("input-file.aac")
sound.export("output-file.mp3", format="mp3", bitrate="128k")

#sound.max_dBFS shows how far below the limit the highest sample is (in dB)
sound = AudioSegment.from_file("output.mp3", format="mp3")
max_gain_without_distortion = -1 * sound.max_dBFS

#increase volume by "max_gain_without_distortion" dB
from pydub.playback import play
song = AudioSegment.from_mp3("output-file.mp3")
louder_song = song + max_gain_without_distortion

#save louder song
louder_song.export("output.mp3", format='mp3')

电脑规格:/// OS: windows 10 专业版 64 位 /// 内存:4GB /// CPU: 双核 3ghz /// PYTHON 版本:3.7.1 /// Pydub 版本:v0.23.1-0-g46782a9 /// ffmpeg/avlib 版本:"Build: ffmpeg-20190219-ff03418-win32-static" ///

正如评论中所同意的那样,作为一种解决方案,我将建议使用命令行工具:FFmpeg。这是您需要的命令:

ffmpeg -i input-file.aac -b:v 128k -filter:a loudnorm output.mp3

使用 loudnorm. You can also apply gain directly as explained in the docs, but one should expect inferior results. Normalization can be done in number of ways, I suggest reading this post.

通过将它与例如find . -name '*.wav' -type f 您可以轻松地查找和转换目录树中的所有文件。

如果您执意要使用Python,可以查看Python bindings。基础知识:

import ffmpeg
ffmpeg.input('stereo.aac').output('mono.mp3').run()

最初我打算建议使用 sox: Sound eXchange, the Swiss Army knife of audio manipulation. It's not Python, though has Python bindings: pysox。然而,事实证明它不支持 aac 格式(还有几十种其他格式)。我认为无论如何提及它可能会很有趣,因为可以首先使用 ffmpeg 将结果转换为更流行的格式,然后将结果通过管道传输到 sox。后者有更多的音频流修改选项。

将 wav 转换为 mp3 并重新采样为 128kbit:

sox -r 128k input-file.wav output-file.mp3

OP 要求 "increase volume by max_gain_without_distortion dB",为此我们可以使用 gainnorm,如 docs:

中所述

sox -r 128k input-file.wav output-file.mp3 gain −n -3

在文档之后,-n 选项将音频标准化为 0dB FSD;它通常与负增益 dB 结合使用,以达到将音频归一化到低于 0dB.

的给定水平的效果

sox −−norm -r 128k input-file.wav output-file.mp3