在django中使用ffmpeg实现mp3格式的音频 转换成 wav格式。作适当改造,也可以在非django项目中使用,本文仅提供实现方案,作为参考。

使用场景:

在微信小程序中录音,调用讯飞的相关音频训练接口。

由于微信小程序中的录音,不能满足讯飞音频训练的音频格式(需要16k采样率,16bits采样深度,单声道的wav),需要在服务器使用ffmpeg转换成所需的格式。

实现方案:

在微信小程序中录音(mp3格式),上传到服务器,服务器将mp3格式转转成16k采样率,16bits采样深度,单声道的wav,再调用讯飞相关音频识别接口。

小程序中音频选项设置:

const audioOptions = {duration: 60000 * 10, // 最长10分钟        (默认为60秒)// sampleRate: 8000,     // 采样率16k        (默认为8000)// encodeBitRate: 48000, // 编码率16bit      (默认为48000)// numberOfChannels: 2,  // 录音通道数:单通道 (默认为2)format: 'mp3',        // wav格式          (默认为mp3)
};

服务器python代码中核心转换代码:

subprocess.call(['/usr/local/ffmpeg/bin/ffmpeg','-i', mp3_file_path, '-map_metadata', '-1', '-flags', '+bitexact','-ar', '16000', '-ac', '1', '-acodec', 'pcm_s16le', '-y', wav_file_path])

一、安装环境:

cd /root/tmp/mkdir about_ffmpegcd about_ffmpeg/ls

# 下载

wget https://ffmpeg.org/releases/ffmpeg-4.2.2.tar.bz2wget https://sourceforge.net/projects/lame/files/lame/3.100/lame-3.100.tar.gzwget https://libav.org/releases/libav-12.3.tar.gzwget https://downloads.xiph.org/releases/ogg/libogg-1.3.3.tar.xzwget http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.3.tar.gz# wget https://ftp.osuosl.org/pub/xiph/releases/vorbis/libvorbis-1.3.3.tar.gzwget https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.bz2wget http://downloads.xvid.org/downloads/xvidcore-1.3.4.tar.gzwget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz

# 安装

# 1、安装lame:

tar -zxvf lame-3.100.tar.gzcd lame-3.100/./configuremake && make installmake cleancd ..lame --version

# 2、安装libogg:

tar -xf libogg-1.3.3.tar.xzcd libogg-1.3.3/# ./conufigure./configure --prefix=/usr --disable-static --docdir=/usr/share/doc/libogg-1.3.3make && make installmake cleanlibogg -versioncd ..ldconfig

# 3、安装libvorbis:

tar -zxvf libvorbis-1.3.3.tar.gzcd libvorbis-1.3.3/./configuremake && make installmake cleancd ..

# 4、安装xvidcore:

tar -zxvf xvidcore-1.3.4.tar.gzcd xvidcore/cd build/generic/./configuremake && make installcd ../../..

# 5、安装yasm:

tar -vxf yasm-1.3.0.tar.gzcd yasm-1.3.0/./configuremake && make installcd ..

# 6、安装x264-master:

tar -vxf x264-master.tar.bz2cd x264-master/#./configure --enable-shared --enable-static./configure --enable-shared --enable-static --disable-asmmake && make installcd ..

# 7、安装libav:

cd /root/tmp/about_ffmpeg/tar -vxf libav-12.3.tar.gzcd libav-12.3/./configuremake && make installcd ..

# 8、安装ffmpeg:

tar -vxf ffmpeg-4.2.2.tar.bz2cd ffmpeg-4.2.2/./configure --enable-shared --prefix=/usr/local/ffmpegmake && make installcd ..ldconfigffmpeg -versioncd /usr/local/ffmpeg/./bin/ffmpeg -versionldd ffmpegcd bin/ldd ffmpegcd ..export LD_LIBRARY_PATH=lib/cd bin/export LD_LIBRARY_PATH=../lib/ldd ffmpegffmpeg -version./ffmpeg -versionldconfigffmpeg -versioncd /usr/local/ffmpeg/bin/ldd ffmpegcd /ffmpeg -versioncd /root/vi .bashrc# 编辑内容export PATH="/usr/local/ffmpeg/bin:$PATH"source .bashrcffmpeg -versionldd ffmpegffmpeg -versionldconfigffmpeg -versioncd /usr/local/ffmpeg/ldd ffmpegcd bin/ldd ffmpegexport LD_LIBRARY_PATH=/usr/local/ffmpeg/lib/ffmpegcd /ffmpegffmpeg -versionvi .bashrc# 编辑内容# export PATH="/usr/local/ffmpeg/bin:$PATH"source .bashrcffmpeg -versionffmpegcd /usr/local/ffmpeg/bin/ldd ffmpegexport LD_LIBRARY_PATH=/usr/local/ffmpeg/lib/ldd ffmpegffmpeg -versioncd /ffmpeg -versionldconfigffmpeg -versionldconfigffmpeg -versioncd /etc/vi ld.so.conf# 编辑内容include ld.so.conf.d/*.conf/usr/local/ffmpeg/lib/ldconfigffmpeg -versionldconfigffmpeg/usr/local/ffmpeg/bin/ffmpeg --versionffmpeg --versionvi /etc/profile# 编辑内容PATH=$PATH:/usr/local/ffmpeg/binexport PATHsource /etc/profileffmpeg --version

