import mido
from pydub import AudioSegment
def midi_to_mp3(midi_path, mp3_path):
# Load MIDI file
midi = mido.MidiFile(midi_path)
# Create an empty list to store notes
notes = []
for track in midi.tracks:
# Iterate through MIDI messages in track
for msg in track:
# Check if message is a note on event
if msg.type == 'note_on':
# Add note (pitch, velocity, time) to notes list
notes.append((msg.note, msg.velocity, msg.time))
tempo = 120
duration = 1000
segments = []
for note in notes:
pitch, velocity, time = note
# Calculate duration of note based on tempo and time
note_duration = int(duration * (mido.tick2second(time, midi.ticks_per_beat, tempo) * 1000))
# Create audio segment for note
segment = AudioSegment.silent(duration=note_duration)
segments.append(segment)
audio = sum(segments)
audio.export(mp3_path, format = "mp3")
midi_to_mp3("melody.mid", "output.mp3")
This is the full error message:
C:\Dipika\Study\musicrypt\env\Scripts\python.exe "C:/Program Files/JetBrains/PyCharm 2023.1.3/plugins/python/helpers/pydev/pydevd.py" --multiprocess --qt-support=auto --client 127.0.0.1 --port 56448 --file C:\Dipika\Study\musicrypt\musicrypt.py
Connected to pydev debugger (build 231.9161.41)
C:\Dipika\Study\musicrypt\env\Lib\site-packages\pydub\utils.py:170: RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work
warn("Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work", RuntimeWarning)
C:\Dipika\Study\musicrypt\env\Lib\site-packages\pydub\utils.py:198: RuntimeWarning: Couldn't find ffprobe or avprobe - defaulting to ffprobe, but may not work
warn("Couldn't find ffprobe or avprobe - defaulting to ffprobe, but may not work", RuntimeWarning)
Traceback (most recent call last):
File "C:\Program Files\JetBrains\PyCharm 2023.1.3\plugins\python\helpers\pydev\pydevd.py", line 1496, in _exec
pydev_imports.execfile(file, globals, locals) # execute the script
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Program Files\JetBrains\PyCharm 2023.1.3\plugins\python\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "C:\Dipika\Study\musicrypt\musicrypt.py", line 70, in <module>
convert_to_mp3('melody.mid', 'audio.mp3')
File "C:\Dipika\Study\musicrypt\musicrypt.py", line 46, in convert_to_mp3
midi_audio = AudioSegment.from_file(midi_path, format = "midi")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Dipika\Study\musicrypt\env\Lib\site-packages\pydub\audio_segment.py", line 728, in from_file
info = mediainfo_json(orig_file, read_ahead_limit=read_ahead_limit)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Dipika\Study\musicrypt\env\Lib\site-packages\pydub\utils.py", line 274, in mediainfo_json
res = Popen(command, stdin=stdin_parameter, stdout=PIPE, stderr=PIPE)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Admin\AppData\Local\Programs\Python\Python312\Lib\subprocess.py", line 1026, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "C:\Users\Admin\AppData\Local\Programs\Python\Python312\Lib\subprocess.py", line 1538, in _execute_child
hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Program Files\JetBrains\PyCharm 2023.1.3\plugins\python\helpers\pydev\_pydev_bundle\pydev_monkey.py", line 585, in new_CreateProcess
return getattr(_subprocess, original_name)(app_name, patch_arg_str_win(cmd_line), *args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [WinError 2] The system cannot find the file specified
python-BaseException
Process finished with exit code 1
Я пытаюсь преобразовать текст в мелодию, используя библиотеку music21, которая, к сожалению, выдает на выходе формат среднего файла. Я не могу воспроизвести этот средний файл ни через один веб-браузер. Вот почему я попытался преобразовать файл Mid с помощью библиотек Mido и pydub. Но каждый раз, когда я запускаю это, моя система выдает ошибку «Система не может найти указанный файл». У меня есть файл melody.mid по тому же пути, что и файл Python.
Я ожидал получить в конце mp3-файл.
@nigh_anxiety да, я нахожусь в текущем рабочем каталоге. Я также попытался указать полный путь. Но все равно получаю ту же ошибку. Похоже, это как-то связано с библиотеками, которые я использую. Все еще отлаживаем!!
Не могли бы вы опубликовать полное сообщение об ошибке и проследить вопрос?
ffmpeg
и ffprobe
являются частью программного пакета, который представляет собой обычное программное обеспечение для вашего компьютера, а не библиотеку Python. Вот почему вы видите Popen
в трассировке стека — библиотека Pydub пытается запустить эту программу как отдельную программу и записать ее выходные данные. Его необходимо установить отдельно. Подробности смотрите в связанном дубликате. Кстати, описанная здесь проблема не имеет ничего общего с mido
.
Вы получаете эту ошибку, потому что вы не установили дополнительные зависимости, не относящиеся к Python, для библиотеки pydub
. pydub
использует дополнительные программы, установленные в вашей системе для кодирования/декодирования различных форматов аудиофайлов. Как указано в инструкции по установке пакета :
Установить pydub легко, но не забудьте установить ffmpeg/avlib (следующий раздел в этом документе).
Из раздела Зависимости той же документации:
Вы можете открывать и сохранять файлы WAV с помощью чистого Python. Для открытия и сохранения файлов, отличных от WAV, например mp3, вам понадобится ffmpeg или libav.
Существует дополнительный набор инструкций специально для настройки ffmpeg, если это необходимо. ffmpeg — это библиотека по умолчанию, которую pydub пытается использовать, если не может определить, какая библиотека установлена.
Когда вы запускаете скрипт Python, находитесь ли вы в его каталоге в качестве текущего рабочего каталога? Когда скрипт запускается и ищет «melody.mid», он ищет относительно вашего текущего рабочего каталога, а не местоположения скрипта Python.