【Python煮音乐】如何优雅地把MID转成WAV或MP3格式

0. 运行环境:

Win10系统,Python3.7

1. 问题描述:

因为一些自娱自乐的需要,笔者遇到了一个需要将MIDI音乐标准格式转换为WAV音频的问题,在互联网的帮助下找到了 Python 库 midi2audio,按照官方的引导期望使用如下方法进行优雅地转换:

from midi2audio import FluidSynth
FluidSynth().midi_to_audio('input.mid', 'output.wav')

不过出现了以下问题:

FileNotFoundError: [WinError 2] The system cannot find the file specified

2. 不太痛苦地解决中:

查看报错源头,发现函数midi_to_audio()的定义如下:

def midi_to_audio(self, midi_file, audio_file):
    subprocess.call(['fluidsynth', '-ni', self.sound_font, midi_file, '-F', audio_file, '-r', str(self.sample_rate)])

这段程序调用了其实是调用了 fluidsynth 的命令,所以 midi2audio 这个库其实是封装了 fluidsynth ,因此正确的解决方案应该是找到 fluidsynth.exe 可执行程序,并且将路径添加到系统变量 Path 中。这里也是找到了 FluidSynth 官网,并根据官网的提示找到了下载链接。由于Github偶尔上不去,笔者分享了自己下载的文件,网盘提取码:ltts。写这篇的时候还是 FluidSynth 2.2.4,发现有朋友遇到了一些问题发在评论里面,所以补充了一下(实在对不起过了这么久才看到),顺便下载了最新的  FluidSynth 2.3.4 也一起放到网盘中。下载到任意位置都行,然后把路径加到系统变量 Path 中。添加完成之后在控制台里面输入 fluidsynth 就会有类似如下的显示:

FluidSynth runtime version 2.3.4
Copyright (C) 2000-2023 Peter Hanappe and others.
Distributed under the LGPL license.
SoundFont(R) is a registered trademark of Creative Technology Ltd.

fluidsynth: error: fluid_sfloader_load(): Failed to open 'C:\ProgramData\soundfonts\default.sf2': File does not exist.
fluidsynth: error: Unable to open file 'C:\ProgramData\soundfonts\default.sf2'
fluidsynth: error: Failed to load SoundFont "C:\ProgramData\soundfonts\default.sf2"
fluidsynth: error: not enough MIDI in devices found. Expected:1 found:0
fluidsynth: error: Device "default" does not exists
Failed to create the MIDI thread; no MIDI input
will be available. You can access the synthesizer
through the console.
Type 'help' for help topics.

可以发现好了但没有完全好,error 里面主要涉及的是 .sf2 这个东西,如果这个时候重新运行 Python 代码同样也会报错:

Parameter 'D:\/.fluidsynth/default_sound_font.sf2' not a SoundFont or MIDI file or error occurred identifying it.

这是因为想要转换还需要 sound font 文件,根据笔者粗浅的理解,这个“声音字体”就是音色的数字实现,使用不同的 .sf2 文件就可以实现不同的音色了。可以看到 FluidSynth 有一个默认的路径用来存放 soundfonts,但并没有给我们。因此我这里就去网上找了一些免费的 sound font 文件,放到项目所在的文件夹下。同时在 FluidSynth() 函数中增加路径参数,问题解决。我后来发现如果用 pycharm 来运行代码的话,需要在添加路径之后把 pycharm 重启一下才行,这个是 pycharm 的问题。

FluidSynth(sound_font="some_sound_font.sf2").midi_to_audio('input.mid', 'output.wav')

我找到的一个可以下载声音字体的地方分享一下:polyphone,另外关于喜欢曲子的 MIDI 文件其实并不是很好找,当时我特别喜欢 Unravel,最终是找到了 A 叔版本的 midi。在网上找 MIDI 还费了一些功夫,给大家总结一下:

  1. https://www.aigei.com/ 需要注册账号才能下两三个
  2. https://www.midishow.com/ 需要账号和积分下载
  3. https://midi.midicn.com/ 和 https://www.midiclouds.com/ 一些整理的素材包,可免费下载
  4. https://freemidi.org/ 免费下载

3. 总结一下解决方案:

mid2wav 需要 fluidsynth.exe(官网下载免安装!)和 default_sound_font.sf2(指定曲子的音色,想听什么乐器就用什么音色!)

