对音频文件的处理:音频信息,读取内容,获取时长,切割音频,pcm与wav互转

news2025/1/17 6:07:48

音频处理发现的比较简单的代码,原作者代码在github:GitHub - silencesmile/python_wav: 对音频文件的处理:音频信息,读取内容,获取时长,切割音频,pcm与wav互转

 

可以按给定的开始和结束时间调用代码批处理,示例:

这是原音频文件的信息存储在csv文件,目标是按照给定的开始结束时间切割成多个小的音频片段

bg列为开始时间单位为秒,ed列为结束时间单位为秒,wav列为想要的音频片段命名

 批处理代码,调用了get_second_part_wav函数:

from pydub import AudioSegment
def get_second_part_wav(main_wav_path, start_time, end_time,part_wav_path):
    # 原音频文件路径,开始时间,结束时间,切分音频的存储路径
    start_time = int(start_time) * 1000
    end_time = int(end_time)  * 1000
    sound = AudioSegment.from_file(main_wav_path)
    word = sound[start_time:end_time]
    word.export(part_wav_path, format="wav")


audio_teacher = pd.read_csv('try1.csv', encoding='utf-8')
start_list = audio_teacher['bg'].tolist()
end_list = audio_teacher['ed'].tolist()
wav_list = audio_teacher['wav'].tolist()

for i in range(len(start_list)):
    start_time = start_list[i]
    end_time = end_list[i]
    get_second_part_wav('audio/try1.mp4', start_time, end_time, 'audio_sep/' + str(wav_list[i]))

原作者的可以根据需要调用的代码 :

# -*- coding:utf8 -*-
'''
auth: Young
公众号:Python疯子 (Hold2Crazy)
'''
import wave
import contextlib
import numpy as np
import matplotlib.pyplot as plt

from scipy.io import wavfile
from pydub import AudioSegment


def wav_infos(wav_path):
    '''
    获取音频信息

    :param wav_path: 音频路径
    :return: [1, 2, 8000, 51158, 'NONE', 'not compressed']
    对应关系:声道,采样宽度,帧速率,帧数,唯一标识,无损
    '''
    with wave.open(wav_path, "rb") as f:
        f = wave.open(wav_path)

        return list(f.getparams())

def read_wav(wav_path):
    '''
    读取音频文件内容:只能读取单声道的音频文件, 这个比较耗时

    :param wav_path: 音频路径
    :return:  音频内容
    '''
    with wave.open(wav_path, "rb") as f:
        # 读取格式信息
        # 一次性返回所有的WAV文件的格式信息,它返回的是一个组元(tuple):声道数, 量化位数(byte单位), 采
        # 样频率, 采样点数, 压缩类型, 压缩类型的描述。wave模块只支持非压缩的数据,因此可以忽略最后两个信息
        params = f.getparams()
        nchannels, sampwidth, framerate, nframes = params[:4]

        # 读取声音数据,传递一个参数指定需要读取的长度(以取样点为单位)
        str_data = f.readframes(nframes)

    return str_data

def get_wav_time(wav_path):
    '''
    获取音频文件是时长

    :param wav_path: 音频路径
    :return: 音频时长 (单位秒)
    '''
    with contextlib.closing(wave.open(wav_path, 'r')) as f:
        frames = f.getnframes()
    rate = f.getframerate()
    duration = frames / float(rate)
    return duration


def get_ms_part_wav(main_wav_path, start_time, end_time, part_wav_path):
    '''
    音频切片,获取部分音频 单位是毫秒级别

    :param main_wav_path: 原音频文件路径
    :param start_time:  截取的开始时间
    :param end_time:  截取的结束时间
    :param part_wav_path:  截取后的音频路径
    :return:
    '''
    start_time = int(start_time)
    end_time = int(end_time)

    sound = AudioSegment.from_file(main_wav_path)
    word = sound[start_time:end_time]

    word.export(part_wav_path, format="wav")


def get_second_part_wav(main_wav_path, start_time, end_time, part_wav_path):
    '''
    音频切片,获取部分音频 单位是秒级别

    :param main_wav_path: 原音频文件路径
    :param start_time:  截取的开始时间
    :param end_time:  截取的结束时间
    :param part_wav_path:  截取后的音频路径
    :return:
    '''
    start_time = int(start_time) * 1000
    end_time = int(end_time) * 1000

    sound = AudioSegment.from_file(main_wav_path)
    word = sound[start_time:end_time]

    word.export(part_wav_path, format="wav")