二、代码实现:

import subprocess
import _thread
import time
import os
import io
import hashlibfrom pydub import AudioSegment
from django.conf import settings# 获取终端上传的文件
file = request.FILES.get("uploadFile", None)####
# 转换完成后,是否删除掉原上传的音频文件
is_remove_tmp_audio_file = False
####logger.info('------- start')file_data = file.read()logger.info('111111 开始')try:# 先保存mp3音频到本地file_md5 = calculate_md5(file)logger.info('222222 file_md5:' + file_md5)# 获取扩展类型 并 判断file_type = get_file_extension(file)logger.info('222222 file_type:' + file_type)file_name = file_md5 + "." + file_typelogger.info('222222 file_name:' + file_name)if not os.path.exists(settings.MEDIA_ROOT + 'upload/'):os.makedirs(settings.MEDIA_ROOT + 'upload/')file_path = settings.MEDIA_ROOT + 'upload/' + file_namelogger.info('222222 file_path:' + file_path)f = Nonetry:# 保存文件f = open(file_path, "wb+")# 分块写入for chunk in file.chunks():f.write(chunk)logger.info('333333 保存文件成功')# 读取文件# 将mp3格式转转成16k采样率,16bits采样深度,单声道的wav# 将上传上来的音频构造成AudioSegment# io.BytesIO(file_data)sound_access = AudioSegment.from_file(file_path, format=file_type)logger.info('444444 sound_access.frame_rate=' + str(sound_access.frame_rate))logger.info('444444 sound_access.sample_width=' + str(sound_access.sample_width))logger.info('444444 sound_access.channels=' + str(sound_access.channels))#####if is_remove_tmp_audio_file:# 删除临时文件try:os.remove(file_path)except Exception as ex1:logger.error(ex1)#####wav_path = settings.MEDIA_ROOT + 'upload/' + file_md5 + ".wav"logger.info('555555 sound_wav wav_path:' + wav_path)is_changed = __chage_audio_format_to_wav(file_path, wav_path)logger.info('555555 转换格式方法一,结果:is_changed=' + str(is_changed))if is_changed is False:# 通过AudioSegment构造wav音频sound_wav = AudioSegment(data=sound_access.raw_data,# 指定采样深度,可选值1,2,3,4# 2 byte (16 bit) samplessample_width=2,# 指定采样频率# 16kHz frame rateframe_rate=16000,# 指定声道数量# stereo or monochannels=1)logger.info('555555-2 转换格式方法二,sound_wav.frame_rate=' + str(sound_wav.frame_rate))logger.info('555555-2 转换格式方法二,sound_wav.sample_width=' + str(sound_wav.sample_width))logger.info('555555-2 转换格式方法二,sound_wav.channels=' + str(sound_wav.channels))# file_data = sound_wav.raw_data  # 取wav的内容logger.info('555555-2 转换格式方法二,sound_wav wav_path:' + wav_path)sound_wav.export(wav_path, format='wav')logger.info('555555-2 转换格式方法二,结果:export wav成功')wav_file = open(wav_path, "rb+")logger.info('666666 读取wav_file')file_data = wav_file.read()logger.info('777777 已获取wav_file的数据')#####if is_remove_tmp_audio_file:# 删除临时文件try:os.remove(wav_path)except Exception as ex1:logger.error(ex1)#####logger.info('888888 结束')except Exception as e:logger.error(e)finally:if f is not None:f.close()logger.info('------- end')
except Exception as ex1:logger.error(ex1)# 此时,file_data就是符合要求的格式的wav内容,调用接口上传给讯飞服务器即可
#def __chage_audio_format_to_wav(source_file_path, wav_file_path):"""将音频格式化成wav格式(可语音识别的格式):param source_file_path: 原音频文件路径:param wav_file_path: 转换成wav格式后的文件路径"""try:# ffmpeg -i e1f00d114b1211ff0e4c070bbb8333f8.mp3 -map_metadata -1 -flags +bitexact -ar 16000 -ac 1 -acodec pcm_s16le -y 01.wavlogger.info('source_file_path=' + source_file_path)logger.info('wav_file_path=' + wav_file_path)# ffmpeg -i 输入文件全路径 输出文件全路径 其他参数# cmd = 'ffmpeg -i ' + source_file_path + ' -map_metadata -1 -flags +bitexact -ar 16000 -ac 1 -acodec pcm_s16le' + ' -y ' + wav_file_path + ''# logger.info('cmd=' + cmd)# subprocess.call(cmd)subprocess.call(['/usr/local/ffmpeg/bin/ffmpeg','-i', source_file_path, '-map_metadata', '-1', '-flags', '+bitexact','-ar', '16000', '-ac', '1', '-acodec', 'pcm_s16le', '-y', wav_file_path])# os.system(cmd)logger.info('转换音频成功!')return Trueexcept Exception as ex:logger.error(ex)return False

