admin管理员组

文章数量:1583571

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/ 需要注册账号才能下两三个
  2. https://www.midishow/ 需要账号和积分下载
  3. https://midi.midicn/ 和 https://www.midiclouds/ 一些整理的素材包,可免费下载
  4. https://freemidi/ 免费下载

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')

本文标签: 转成优雅格式音乐Python