小记:音频格式转化ByPython(上)
近日新买了个耳机,店家附送了一些周董的无损音乐资源,收到货后迫不及待的下载试听,才发现这些资源是wav格式的,导入播放器后歌名、作者、专辑等全是未知,当时想着是不是店家的资源有问题。上网查了一下才知道wav格式是没有标签信息的,顺带知道了主流的无损音乐格式有wav、flac、ape等,其中wav是原始的编码格式,因为比较古老,没有考虑到在其中附加标签,几乎任何播放器都会支持播放,而flac和ape是压缩过的格式,需要播放器进行相应的解码才行,但是后两种格式比较新,可以加标签等。
于是计划对文件进行wav到flac的编码转化,并加上标签。网上有很多转化工具,但咱是学过Python的人,小小编码转化还用工具软件,第一是软件不够灵活,第二是不能代表咱理科男的身份,所以决定用Python进行批量编码转化并加标签。
想好就去做,我在电脑上装了 Visual Studio 2022 社区版、VScode、Anaconda3,决定先调试一下Visual Studio 2022,好吧,刚创建个项目就给我个报错:
找不到 .NETFramework,Version=v4.0 的引用程序集。要解决此问题,请为此框架版本安装开发人员工具包(SDK/目标包)或者重新定向应用程序。可在 https://aka.ms/msbuild/developerpacks 处下载 .NET Framework 开发人员工具包
网上搜索了一下,没有发现有效的解决方法,不过调试发现并不影响程序运行的样子,哈哈,那就不管了。不过实际使用发现vs2022的python交互窗口比较卡(可能我的轻薄本性能不太行),而且不知道vs2022的包管理怎么用(感觉vs系列较复杂),不过我知道Anaconda是专门用来进行包管理的,于是决定用cmd+Anaconda3进行交互学习调试,基本弄清楚代码该怎么写了再用vs2022写程序。(一个野生自学者的习惯,不知道科班出生的或正式的程序员是怎么弄的)
接下来还是先去网上搜教程,看看网友们是怎么用python转化音频的。看了几个回答,发现大家都是用pydub+ffmpeg的组合(其中ffmpeg是pydub的依赖包),那就先试试吧,打开cmd
conda create -n AudioConversion python=3.8
activate AudioConversion
先创建个python3.8的环境,命名为AudioConversion,并载入。
pip install ipython
pip install ffmpeg
pip install pydub
ipython
import ffmpeg
import pydub
下载所需的包,并进入ipython(新创建的基础环境没有ipython,比起基础的python我更喜欢用有自动补全等功能的ipython),然后载入那两个包,其中载入pydub时提示:
Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work
选择性忽视。
song=pydub.AudioSegment.from_wav("file.wav")
song.export("song.flac",format="flac")
按照教程,先读取wav文件为AudioSegment对象,再输出为flac文件,结果报错了。怀疑是不是不支持flac,换成mp3,报同样的错。考虑之前的提示,我觉得应该是ffmpeg包的问题。
pip uninstall ffmpeg
pip uninstall pydub
conda install ffmpeg
conda install pydub
发现还是不行,于是上网查了一下,发现ffmpeg似乎容易出问题,要再按装一个ffmpeg-python的包。
conda install ffmpeg-python
import ffmpeg
impert pydub
song=pydub.AudioSegment.from_wav("file.wav")
song.export("song.flac",format="flac")
import os
os.getcwd()
继续刚才流程,并载入os包,找一下命令运行目录,打开目录,发现新出现了一个song.flac文件,点击打开,显示被占用,于是我把命令窗口退出,再打开,歌就能正常播放了,格式转化成功。接下来是加标签。
>help(pydub.AudioSegment.export)
Help on function export in module pydub.audio_segment:
export(self, out_f=None, format='mp3', codec=None, bitrate=None, parameters=None, tags=None, id3v2_version='4', cover=None)
Export an AudioSegment to a file with given options
out_f (string):
Path to destination audio file. Also accepts os.PathLike objects on
python >= 3.6
format (string)
Format for destination audio file.
('mp3', 'wav', 'raw', 'ogg' or other ffmpeg/avconv supported files)
codec (string)
Codec used to encode the destination file.
bitrate (string)
Bitrate used when encoding destination file. (64, 92, 128, 256, 312k...)
Each codec accepts different bitrate arguments so take a look at the
ffmpeg documentation for details (bitrate usually shown as -b, -ba or
-a:b).
parameters (list of strings)
Aditional ffmpeg/avconv parameters
tags (dict)
Set metadata information to destination files
usually used as tags. ({title='Song Title', artist='Song Artist'})
id3v2_version (string)
Set ID3v2 version for tags. (default: '4')
cover (file)
Set cover for audio file from image file. (png or jpg)
help命令查看一下帮助文档,发现标签信息由AudioSegment对象的export方法的tags字典参数给予。这下我已经知道如何转化格式和添加标签信息了,接下来需要一个标签信息来源(暂时我只知道歌名——由文件名给出,以及歌手是周杰伦,其他如作词、作曲、专辑信息暂不知道)。百度一下周杰伦歌曲大全相关文档,似乎并没有找到合适的信息,不过百度百科对歌曲的信息记录的很全,看来我得写个爬虫来获取歌曲标签信息了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)