山野莽夫

  • 归档
    • 随笔
    • 建站资源
    • 分享
    • 代码
  • 地球物理学
    • 专业课
    • 概念解释
  • 计算机
  • 互联网
  • 教程
  • 规划
  • 实验室
    • 珍藏的软件
    • 贴吧云签到
    • A1账号自助申请
山野莽夫
小学生的挣扎的点点滴滴
  1. 首页
  2. 代码
  3. 正文

python按固定采样点个数分割wav格式音频

2020年11月29日 3916点热度 0人点赞 0条评论

最近开始做实验需要绘制音频的语谱图,绘制语谱图的过程中需要FFT过程,FFT需要采样点个数是2的整数倍,所以为了生成语谱图的大小合适,那么总长65536是个比较合适的数,对于采样率32kHz的wav音频,2S时常正好是64000个采样点,(这里都是按一个声道来说的)所以我们不能按照时常来截取音频,可能采样点个数不太准确,但是网上都是使用ffmpeg或者其他方式裁剪音频的,都是以时间为单位,所以这不是太合适,于是我使用查了差资料使用python简单的写了个小程序,用于按固定采样点个数分割wav格式音频。

直接放代码,不多说了

import wave
import numpy as np


def cut(input_path, out_put, cut_length):
    # 打开wav文件 ,open返回一个的是一个Wave_read类的实例,通过调用它的方法读取WAV文件的格式和数据。
    f = wave.open(input_path, "rb")

    # 读取格式信息
    # 一次性返回所有的WAV文件的格式信息,它返回的是一个组元(tuple):声道数, 量化位数(byte单位), 采样频率, 采样点数, 压缩类型, 压缩类型的描述。wave模块只支持非压缩的数据,因此可以忽略最后两个信息
    params = f.getparams()

    nchannels, sampwidth, framerate, nframes = params[:4]

    print("你要分割的音频所有参数参数为:")
    print("通道数:%d,量化位数:%d,采样频率:%d,帧数(采样点数):%d" % (nchannels, sampwidth*8, framerate, nframes))

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

    # 将波形数据转换成数组
    # 需要根据声道数和量化单位,将读取的二进制数据转换为一个可以计算的数组
    wave_data = np.frombuffer(str_data, dtype=np.int16)
    # print(wave_data.shape)

    # 将wave_data数组改为2列,行数自动匹配。在修改shape的属性时,需使得数组的总长度不变。
    wave_data.shape = -1, nchannels
    # wave_data.shape = 2, -1 # 这种情况要先转置
    # print(wave_data)
    # 转置数据
    wave_data = wave_data.T
    # print(wave_data)

    # 切割帧数
    # cut_length = 10*framerate
    print("切割的固定长度为:%d" % cut_length)

    i = 1
    for num in range(0, nframes//cut_length*cut_length, cut_length):  # 保证每一段够长,不够长舍掉
        print(num)
        # 切片
        now_wave_data = wave_data[:, num:num+cut_length]  # 切片不包括后端点
        print(now_wave_data.shape)
        # 打开WAV文档
        f = wave.open(out_put+str(i)+".wav", "wb")
        # 配置声道数、量化位数和取样频率
        f.setnchannels(nchannels)
        f.setsampwidth(sampwidth)
        f.setframerate(framerate)
        # 将wav_data转换为二进制数据写入文件
        f.writeframes(now_wave_data.tobytes())
        f.close()
        # f = wave.open(out_put, "rb")
        f = wave.open(out_put+str(i)+".wav", "rb")
        params = f.getparams()
        print(params[:4])
        f.close()
        i += 1

如何使用呢,这儿放一点调用代码

from audio_cut import *
input_path = ""
output_path = ""
cut(input_path, output_path, 16000)

至于如何批量调用,当然是写个循环就行了,这个大家都会,就不赘述了。

各位有问题可以再在下方留言

标签: python wav 音频
最后更新:2020年11月29日

小菜菜

菜鸟

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据。

联系方式

QQ群 | TG群 | 邮箱

最新 热点 随机
最新 热点 随机
Azure Student 微软云 学生订阅 免费12个月用量避坑注意点集合 MP3音频文件格式详细解析 python按固定采样点个数分割wav格式音频 愉快使用谷歌免费人工智能平台colab,训练你的神经网络模型,为你的学术生活添砖加瓦 华为云版轻量应用服务器-云耀云服务器简单体验评测 Cloudflare 免费CDN自定义节点ip之自选cloudflare 高速节点ip工具分享
Telegram windows 版多个账号同时登陆 阿里云云翼计划学生机轻量应用服务器测评和使用 Cloudflare 免费CDN自定义节点ip之自选cloudflare 高速节点ip工具分享 u盘安装centos镜像位置设置 实验一 基本地震学理论(谐波) 扁平化ppt模板-3
标签聚合
地震学程序 宝塔面板 虚拟机 onedrive c语言 wordpress 模板 ppt
最近评论
小菜菜 发布于 7 个月前(11月24日) 这玩意已经废了,成收割工具了,不能再用了。
eamon 发布于 7 个月前(11月07日) 我一年不用了才发现这个休眠管理费每月15,一共扣了我135元,然后我消费还消费不了,我宁愿消费掉也不...
magic 发布于 12 个月前(07月03日) 请问账号不注销会有什么影响吗?
magic 发布于 12 个月前(07月01日) 我想问一下 如果不注销账号就留着会怎么样
qwp6601 发布于 1 年前(06月04日) 有没有方法改为bing

COPYRIGHT © 2021 shanyemangfu.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

蜀ICP备15031791号-2