def get_minute_part_wav(main_wav_path, start_time, end_time, part_wav_path):
    '''
    音频切片,获取部分音频 分钟:秒数  时间样式:"12:35"

    :param main_wav_path: 原音频文件路径
    :param start_time:  截取的开始时间
    :param end_time:  截取的结束时间
    :param part_wav_path:  截取后的音频路径
    :return:
    '''

    start_time = (int(start_time.split(':')[0])*60+int(start_time.split(':')[1]))*1000
    end_time = (int(end_time.split(':')[0])*60+int(end_time.split(':')[1]))*1000

    sound = AudioSegment.from_file(main_wav_path)
    word = sound[start_time:end_time]

    word.export(part_wav_path, format="wav")


def wav_to_pcm(wav_path, pcm_path):
    '''
    wav文件转为pcm文件

    :param wav_path:wav文件路径
    :param pcm_path:要存储的pcm文件路径
    :return: 返回结果
    '''
    f = open(wav_path, "rb")
    f.seek(0)
    f.read(44)

    data = np.fromfile(f, dtype=np.int16)
    data.tofile(pcm_path)

def pcm_to_wav(pcm_path, wav_path):
    '''
    pcm文件转为wav文件

    :param pcm_path: pcm文件路径
    :param wav_path: wav文件路径
    :return:
    '''
    f = open(pcm_path,'rb')
    str_data  = f.read()
    wave_out=wave.open(wav_path,'wb')
    wave_out.setnchannels(1)
    wave_out.setsampwidth(2)
    wave_out.setframerate(8000)
    wave_out.writeframes(str_data)

# 音频对应的波形图
def wav_waveform(wave_path):
    '''
    音频对应的波形图
    :param wave_path:  音频路径
    :return:
    '''
    file = wave.open(wave_path)
    # print('---------声音信息------------')
    # for item in enumerate(WAVE.getparams()):
    #     print(item)
    a = file.getparams().nframes  # 帧总数
    f = file.getparams().framerate  # 采样频率
    sample_time = 1 / f  # 采样点的时间间隔
    time = a / f  # 声音信号的长度
    sample_frequency, audio_sequence = wavfile.read(wave_path)
    # print(audio_sequence)  # 声音信号每一帧的“大小”
    x_seq = np.arange(0, time, sample_time)

    plt.plot(x_seq, audio_sequence, 'blue')
    plt.xlabel("time (s)")
    plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1154226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot Web MVC

文章目录 一、Spring Boot Web MVC 概念二、状态码三、其他注解四、响应操作 一、Spring Boot Web MVC 概念 Spring Web MVC 是⼀个 Web 框架,一开始就包含在Spring 框架里。 1. MVC 定义 软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视…

最新版本idea2023.2新特性,最后一点你肯定想不到哈哈

idea2023.2版本正式发布,最新的idea2023.2包含以下新特性: AI Assistant 当前具备一组由 AI 提供支持的初始功能,提供集成式 AI 聊天,可以完成一些任务,例如自动编写文档注释、建议名称、生成提交消息等。编辑器内性能…

【23真题】对不起,由于我的择校分析,这所可能会炸!

