1

一般信息:

我有一个处理音频分类的python项目;后端是完整的,但我在前端受苦。后端要求(我无法更改)是音频文件必须是wav格式,但我希望用户也能够上传 mp3 文件。我的前端是一个使用 python 2.7 和烧瓶的网络服务器。

所以,我基本上想将 mp3 转换为 wav,但不断出错。
(完整的代码在底部,以防需要更清楚地理解问题)

我的尝试:
1-我使用pydub库

我安装了homebrew,libav和ffmpeg
libav安装方法: brew install libav --with-libvorbis - -with-sdl --with-theora
ffmpeg安装方法: brew install ffmpeg --with-libvorbis --with-ffplay --with-theora


方法1

sound = AudioSegment.from_file(filename[i], format="mp3") #filename[i]=nameOfFile
sound.export("input.wav", format="wav")


方法2

AudioSegment.from_file(filename[i], format="mp3").export("input.wav", format="wav")


=>即使我安装了ffmpeg和libav,仍然收到“找不到文件”和“无法检测到ffmpeg或avconv”运行时警告
=>当我使用“from_mp3”而不是“from_file”时出现上面相同的错误(“找不到文件”)
=> 尝试使用“raw”而不是“mp3”并得到“关键错误:sample_width”(找不到这个错误的含义)
注意:我确保我在正确的目录中


2- 使用的子流程

import subprocess
subprocess.call(["ffmpeg", "-i",filename[i],"inputAudio.wav"])


=>得到“OSError:没有这样的文件或目录”


我希望你能帮助我理解问题是什么以及如何解决它......


完整代码:
我在顶部有这个

app = Flask(__name__)
APP_ROOT = os.path.dirname(os.path.abspath(__file__))
os.chdir(APP_ROOT)


在处理音频文件的函数内部

data = request.files.getlist('file') #get all uploaded audio files
fsize = len(data) #number of audio files
i = 0 #index counter

filename = ["" for x in range(fsize)] #LIST TO STORE EACH FILE'S NAME
audiofile = ["" for x in range(fsize)] #LIST TO STORE CLASSIFICATION RESULTS OF EACH FILE


#LOOP THROUGH EACH UPLOADED FILE
for file in data:
    filename[i] = file.filename #ADD FILENAME TO LIST ABOVE
    destination = str(APP_ROOT)

有问题的部分:

    if file.filename.endswith(".mp3"):
        from pydub import AudioSegment
        t = destination + "/" + filename[i]
        file.save(t) #SAVE UPLOADED MP3 FILE TO EXTRACT IT USING PYDUB

        sound = AudioSegment.from_file(filename[i], format="mp3")
        sound.export("input.wav", format="wav")
        os.remove(t) #DELETE MP3 FILE, WE ONLY WANT WAV
        destination +=  "/inputAudio.wav"

代码继续:

#STORE AUDIO FILE TO PREPARE FOR PROCESSING (CLASSIFICATION)
    else:
        destination +=  "/inputAudio.wav"
        file.save(destination)

#FINAL STEP
    audiofile[i]=Raudio.start() #AUDIO PROCESSING (CLASSIFICATION)
    os.remove(destination) #DELETE AUDIO FILE TO PREVENT CLUTTERING OF FILES
    i += 1 #INCREMENT FILE INDEX
4

1 回答 1

2

好的,所以我找到了解决此问题的方法。

我最终从这个站点下载了 FFmpeg 二进制文件。
然后我只是将下载文件的所有内容复制粘贴到以下路径中:

Macintosh HD/Library/Frameworks/Python.framework/Versions/2.7

这也是python exec所在的地方,我记得在某处读到问题可能是在python的路径中找不到ffmpeg或其他东西。

所以....终于奏效了!想我会分享解决方案,因为这个问题占据了我周末的大部分时间,我希望它可以帮助其他人解决他们的问题,

于 2017-11-18T07:21:05.247 回答