Python实现音频文件格式转化
程序员文章站
2022-05-04 14:41:16
...
该代码用于音频格式转化;
已实现的方法有,其他格式音频文件转为单声道、16000Hz采样率、数据类型(int16,float32)
若是想转化为其他格式,可以自行在网上寻找FFmpeg的用法。
"""
ffmpeg命令:-i 输入音频文件名
-acodec 设置音频的编码或解码器,
具体可选项参考:https://developer.qiniu.com/dora/kb/1432/avthumb-parameter-acodec-format-and-explanation
这里用的 pcm_f32le 表示,PCM-32位浮点数 little-endian(小端)
-ac 音频文件的通道数
-ar 音频文件的采样率
最后面是输出的音频文件名
"""
# coding=utf-8
"""
该代码用于音频格式转化;
已实现的方法有,其他格式音频文件转为单声道、16000Hz采样率、数据类型(int16,float32)
若是想转化为其他格式,可以自行在网上寻找FFmpeg的用法
"""
from ffmpy3 import FFmpeg
import os
import scipy.io.wavfile as wav
def read_wav(audio_path):
'''读取音频文件wav,返回时间序列y和采样率sr'''
sr, y = wav.read(filename=audio_path) #读取音频文件,返回音频采样率和时间序列
return y, sr
def other_to_wav_float32(src_dir, dst_dir):
"""
将其他格式的音频文件转化为wav格式且float32数据类型、单声道、16000Hz采样率
root中包含根目录 src_dir 以及其内的所有文件夹的绝对路径名;
dirs中是root中每一文件夹内的文件夹名字;
files中是root中每一文件夹内的文件名
"""
for root, dirs, files in os.walk(src_dir):
for name in files:
# print(os.path.join(root, name)) # 打印出src_dir目录下所有的文件的绝对路径名
audio_name_src = os.path.join(root, name)
audio_name_dst = os.path.join(dst_dir, name.split('.')[0]+'_.wav')
ff = FFmpeg(
inputs={audio_name_src: None},
outputs={audio_name_dst: ['-acodec', 'pcm_f32le', '-ac', '1', '-ar', '16000']}
) # 将other格式文件转化为‘pcm-16位 float、1通道、16000Hz采样率的wav文件'
# print(ff.cmd) # 打印出所执行的命令,如果在shell中运行的话,就是该命令形式
ff.run()
def other_to_wav_int16(src_dir, dst_dir):
"""
将其他格式的音频文件转化为wav格式且int16数据类型、单声道、16000Hz采样率
root中包含根目录 src_dir 以及其内的所有文件夹的绝对路径名;
dirs中是root中每一文件夹内的文件夹名字; files中是root中每一文件夹内的文件名
"""
for root, dirs, files in os.walk(src_dir):
for name in files:
# print(os.path.join(root, name)) # 打印出src_dir目录下所有的文件的绝对路径名
audio_name_src = os.path.join(root, name)
audio_name_dst = os.path.join(dst_dir, name.split('.')[0]+'.wav')
ff = FFmpeg(
inputs={audio_name_src: None},
outputs={audio_name_dst: ['-acodec', 'pcm_s16le', '-ac', '1', '-ar', '16000']}
) # 将other格式文件转化为‘pcm-16位 float、1通道、16000Hz采样率的wav文件'
# print(ff.cmd) # 打印出所执行的命令,如果在shell中运行的话,就是该命令形式
ff.run()
def single_test(audio_path_src, audio_path_dst):
"""
将其他格式的音频文件转化为wav格式且int16数据类型、单声道、16000Hz采样率
"""
ff = FFmpeg(
inputs={audio_path_src: None},
outputs={audio_path_dst: ['-acodec', 'pcm_s16le', '-ac', '1', '-ar', '16000']}
) # 将other格式文件转化为‘pcm-16位 float、1通道、16000Hz采样率的wav文件'
# print(ff.cmd) # 打印出所执行的命令,如果在shell中运行的话,就是该命令形式
ff.run()
if __name__ == "__main__":
audio_path_src = r'./audio_test/no.wav'
audio_path_dst = r'./audio_test/9_.wav'
single_test(audio_path_src, audio_path_dst)