哈喽大家好,现在这个时间节点,有很多同学开始刷真题了!所以23真题系列正式启动!小马哥将全面发布23真题及详细解析! 注意太原科技大学,自我发了择校分析以后(苍天为证,我真的没有任…

水果FL Studio21.2体验版下载安装教程(增加云服务功能)

FL Cloud 音效库包含开放版权的Loop和采样,以及来自 FL Studio 著名用户的艺术家独家内容。更新后,现在还可以使用人工智能辅助母带处理和数字发行功能来制作音轨。FL Studio 由最初的 "Fruity Loops" DAW 发展而来,25 年来&#x…

RISC-V IDE MRS无感远程协助模块详解

RISC-V IDE MRS无感远程协助模块详解 一、说明 1.1 概述 针对RISC-V/ARM等内核MCU的嵌入式集成开发环境MRS(MounRiver Studio)从V1.90版本开始内置无感远程协助模块(Sensorless Remote Assistant Module,以下简称SRA模块)。SRA模块是一款支…

PowerCLI vCenter批量更改esxi主机root密码

前提条件 安装 powercli开启wmi,配置网卡,参考 PowerCLi 批量添加所有esxi到vCenter 编写通过vCenter批量更改所有esxi主机root密码自动化脚本 最终实现批量重置所有esxi 密码,无需干预。$vCenterServer = "192.168.19.254" #你的vCenter 管理中心地址更改$User= …

国外调查问卷真的能做吗?

大家好,我是橙河网络,今天聊一聊国外调查问卷真的能做吗? 国外问卷调查这个项目已经存在多年,其赚钱逻辑非常简单,即通过填写国外公司发放的商业调查问卷来获取报酬,一般都是以美元的方式结算。这些问卷可…

性能优化之AA反走样优化

反走样主要是解决采样不足导致的。一般方案选择需要兼顾画面质量与渲染效率权衡的前提下,对图像进行增强。反走样经过了第一代超级采样抗锯齿SSAA,到第二代的多重采样抗锯齿MSAA,快速近似采样FXAA,增强子像素变形抗锯齿SMAA&#…

弱网测试神器—Qnet(上)

一、APP 弱网测试背景 App 在使用的过程中,难免会遇到不同的弱网络环境,像在公车上、在地铁、地下车库等。在这种情况下,手机常常会出现网络抖动、上行或下行超时,导致 APP 应用中出现丢包延迟,从而影响用户体验。 作…

写在2023末,很庆幸自己入了软件测试这行...

为什么会学习软件测试? 已经28岁了,算一下快过去3年了,刚毕业那会工作了一年,因为自己当时很迷茫(觉得自己挺废的),所以就没去工作就一直在家,家里固定每个月给点生活费&#xff0c…

查看公司电脑里软件安装

查看公司电脑里软件安装是一项重要的任务,可以帮助管理员了解员工在工作中使用的软件情况,以及发现潜在的安全风险。 方法一:事件查看器 点击开始菜单,搜索“事件查看器” 2、点击“windows”日志,打开“应用程序”&a…

XAMPP的下载安装配置详细教程

XAMPP的下载安装配置详细教程(含拒绝访问坑) ​ xampp 话不相瞒,当初为了在XAMPP(ApacheMySQLPHPPERL)里面配置phpwind,我在卸载与安装之间来回了不下10次,但是我的phpwind始终还是安装不成功…

『OpenStack』云计算平台『Nova』计算服务学习指南

前言 本文将会讲解 OpenStack 平台计算服务组件 Nova ,结合抽象概念和简单易懂的实战操作,帮助您更好的理解 Nova 计算服务在 OpenStack 中的作用 系统配置:宿主机 Ubuntu 20.04(WSL2) 简介 OpenStack 官网链接&…

如何利用数字化系统发挥数据的最大价值?

社会日新月异,企业管理也在时刻发生着变化,数字化系统的引入,解决了企业纸质化的汇报形式,简便快捷,一切事物都是有两面性的,数字化也给企业带来了新的挑战,如何利用数字化发挥数据的最大价值&a…

【记录】使用yolov5_obb训练自己的数据集

引言 对于寻常的yolov5目标检测任务,只能检测水平或者垂直的检测框,而对于旋转框的检测却无能为力。为此,在这记录下使用yolov5_obb来训练自己数据集。 一、准备数据集 1、我们先看所需要的数据集文件什么样子,如下图文件夹Sym…

Spring Boot与Redis的完美结合:高效实现订单超时处理

redis监听超时 概述修改配置文件redis配置yml/properties配置 pom依赖配置类创建订单时设置超时时间监听类优缺点 主页传送门:📀 传送 概述 Redis支持过期监听,可以根据这个监听过期数据来进行订单的超时处理 流程如下: 修改配置文件 re…

golang的类型断言

前言:原因很简单,写的代码panic了。报错如下。为此专门看下golang的类型断言。 “[PANIC]interface conversion: interface {} is string, not float64”。 1、类型断言(assertion) 所谓“类型断言”即判断一个变量是不是某个类型的实例(简单来讲就是判…

STM32-电源管理(实现低功耗)

电源管理 STM32 HAL库对电源管理提供了完善的函数和命令。 工作模式(高功耗->低功耗):运行、睡眠、停止、待机。 若备份域电源正常供电,备份域内的RTC都可以正常运行,备份域内的寄存器的数据会被保存,不…

制作一个可以arm架构下运行的docker镜像(for Python)

看完本篇文章,你将得到一个可以arm架构下运行的python 基础镜像。 题外话 这里直接说docker镜像有点儿草率,因为目前很多容器都是Podman了。 podman的介绍 arm和aarch傻傻分不清楚 现在这两个是一样的意思了。 arm64和aarch64之间的区别 开始制作镜…

笔记48:51序列模型--课程笔记

本地笔记地址:D:\work_file\DeepLearning_Learning\03_个人笔记\3.循环神经网络\序列模型 a a a a a a a a a a a a a a a a a a 8.1. 序列模型 — 动手学深度学习 2.0.0 documentation