python判定固定时长固定频率的音频是否连续

这篇具有很好参考价值的文章主要介绍了python判定固定时长固定频率的音频是否连续。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我有一段时长大约为3.34 s 频率为1khz 的连续音频。该音频输入一个设备,经转换输出后,我想判断该音频是否还连续。
好了,这就是我的需求,看起来比较棘手,但我们稍稍了解音频采样率,码流,音频格式,通道的相关概念后,我们就可以用强大的python很快解决此问题。
关于音频的相关概念,请参考以下文章:

音频(一):时域图、 频谱图 Spectrum、 功率谱
https://blog.csdn.net/chumingqian/article/details/122947421
正弦形函数
https://baike.baidu.com/item/%E6%AD%A3%E5%BC%A6%E5%9E%8B%E5%87%BD%E6%95%B0/898409?fr=aladdin
音频处理库—librosa的安装与使用
https://blog.csdn.net/zzc15806/article/details/79603994/
Python绘制语音信号的波形图、频谱图和语谱图
https://zhuanlan.zhihu.com/p/371394137
ffmpeg基础流程:音频处理
https://blog.csdn.net/weixin_43907175/article/details/121595588
FFmpeg的音频处理详解
https://blog.csdn.net/fireroll/article/details/83032025

好了,基本概念已经确定,我接下来阐述我的判定音频是否连续的方法。
具体步骤就是求出音频的时域图,就是音频的强度相对于时间的图像。
由于我们的音频的频率是固定的,我们还可以求出频域图,很有趣的几张图像。
声波其实就是一种机械波,那么我们画出的时域图其实就是一种正弦波。
那么判断音频是否连续的方法就是对时域图积分,以标准音频的积分值为基准。若测试音频的时域图的积分值小于以上基准值,那么就是不连续的,即该声波的中间有空白出现。但是对标准音频的时域图积分的结果肯定是0,因为正弦图正负抵消,这就无法作为判定标准。
于是,我们可以取时域图的绝对值图像,求该绝对值图像的积分值,以此为基准值。
若测试音频的时域图的绝对值图像积分后小于该基准值,那么就可以判定该测试音频中间有断掉的。
我们提供的音频的格式如下:
Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 44100 Hz, stereo, s16p, 320 kb/s
采样率为44.1KHz,双声道,音频频率固定为1KHz。
以下为我画出的该音频的时域图,频域图,对数图。

求完绝对值后的时域图。
python判定固定时长固定频率的音频是否连续
未求绝对值的原始时域图。
python判定固定时长固定频率的音频是否连续python判定固定时长固定频率的音频是否连续

python判定固定时长固定频率的音频是否连续
我的代码如下:

# - * - coding: utf-8 - * -
import librosa  #Librosa是一个用于音频、音乐分析、处理的python工具包,一些常见的时频处理、特征提取、绘制声音图形等功能应有尽有,功能十分强大它是一个Python模块,通常用于分析音频信号,但更倾向于音乐。它包括用于构建MIR(音乐信息检索)系统的nuts 和 bolts
import librosa.display
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft

plt.figure(dpi=200) # 将显示的所有图分辨率调高
matplotlib.rc("font",family='SimHei') # 显示中文
matplotlib.rcParams['axes.unicode_minus']=False # 显示符号