from midi2audio import FluidSynth
FluidSynth(sound_font="J800_Piano.sf2").midi_to_audio('Animenz_Unravel.mid', 'Animenz_Unravel.mp3')

  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 可以使用Python中的pydub库来将音频mp3转换成wav格式。具体步骤如下: 1. 安装pydub库:在命令行中输入`pip install pydub`进行安装。 2. 导入pydub库:在Python代码中导入pydub库,代码如下: ```python from pydub import AudioSegment ``` 3. 加载mp3文件:使用AudioSegment类中的`from_mp3`方法加载mp3文件,代码如下: ```python sound = AudioSegment.from_mp3("audio.mp3") ``` 4. 转换格式:使用AudioSegment类中的`export`方法将mp3文件转换成wav格式,代码如下: ```python sound.export("audio.wav", format="wav") ``` 其中,第一个参数为转换后的文件名,第二个参数为转换后的格式。 5. 完整代码如下: ```python from pydub import AudioSegment sound = AudioSegment.from_mp3("audio.mp3") sound.export("audio.wav", format="wav") ``` 运行代码后,会在当前目录下生成一个名为`audio.wav`的wav文件。 ### 回答2: Python中有多种方式可以将音频mp3转换成wav格式,其中最为常用的是采用FFmpeg库进行操作。以下是具体的步骤: 1. 安装FFmpeg库 在Python中,我们可以通过pip安装FFmpeg库。首先需确保电脑中已经安装好FFmpeg和FFprobe命令行工具,可以在终端中运行ffmpeg和ffprobe指令测试。根据不同的操作系统可以采用不同的方式进行安装。 在控制台命令行窗口输入以下命令: ```python pip install ffmpeg-python ``` 2. 导入ffmpeg库 安装完成后,在Python代码中导入FFmpeg库。 ```python import ffmpeg ``` 3. 进行音频格式转换 最后,我们可以使用ffmpeg库中音频转换的API进行mp3转换成wav。下面给出一个样例代码,读取一个mp3文件并将其转换成wav格式: ```python import ffmpeg input_file = 'test.mp3' # 输入文件名 output_file = 'test.wav' # 输出文件名 try: # 使用ffprobe获取音频文件信息 probe = ffmpeg.probe(input_file) audio_stream = next((stream for stream in probe['streams'] if stream['codec_type'] == 'audio'), None) # 读取音频流数据 audio_data, _ = ( ffmpeg .input(input_file) .output('pipe:', format='wav') .run(capture_stdout=True) ) # 将数据写入新的wav文件中 with open(output_file, 'wb') as f: f.write(audio_data) except Exception as e: print('音频格式转换失败:', e) print('音频格式转换完成') ``` 上述代码中,首先使用FFprobe获取音频文件信息,然后读取音频流数据,并将其写入到新的wav文件中。 除了采用FFmpeg库进行音频格式转换之外,在Python中也可以使用其他的音频转换库来完成该任务。例如,可以采用PyDub库进行音频格式转换,该库封装了FFmpeg并提供了简洁的API供我们使用。 ### 回答3: Python是一种高级编程语言,以其简单、易读、易学和高效的特点被广泛应用于数据分析、机器学习、人工智能等领域。在音频处理领域中,Python也是一种非常流行的工具,它可以轻松地将音频mp3转换成wav。 将音频mp3转换成wav,通常需要使用Python中的音频处理库,例如Pydub、Librosa等。这里我们以Pydub为例,来介绍Python如何将音频mp3转换成wav。 1. 安装Pydub Pydub是Python处理音频的一个强大工具,它内置了许多音频处理相关的功能,如格式转换、剪裁、合并、混响等等。在使用Pydub之前,需要先安装该库。可以通过pip install pydub命令来安装Pydub。 2. 导入相关库 要将音频mp3转换成wav,需要导入Pydub库。在导入Pydub库之前,需要先安装FFmpeg,这是一个支持多种音频和视频格式的开源解码器。可以从官网http://ffmpeg.org/下载最新版本的FFmpeg。 在安装了FFmpeg之后,需要在Python代码中指定FFmpeg的路径。可以通过以下代码进行指定: import os os.environ["PATH"] += os.pathsep + 'ffmpeg的路径' import pydub 3. 加载音频文件 在将音频mp3转换成wav之前,需要先将音频文件加载到Python中。可以使用Pydub的AudioSegment.from_file()函数来加载音频文件。例如,要将mp3格式的音频文件转换成wav格式,可以使用以下代码: audio_file = '音频文件的路径' audio = pydub.AudioSegment.from_file(audio_file, format='mp3') 4. 转换格式 一旦将音频文件加载到Python中,就可以使用AudioSegment的export()函数将音频文件转换成wav格式。可以使用以下代码将音频文件转换成wav格式: audio.export('转换后的文件路径', format='wav') 这里,‘转换后的文件路径’是转换后的音频文件需要保存的路径,例如'./file.wav'。 通过上述步骤,就可以将音频mp3转换成wav。需要注意的是,将音频文件转换成wav格式可能会使文件大小变得更大。因此,在处理大文件时,需要留意磁盘空间和内存。另外,如果需要进行其他的音频处理任务,可以研究Pydub库的其他功能,例如剪裁、合并、混响等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值