欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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)

 

相关标签: python 音频处理