def displayWaveform(): # 显示语音时域波形
    """
    display waveform of a given speech sample
    :param sample_name: speech sample name
    :param fs: sample frequency
    :return:
    """
    samples, sr = librosa.load('reslut_audio.mp3', sr=44100)    #sr 是采样率,单位是HZ,代表每秒对声音的采样数  samples 是总的样本数量,为时长(s)*采样率
    #这会将音频时间序列作为numpy数组返回,默认采样率(sr)为22KHZ mono。我们可以通过以下方式更改此行为: librosa.load(audio_path, sr=44100)
    #以44.1KHz重新采样,或禁用重新采样。采样率是每秒传输的音频样本数,以Hz或kHz为单位。librosa.load(audio_path, sr=None)
    # samples = samples[6000:16000]
    #samples=np.abs(samples)
    print(f"总样本数量:  {len(samples)}, 采样率(Hz):{sr}")
    time = np.arange(0, len(samples)) * (1.0 / sr)  # 求出各个时间点,即各个采样点所对应的时间点,采样率为44100,总样本数量是147294,音频时长3.34s,那么time列表就是在(0 , 3.34) 内有147294 个值,对应每个采样点所处的时间点
    print(f"time 时间点数量:  {len(time)}")
    print(f"音频时长(s): {len(samples)/sr}")
    print(f"打印samples: {samples}")
    print(f"对时域波形图进行积分: {sum(samples)/sr}")
    plt.plot(time, samples)
    plt.title("语音信号时域波形")
    plt.xlabel("时长(秒)")
    plt.ylabel("振幅")

    # plt.savefig("your dir\语音信号时域波形图", dpi=600)
    plt.show()

def displaySpectrum(): # 显示语音频域谱线
    samples, sr = librosa.load('reslut_audio.mp3', sr=16000)
    print(len(samples))
    # ft = librosa.stft(samples)
    # magnitude = np.abs(ft)  # 对fft的结果直接取模(取绝对值),得到幅度magnitude
    # frequency = np.angle(ft)  # (0, 16000, 121632)

    ft = fft(samples)
    print(len(ft), type(ft), np.max(ft), np.min(ft))
    magnitude = np.absolute(ft)  # 对fft的结果直接取模(取绝对值),得到幅度magnitude
    #print(magnitude)
    frequency = np.linspace(0, sr, len(magnitude))  # (0, 16000, 121632)
    #print(frequency)
    print(len(magnitude), type(magnitude), np.max(magnitude), np.min(magnitude))
    print(len(frequency), type(frequency), np.max(frequency), np.min(frequency))

    # plot spectrum,限定[:40000]
    # plt.figure(figsize=(18, 8))
    plt.plot(frequency[:40000], magnitude[:40000])  # magnitude spectrum
    plt.title("语音信号频域谱线")
    plt.xlabel("频率(赫兹)")
    plt.ylabel("幅度")
    plt.savefig("your dir语音信号频谱图", dpi=600)
    plt.show()

    # # plot spectrum,不限定 [对称]
    # plt.figure(figsize=(18, 8))
    # plt.plot(frequency, magnitude)  # magnitude spectrum
    # plt.title("语音信号频域谱线")
    # plt.xlabel("频率(赫兹)")
    # plt.ylabel("幅度")
    # plt.show()


def displaySpectrogram():
    samples, sr = librosa.load('reslut_audio.mp3', sr=16000)

    # compute power spectrogram with stft(short-time fourier transform):
    # 基于stft,计算power spectrogram
    spectrogram = librosa.amplitude_to_db(librosa.stft(samples))

    # show
    librosa.display.specshow(spectrogram, y_axis='log')
    plt.colorbar(format='%+2.0f dB')
    plt.title('语音信号对数谱图')
    plt.xlabel('时长(秒)')
    plt.ylabel('频率(赫兹)')
    plt.show()


if __name__ == '__main__':
    displayWaveform()
    displaySpectrum()
    displaySpectrogram()

以下为打印结果:
总样本数量: 147294, 采样率(Hz):44100
time 时间点数量: 147294
音频时长(s): 3.34
打印samples: [0. 0. 0. … 0.80444336 0.8369751 0.60565186]
对时域波形图进行积分: 1.9839639683591535
python判定固定时长固定频率的音频是否连续

检测音频是否连续的可以用displayWaveform()方法进行判断。
我们对该音频绝对值时域图积分后的值为:
对时域波形图进行积分: 1.9839639683591535

那么待检测音频的积分值若小于该值,1.9839639683591535,就说明该音频是不连续的

