Python конвертировать mp3 в WAV с Pydub

Хорошо, теперь я застрял в преобразовании mp3 в WAV. Я видел разные ответы, но я думаю, что я бы пошел на один из Pydub, который я уже сделал, используя эти несколько строк

from pydub import AudioSegment

AudioSegment.from_mp3("/input/file.mp3").export("/output/file.wav", format="wav")

но когда я запускаю приведенный выше код, я получаю следующую ошибку

C:\Python27\lib\site-packages\pydub-0.14.2-py2.7.egg\pydub\utils.py:165: RuntimeWarning: не удалось найти ffmpeg или avconv - по умолчанию ffmpeg, но может не работать

Трассировка (последний вызов был последним): файл "C:/Users/phourlhar/Desktop/VoiceDetector/yeah.py", строка 7, в stereo_to_mono()

Файл "C:\Users\phourlhar\Desktop\VoiceDetector\utils.py", строка 25, в stereo_to_mono

sound = AudioSegment.from_mp3(PROJECT_DIR+'\\files\\rec'+str(c)+'.mp3')

Файл "build\bdist.win32\egg\pydub\audio_segment.py", строка 346, в файле from_file

Файл "C:\Python27\lib\subprocess.py", строка 711, в init errread, errwrite)

Файл "C:\Python27\lib\subprocess.py", строка 948, в _execute_child startupinfo)

WindowsError: [Ошибка 2] Система не может найти указанный файл

Я не знаю, почему возникает эта ошибка, так как я уверен, что файл существует. Хотя у меня есть ответы, предлагающие установку ffmpeg, но я не знаю, повлияет ли это на развертывание приложения каким-либо образом позже

2 ответа

Решение

pydub модуль использует либо ffmpeg или же avconf программы, чтобы сделать фактическое преобразование. Таким образом, вы должны установить ffmpeg чтобы сделать эту работу.

Но если вам не нужно pydub для всего остального, вы можете просто использовать встроенный subprocess модуль для вызова программы конвертера, как ffmpeg как это:

  import subprocess

  subprocess.call(['ffmpeg', '-i', '/input/file.mp3',
                   '/output/file.wav'])

Между прочим, это требует, чтобы бинарный файл ffmpeg находился в вашей папке $PATH.

Изменить: с ffmeg Насколько я знаю, вы не можете конвертировать стерео в моно. Вы можете выбрать только левый или правый канал. Я предполагаю, что это не то, что вы хотите.

sox Программа может конвертировать стерео в моно:

  import subprocess

  subprocess.call(['sox', '/input/file.mp3', '-e', 'mu-law', 
                   '-r', '16k', '/output/file.wav', 'remix', '1,2'])

Это будет выборка на частоте 16 кГц, с 8 битами на выборку, что даст вам 16 кбит / с.

Вы должны пойти на Pydub, это отличный модуль для операций, связанных с аудиофайлами.

НОТА. Не забудьте установить ffmpeg перед использованием pydub.

Для получения справки по установке ffmpeg вы можете воспользоваться этой ссылкой.

Затем, чтобы установить pydub, просто откройте командную строку и введите

pip install pydub

Затем для конвертации любого файла из mp3 в wav просто используйте pydub как

import pydub
sound = pydub.AudioSegment.from_mp3("D:/example/apple.mp3")
sound.export("D:/example/apple.wav", format="wav")

Проблема связана с отсутствием ffmpeg. Pydub требует, чтобы он выполнял операции преобразования формата. Для решения проблемы есть 2 способа:

  1. Просто установите pydub с помощью conda , а не pip (несмотря на предложение на странице Pydub на GitHub)

    conda install -c conda-forge pydub
    

Это должно работать нормально. Причина неизвестна, возможно, из-за несовместимости.

  1. Другое решение (если вы уже использовали pip для установки Pydub, и он не работает) - установить недостающий ffmpegпакет. Здесь возникает еще одна проблема. Хотя мы можем найти пакет с именемffmpegкак на pypi, так и на anaconda, если мы установили только один из источников, мы, вероятно, увидим ошибку, например

    In [1]: import ffmpeg                                                                               
    ---------------------------------------------------------------------------
    ModuleNotFoundError                       Traceback (most recent call last)
    <ipython-input-1-16f5f3b4de71> in <module>
    ----> 1 import ffmpeg
    
    ModuleNotFoundError: No module named 'ffmpeg'
    

После нескольких тестов я обнаружил, что оба должны быть установлены, чтобы пакет ffmpegработать (другими словами, установить дважды). В противном случае Python каким-то образом не может найти пакет, даже если он был установлен через pip или anaconda. Так что просто введите

pip install ffmpeg
conda install ffmpeg

Теперь попробуйте импортировать ffmpegв питоне. Если ошибки нет, проблема уже должна быть решена.

ОБРАТИТЕ ВНИМАНИЕ, что при загрузке вручнуюffmpegс веб-сайта FFmpeg и добавьтеbin путь к sys.pathможет не помочь с этой проблемой. Точно так же вручную указав путь к исполняемому файлуffmpeg (в Windows это ffmpeg.exe) тоже может не решить проблему.

Другие вопросы по тегам