You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下midi2audio遇FileNotFoundError报错,求解决及替代方案

解决midi2audio触发FileNotFoundError的问题及替代方案

核心原因

这个错误大概率不是找不到MIDI或SoundFont文件,而是系统找不到FluidSynth的可执行程序——midi2audio只是Python封装,依赖系统中安装的FluidSynth二进制文件。


修复midi2audio的方案

1. 安装FluidSynth并添加到PATH

  • Windows用户需单独下载FluidSynth二进制包,解压后找到fluidsynth.exe所在路径,将其添加到系统环境变量PATH中。
  • 或者在代码中直接指定可执行文件路径:
    from midi2audio import FluidSynth
    
    # 替换为你的fluidsynth.exe实际路径
    fs = FluidSynth(
        "Musical_Box.sf2",
        fluidsynth_path="C:/Program Files/FluidSynth/bin/fluidsynth.exe"
    )
    fs.midi_to_audio("input.mid", "output.wav")
    

2. 用绝对路径避免工作目录问题

有时候脚本的工作目录并非你认为的文件所在目录,改用绝对路径验证:

import os
from midi2audio import FluidSynth

# 生成文件绝对路径
sf2_path = os.path.abspath("Musical_Box.sf2")
midi_path = os.path.abspath("input.mid")
output_path = os.path.abspath("output.wav")

fs = FluidSynth(sf2_path)
fs.midi_to_audio(midi_path, output_path)

替代库方案

如果不想折腾FluidSynth依赖,试试这些更省心的选项:

1. python-fluidsynth(底层绑定,可控性强)

直接调用FluidSynth核心库,无需系统安装独立可执行文件:

import fluidsynth

# 初始化合成器
fs = fluidsynth.Synth()
# Windows推荐用dsound或winmm驱动
fs.start(driver="dsound")

# 加载SoundFont
sf_id = fs.sfload("Musical_Box.sf2")
# 为通道0分配乐器
fs.program_select(0, sf_id, 0, 0)

# 读取并解析MIDI文件
with open("input.mid", "rb") as midi_file:
    midi_data = midi_file.read()
fs.midi_parse(midi_data)

# 渲染输出WAV
fs.write_sound("output.wav")

# 清理资源
fs.delete()

2. 调用FFmpeg(命令行方式,简单直接)

如果已经安装FFmpeg(添加到PATH),可以直接用Python调用命令行转换:

import subprocess

subprocess.run(
    [
        "ffmpeg", "-i", "input.mid", "-i", "Musical_Box.sf2",
        "-c:a", "pcm_s16le", "output.wav"
    ],
    check=True,
    shell=True  # Windows下可能需要加这个
)

3. Pygame(老牌库,兼容性好)

适合简单场景,内置MIDI支持:

import pygame
import time

def midi_to_wav(midi_path, output_path):
    # 初始化mixer和midi模块
    pygame.mixer.init()
    pygame.midi.init()

    # 加载MIDI文件
    pygame.mixer.music.load(midi_path)
    # 静音播放完成渲染
    pygame.mixer.music.set_volume(0)
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy():
        time.sleep(0.1)
    
    # 若需直接保存WAV,可结合python-fluidsynth完成后续渲染步骤

midi_to_wav("input.mid", "output.wav")

内容的提问来源于stack exchange,提问作者Bsector

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:37:33