附录:
关于本案例定积分的推导步骤如下:
python判定固定时长固定频率的音频是否连续文章来源地址https://www.toymoban.com/news/detail-401555.html

到了这里,关于python判定固定时长固定频率的音频是否连续的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python-opencv实现目标检测定位:判断固定颜色物体是否在规定区域内

    主要实现实时检测视频或者摄像头中出现的固定颜色(本例中使用绿色)是否在规定的区域范围内,并将结果反馈到原视频上。 实现的效果如下图所示: 1、当绿色物体出现在屏幕中的黑框中时,在视频左上角反馈一个“True”的信息。 2、当绿色物体出现在屏幕中但没有完全

    2024年01月17日
    浏览(30)
  • js获取音频时长

    上传音频文件时,需要将音频时长一起上传,纯 JavaScript 获取音频时长:使用 HTML5 的 Audio 对象和 duration 属性 来源 来源

    2024年02月03日
    浏览(31)
  • leetcode 面试题 判定是否互为字符重排

    🌟 leetcode链接:判定是否互为字符重排 思路: 两个字符串的每个字母和数量都相等。那么 s2 一定可以排成 s1 字符串。 代码:

    2024年02月16日
    浏览(23)
  • 【Unity】判定Layer是否在LayerMask中

    Layer一共有32层,是因为使用了int32表示:0000 0000 0000 0000 0000 0000 0000 0000 LayerMask勾选了第几个层级,就将右向左数的第n位的0改为1。 举例:LayerMask勾选了层级1、层级4和层级6:0000 0000 0000 0000 0000 0000 0011 0010 获取GameObject上的layer时,得到的是层级的标号,层级1对应着数字1。 所

    2024年02月15日
    浏览(22)
  • LeetCode 面试题 01.01. 判定字符是否唯一

      实现一个算法,确定一个字符串 s 的所有字符是否全都不同,点击此处跳转。 示例 1: 输入: s = “leetcode” 输出: false 示例 2: 输入: s = “abc” 输出: true 限制: 0 = len(s) = 100 s[i] 仅包含小写字母 如果你不使用额外的数据结构,会很加分。   使用数组记录出现次数,时

    2024年02月12日
    浏览(24)
  • JVM中判定对象是否回收的的方法

    引用计数法是一种垃圾回收(Garbage Collection)算法,用于自动管理内存中的对象。在引用计数法中,每个对象都有一个关联的引用计数器,用于记录对该对象的引用数量。 当一个新的引用指向对象时,该对象的引用计数器加1;当一个引用不再指向对象时,对象的引用计数器

    2024年02月12日
    浏览(32)
  • LeetCode 面试题 01.02. 判定是否互为字符重排

    ​   给定两个由小写字母组成的字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串,点击此处跳转。 示例 1: 输入: s1 = “abc”, s2 = “bca” 输出: true 示例 2: 输入: s1 = “abc”, s2 = “bad” 输出: false 说明: 0 = len(s1) = 100 0

    2024年02月12日
    浏览(26)
  • JVM 判定对象是否死亡的两种方式

    引用计数法:(脑门刻字法)和 可达性分析 引用计数算法 引用计数器的算法是这样的:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。 实现简单,效率很高,

    2024年02月11日
    浏览(29)
  • 判定给定的字符序列是否为回文【数据结构】【栈】

    回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。写一个算法判定给定的字符序列是否为回文。(提示:将一半字符入栈)。 输出结果:    主要算法:    完整代码:             

    2024年02月07日
    浏览(27)
  • java获取一段音频/mp3的时长

    引言 在日常开发中,经常会遇到产品经理提出一个需求“上传音乐/音频”,而且还得显示出音频的播放时长。那我们直接世界上最简单的实现方案,必须是最简单,多一句啰嗦不准点赞。 How to do 1.提前引入包 2.逻辑实现

    2024年01月25日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包