本文用到的相关安装包下载

django中实现mp3转wav(使用ffmpeg)相关推荐

  1. java mp3,audio - 在Java中播放.mp3和.wav?

    audio - 在Java中播放.mp3和.wav? 如何在我的Java应用程序中播放.mp3和.wav文件? 我正在使用Swing. 我尝试在互联网上寻找类似这样的例子: public void p ...

  2. 使用FFmpeg转换mp3或wav文件为pcm格式文件

    使用FFmpeg转换mp3或wav文件为pcm格式文件 由于项目开发中需要验证pcm格式音频的播放,可以使用FFmpeg进行转换 安装时这里推荐一个便捷方式,sudo apt install smpl ...

  3. 基于FFMpeg实现音频mp3/aac/wav解码

    编译环境:Ubuntu16.04 64位 交叉编译工具:arm-himix200-linux-gcc 文章目录 1. ffmpeg源码下载 2. 交叉编译 3. 静态库链接 4. 头文件包含 5. 解 ...

  4. linux中mp3转wav格式

    ubuntu中mp3转wav脚本 #!/bin/bash for file in *.mp3; doffmpeg -i "$file" -acodec pcm_s16le -ac ...

  5. ffmpeg window下批量转换MP3为wav

    转载链接:https://blog.csdn.net/fuchuchen/article/details/55214216 ffmpeg 在window下将MP3转换为wav文件 1)ffmpeg   ...

  6. 如何从MP4视频文件中抽取MP3音频?

    简 介: 为了能够处理视频中的音频,测试了两种提取视频中的音频方法.一种是利用格式工程软件另外一种利用ffmpeg软件. 关键词: 视频文件,音频文件,mp4,mp3 #mermaid-svg-sPs ...

  7. 用python播放声音文件(mp3、wav、m4a等)

    用python播放声音文件(mp3.wav.m4a等) 前段时间在搞一个基于python的语音助手,其中需要用到python播放音频的功能,要在windows上和树莓派上运行,但是在网上找了好久,都没 ...

  8. mp3与wav格式的互转

    一.准备工作 在使用转换时,可以直接使用python中的模块进行调用,还有一种直接使用ffmpeg程序在命令窗下执行的方法,暂时没有实现. 1.1 模块的安装 1)AudioSegment的模块在py ...

  9. mp3如何转换为wav_将WAV转换为MP3或MP3转换为WAV

    mp3如何转换为wav Boy I would have loved this post a decade ago when I was ripping CDs from my local libra ...

最新文章

  1. NuGet在Push的时候提示“远程服务器返回错误:(403)已禁用”问题解决
  2. 牛客网剑指offer编程实践21-30题
  3. matlab fgetl用法,Matlab fgetl strsplit 函数
  4. Xiki Shell Kickstarter,HummingBoard计算机等
  5. Docker容器和本机之间的文件传输
  6. 【代码笔记】iOS-底下滚动,上面标题栏也会跟着变动
  7. ListView学习思维导图
  8. python和大数据的关系_Java大数据和python大数据哪个更主流?
  9. mysql 网页_mysql网页客户端工具
  10. 计算机管理员保密责任书,信息安全保密工作责任书
  11. 小册上新 | 区块链开发入门:从 0 到 1 构建基于以太坊智能合约的 ICO DApp
  12. MongoDB的分片集群
  13. 冯·诺依曼,天才中的天才
  14. Datawhale:愿竞赛圈少一些人身攻击和热点炒作
  15. 对耳朵伤害最小的耳机类型是哪种?如何保护我们的耳朵?
  16. 时下火热的 NFT 究竟有什么用?
  17. 前端面试题(背题中)
  18. ffmpeg mp4切片ts加密
  19. 对你影响最深的计算机书籍是哪一本?
  20. 集成支付宝支付(AliPay)详解,防跳坑

热门文章

  1. 【英语:语法基础】C2.日常对话-兴趣爱好
  2. 天创速盈:运营核心之测图测款, 拼多多测图测款怎么操作?
  3. 输入起始时间,第几周,周几,自动计算出日期
  4. 屌丝程序员走过的第一个十年
  5. JVM03--垃圾回收
  6. 保研计算机英语词汇,简单的英语自我介绍保研面试
  7. sql 四舍五入两种函数(三种方式)
  8. 涂鸦秒变动画,CMU 中国本科生让画动起来(附代码 Demo)
  9. vue实现:查找历史聊天记录,并让页面停留在原位置
  10. Java-Excel导入导出通用实现Demo(附源码Git地址)