Speech | 人工智能中关于语音务必需要了解的基础知识(信号处理)及代码
语音是指人们讲话时发出的话语,是一种人们进行信息交流的声音,是由一连串的音组成语言的声音,我们可以理解为语音(speech)=声音(acoustic)+语言(language)。
目录
0.声音的基本属性
0.1.音高(pitch)
0.2.音量(Volume)
0.3.音色(Timbre)
0.4.能量(Energy)
1.傅里叶变换(FT)
1.1.快速傅里叶变换 (FFT)
1.2.短时傅里叶变换 (STFT)
1.2.短时傅里叶逆变换 (iSTFT)
2.频谱图
3.梅尔量表
4.梅尔倒谱系数(Mel-frequency Cepstral Coefficients, MFCC)
梅尔频谱图(mel-spectrogram)
总结
关于语音研究主要可分为两个方面:语言学和语音学。
0.声音的基本属性
【8】由于语音是发声器官发出的一种声波,因而具有一定的音色、音调、音强和音长等基本特征。
- 音调:表示声音的高低,由于声波的频率决定。
- 音强:表示声音的强弱,由声波的振动幅度决定。
- 音色:即音质,是一种声音区别于另一种声音的基本特征,其与声带的振动频率、发音器官的送气方式,声道的形状尺寸等因素密切相关,是一种对各种频率、强度的声波的综合反应,
- 音长:发音时间的长短
0.1.音高(pitch)
在语音中,耳朵感知到的音调的相对高低,这取决于声带每秒产生的振动次数。音高是音调和语调(qq.v.)的主要声学相关性。
0.2.音量(Volume)
音量通常可以用振幅(Amplitude)或分贝(Decibels,dB)来表示。振幅表示声音的振动强度,而分贝则是用对数单位来表达声音的相对强度。
在语音合成中,音量的调整可以通过控制振幅或分贝来实现,以确保生成的语音在听觉上具有合适的音量水平。
0.3.音色(Timbre)
音色是声音的质地或音质,通常由声音的谐波结构和频谱特征来描述。
在语音合成中,可以使用谐波合成或者声码器参数(如倒谱系数)来表示音色。调整音色可以使得合成语音更加自然,并匹配特定的语音风格或说话者特征。
0.4.能量(Energy)
能量通常用于描述声音的强度或活力。在语音信号中,能量可以通过短时能量、功率谱等来表示。
能量的调整可以影响语音的清晰度和强度。在语音合成中,适当地调整能量可以使合成语音听起来更加生动和富有表现力。
1.傅里叶变换(FT)
频信号由几个单频声波组成。当随时间对信号进行采样时,我们只捕获由此产生的振幅。傅里叶变换是一个数学公式,它允许我们将信号分解为它的各个频率和频率的幅度。换句话说,它将信号从时域转换为频域。结果称为频谱。
因为每个信号都可以分解为一组正弦波和余弦波,这些正弦波加起来就是原始信号。这是一个非凡的定理,称为傅立叶定理。
1.1.快速傅里叶变换 (FFT)
FFT是一种可以有效计算傅里叶变换的算法,用于将信号从时域转换到频域。它是对传统傅里叶变换算法的一种改进,能够大大提高计算速度。
傅里叶变换的目的: 将一个信号从时域表示转换为频域表示,即将信号表示为不同频率分量的叠加。
FFT算法基于分治法和迭代的思想,通过将信号划分为较小的子问题,然后合并这些子问题的结果来实现傅里叶变换。主要步骤如下:
- 划分: 将输入信号划分为偶数索引和奇数索引的两部分,分别进行傅里叶变换。
- 递归: 对划分后的子问题进行递归应用FFT算法。
- 合并: 合并子问题的结果,得到整体的傅里叶变换。
从技术上讲,FFT是实现“离散傅里叶变换”(DFT)的优化算法。在一段时间内对信号进行采样,并划分为频率分量。这些分量是单个正弦频率,每个分量都有自己的幅度和相位。下图演示了此转换。在测量的时间段内,信号包含三个不同的主频率。
在第一步中,扫描一部分信号并将其存储在内存中以供进一步处理。在这种情况下,这两个参数是相关的:
- 测量系统的采样率或采样频率fs(例如48 kHz)。这是在 1 秒内获得的平均样本数(每秒样本数)。
- 选择的样本数量;块长度 BL。这始终是 FFT 中以 2 为基数的整数倍(例如,2^10 = 1024 个样本)
从两个基本参数 fs 和 BL 可以确定测量的其他参数:Bandwidth fn (= Nyquist frequency)
该值表示可由FFT确定的理论最大频率,也就是max wav value。
例如,48 kHz的采样率理论上可以确定高达24 kHz的频率分量。在模拟系统的情况下,实际可以达到的值是模拟滤波器,例如在0 kHz时。
测量持续时间 D。测量持续时间由采样率 fs 和块长度 BL 给出。
D = BL / fs。
在 fs = 48 kHz 和 BL = 1024 时,即 1024/48000 Hz = 21.33 ms
频率分辨率 df.频率分辨率是指两个测量结果之间的频率间隔。
df = fs / BL
在 fs = 48 kHz 和 BL = 1024 时,df 为 48000 Hz / 1024 = 46.88 Hz。
1.2.短时傅里叶变换 (STFT)
STFT 是信号在时间上分段,并在每个时间段内进行傅里叶变换的过程。通过这种方式,可以得到信号在时间和频率上的局部表示。
步骤:
- 将信号分帧,形成许多短时窗口。
- 对每个窗口应用傅里叶变换,得到每个窗口的频谱。
- 沿着时间轴滑动窗口,重复步骤2,直到覆盖整个信号。
# pip install torch-stft
import torch
from torch_stft import STFT
import numpy as np
import librosa
import matplotlib.pyplot as pltaudio = librosa.load(librosa.util.example_audio_file(), duration=10.0, offset=30)[0]
device = 'cpu'
filter_length = 1024
hop_length = 256
win_length = 1024 # doesn't need to be specified. if not specified, it's the same as filter_length
window = 'hann'audio = torch.FloatTensor(audio)
audio = audio.unsqueeze(0)
audio = audio.to(device)stft = STFT(filter_length=filter_length, hop_length=hop_length, win_length=win_length,window=window
).to(device)magnitude, phase = stft.transform(audio)
output = stft.inverse(magnitude, phase)
output = output.cpu().data.numpy()[..., :]
audio = audio.cpu().data.numpy()[..., :]
print(np.mean((output - audio) ** 2)) # on order of 1e-16
1.2.短时傅里叶逆变换 (iSTFT)
iSTFT(inverse short-time fourier transforms)是将经过STFT处理的频域表示恢复为时域表示的逆过程。
步骤:
- 对每个频谱进行逆傅里叶变换,得到每个窗口的时域表示。
- 将所有时域表示进行叠加,得到完整的时域信号。
如果STFT的结果表示为X(t, f),其中t是时间,f是频率,那么iSTFT可以表示为:
iSTFT的目标是重建原始信号,但在实践中,由于STFT通常使用了窗函数和重叠,因此可能存在信号重建时的失真。
为了减小这种失真,通常需要在STFT中使用适当的窗函数,并调整窗口的长度和重叠参数。
更多细节可查看【4】
2.频谱图
频谱图是一种用于可视化信号频谱的图形表示方法。它显示了信号在不同频率上的能量分布,通常以频率为横轴,以信号强度或能量为纵轴。频谱图可用于分析音频、无线通信、雷达等领域中的信号特性。
快速傅里叶变换是一个强大的工具,它允许我们分析信号的频率成分,但是如果我们信号的频率成分随时间变化怎么办?大多数音频信号(如音乐和语音)都是这种情况。这些信号被称为非周期信号。我们需要一种方法来表示这些信号的频谱,因为它们随时间变化。通过在信号的几个窗口段上执行FFT来计算多个频谱,它被称为短时傅里叶变换。 FFT是在信号的重叠窗口段上计算的,我们得到所谓的频谱图。
经过处理后生成频谱图
-
横轴(X轴):频率轴
横轴表示信号的频率范围,通常以赫兹(Hz)为单位。低频在图的左侧,高频在图的右侧。 -
纵轴(Y轴):振幅或功率
纵轴通常表示信号的振幅、功率或能量,取决于具体的应用。在一些图中,可以使用线性或对数刻度来表示振幅。 -
颜色:表示信号强度
频谱图中的颜色深浅一般用于表示信号的强度,深色通常表示较高的能量,浅色表示较低的能量。有时,也可以使用不同颜色来区分不同的信号或频带。 -
时间维度(如果有):时频图
有些频谱图还包括时间维度,形成了时频图。时频图可以显示信号在时间和频率上的变化,适用于分析非稳态信号(随时间变化的信号)。 -
窗函数和FFT(快速傅里叶变换)
在频谱图的制作过程中,通常会使用窗函数对信号进行分段,然后对每个窗口应用FFT来获取频域信息。FFT是一种计算傅里叶变换的高效算法。 -
谱线和谱带
频谱图上的谱线表示信号在不同频率上的分量,而谱带表示每个频率范围内的信号能量。
3.梅尔量表
我们可以很容易地分辨出 500 和 1000 Hz 之间的区别,但我们几乎无法分辨出 10,000 和 10,500 Hz 之间的区别,即使两对之间的距离相同。
1937年,史蒂文斯,福克曼和纽曼提出了一个音高单位,使得相等的音高距离听起来对听众来说同样遥远。这称为梅尔量表。 我们对频率执行数学运算以将它们转换为 mel 刻度。
4.梅尔倒谱系数(Mel-frequency Cepstral Coefficients, MFCC)
概念
- MFCC 是梅尔频谱图的一种紧凑的表示形式,主要用于语音识别和音频特征提取。它是梅尔频谱图上的系数,通常选择前13个或更多的系数作为特征。
处理步骤:
- 从梅尔频谱图中选择一定数量的系数,通常通过离散余弦变换(DCT)进行。
- 取对数,然后应用离散余弦变换,最终得到MFCC。
特点:
- MFCC提供了音频信号在梅尔刻度上的重要信息,同时通过DCT,使得它们更加紧凑且不相关,适用于机器学习算法的输入。
梅尔频谱图(mel-spectrogram)
梅尔频谱图是将频率转换为梅尔刻度的频谱图。
概念:
- 梅尔频谱图是对音频信号进行频域分析的一种方法。它与常规的频谱图类似,但使用了梅尔刻度(Mel scale),该刻度更符合人类听觉的感知。梅尔刻度在低频部分更密集,在高频部分更稀疏,与人类听觉对音调的感知更相符。
处理步骤:
- 将音频信号分帧,对每一帧进行傅里叶变换,得到能量谱。
- 将能量谱映射到梅尔刻度上,通常使用三角滤波器组(Mel滤波器组)来实现这一映射。
- 对每个滤波器的能量进行对数运算,得到梅尔频谱图。
特点:
- 梅尔频谱图在频域上更符合人类听觉的感知,能够更好地反映音频信号的重要特征。
- 通常使用对数尺度,使得相对较小的能量变化更加显著。
Mel-spectogram feature
机器学习的时候,每一个音频段可用对应的mel-spectogram表示,每一帧对应的某个频段即为一个feature。
实际操作中,每个音频要采用同样的长度,feature数量才是相同的。通常还要进行归一化,即每一帧的每个元素要减去该帧的平均值,以保证每一帧的均值均为0。
总结
1.音频信号处理
得到一个音频,以数字方式表示音频信号。然后使用快速傅里叶变换将音频信号从时域映射到频域,并在音频信号的重叠窗口段上执行此操作。
将y轴(频率)转换为对数刻度,将颜色维度(振幅)转换为分贝以形成频谱图。
将y轴(频率)映射到mel刻度上以形成mel频谱图。
2.MFCC和梅尔语谱图(Mel spectrogam)的区别
-
表示形式:
- 梅尔频谱图是一个矩阵,每一行表示一个频带,每一列表示一个时间窗口。
- MFCC是从梅尔频谱图中提取的系数,可以看作是对梅尔频谱的降维表示。
-
应用:
- 梅尔频谱图通常用于可视化音频信号的频域分布。
- MFCC通常用于作为语音信号的特征向量,用于语音识别等任务。
-
维度:
- 梅尔频谱图的维度与原始信号长度和频带数相关。
- MFCC通常选择前13个或更多的系数,因此维度较低,适合作为机器学习模型的输入。
参考文献
【1】 Understanding the Mel Spectrogram | by Leland Roberts | Analytics Vidhya | Medium
【2】Getting to Know the Mel Spectrogram | by Dalya Gartzman | Towards Data Science
【3】【精选】Mel spectrum梅尔频谱与MFCCs_melspectrum-CSDN博客
【4】Inverse short-time Fourier transform - MATLAB istft - MathWorks 한국
【5】 使用一维卷积计算stft与istft - 知乎 (zhihu.com)
【6】傅里叶变换@(stft和istft)-CSDN博客
【7】【精选】语音处理/语音识别基础(五)- 声音的音量,过零率,音高的计算_davidullua的博客-CSDN博客
【8】 语音基础知识(附相关实现代码) - 知乎 (zhihu.com)
【9】FFT (nti-audio.com)
相关文章:

Speech | 人工智能中关于语音务必需要了解的基础知识(信号处理)及代码
语音是指人们讲话时发出的话语,是一种人们进行信息交流的声音,是由一连串的音组成语言的声音,我们可以理解为语音(speech)声音(acoustic)语言(language)。 目录 0.声音的基本属性 0.1.音高(pitch) 0.2.音量(Volume) 0.3.音色(Timbre) 0…...
c# 单例模式实现
方式一: 在C#中,可以使用单例模式来确保一个类只有一个实例,并提供一个全局访问点。 public class Singleton {private static Singleton instance;private static readonly object lockObject new object();private Singleton(){// 私有构…...

万字长文详解Java线程池面试题
王有志,一个分享硬核 Java 技术的互金摸鱼侠 加入 Java 人的提桶跑路群:共同富裕的Java人 今天是《面霸的自我修养》第 6 篇文章,我们一起来看看面试中会问到哪些关于线程池的问题吧。数据来源: 大部分来自于各机构(J…...

【jQuery入门】链式编程、修改css、类操作和className的区别
文章目录 前言一、链式编程二、修改css2.1 获取css的值2.2 设置单个css属性2.3 设置类样式添加类移除类切换类 三、类操作与className的区别总结 前言 jQuery是一个流行的JavaScript库,广泛用于简化DOM操作和处理事件。在jQuery中,链式编程是一种强大的…...

使用的uview 微信高版本 头像昵称填写能力
<template><view><button class"cu-btn block bg-blue margin-tb-sm lg" tap"wxGetUserInfo">一键登录</button><view><!-- 提示窗示例 --><u-popup :show"show" background-color"#fff">&…...

Hadoop3完全分布式搭建
一、第一台的操作搭建 修改主机名 使用hostnamectl set-hostname 修改当前主机名 关闭防火墙和SELlinux 1,使用 systemctl stop firewalld systemctl disable firewalld 关闭防火墙 2,使用 vim /etc/selinux/config 修改为 SELINUXdisabled 使用N…...

中断——外部中断EXIT
前期疑问:中断可以分成外部中断和内部中断吗 文章目录 前言一、中断知识二、中断编程三、EXIT外部中断/事件控制器 3.1 中断事件线3.2 EXTI初始化结构体详解 四、软件设计 4.1 编程要点 五、代码回顾实现六、补充中断知识总结 前言 野火中断章节有这样一句话 【F…...

Kafka-服务端-副本机制
Kafka从0.8版本开始引入副本(Replica)的机制,其目的是为了增加Kafka集群的高可用性。 Kafka实现副本机制之后,每个分区可以有多个副本,并且会从其副本集合(Assigned Replica,AR)中选出一个副本作为Leader副本,所有的读写请求都由…...

银行数据仓库体系实践(4)--数据抽取和加载
1、ETL和ELT ETL是Extract、Transfrom、Load即抽取、转换、加载三个英文单词首字母的集合: E:抽取,从源系统(Souce)获取数据; T:转换,将源系统获取的数据进行处理加工,比如数据格式转化、数据精…...

云计算入门——Linux 命令行入门
云计算入门——Linux 命令行入门 前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。 介绍 如今,我们许多人都熟悉计算机(台式机和笔记本电…...
自然语言处理(NLP)的发展
自然语言处理的发展 随着深度学习和大数据技术的进步,自然语言处理取得了显著的进步。人们正在研究如何使计算机更好地理解和生成人类语言,以及如何应用NLP技术改善搜索引擎、语音助手、机器翻译等领域。 方向一:技术进步 自然语言处理&…...

让uniapp小程序支持多色图标icon:iconfont-tools-cli
前景: uniapp开发小程序项目时,对于iconfont多色图标无法直接支持;若将多色icon下载引入项目则必须关注包体,若将图标放在oss或者哪里管理,加载又是一个问题,因此大多采用iconfont-tools工具,但…...
丹麦公司注册优势 丹麦公司注册条件 丹麦公司注册注意事项
丹麦公司注册优势 1、开-放的商业环境,拥有公平透明的商业法律和制度。 2、简化的注册流程,无需繁琐的审批程序和复杂的材料准备。 3、全球认可的声誉,有助于提升贵公司的国际形象。 4、该国的政-府在坚持适度紧缩的财政政策,…...

C++PythonC# 三语言OpenCV从零开发(4):视频流读取
文章目录 相关链接视频流读取CCSharpPython 总结 相关链接 C&Python&Csharp in OpenCV 专栏 【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程(附带课程课件资料课件笔记) OpenCV 教程中文文档|OpenCV中文 OpenCV教程中文文档|W3Csc…...

vue element MessageBox.prompt this.$prompt组件禁止显示右上角关闭按钮,取消按钮,及点击遮罩层关闭
vue element MessageBox.prompt this.$prompt组件禁止或取消显示右上角关闭按钮,取消按钮,及点击遮罩层关闭 实现效果: 实现代码 MessageBox.prompt(请先完成手机号绑定, 系统提示, {confirmButtonText: 提 交,showClose: false,closeOnClic…...
Oracle 日常健康脚本
文章目录 摘要常用脚本 摘要 保持 Oracle 数据库的良好健康状况对于系统的可靠性和性能至关重要。本文将介绍一些常用的 Oracle 日常健康脚本,帮助您监控数据库并及时识别潜在的问题,以保证数据库的稳定运行。 常用脚本 1.查询数据库实例和实例级别的…...
leetcode670最大交换
给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。 示例 1 : 输入: 2736 输出: 7236 解释: 交换数字2和数字7。 示例 2 : 输入: 9973 输出: 9973 解释: 不需要交换。 注意: 给定数字的范围是 [0, 108] int maximumSwap(int num) {…...
XML 注入漏洞原理以及修复方法
漏洞名称:XML注入 漏洞描述:可扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具 有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XM…...

x-cmd pkg | dasel - JSON、YAML、TOML、XML、CSV 数据的查询和修改工具
目录 简介首次用户快速实验指南基本功能性能特点竞品进一步探索 简介 dasel,是数据(data)和 选择器(selector)的简写,该工具使用选择器查询和修改数据结构。 支持 JSON,YAML,TOML&…...
Oracle 19c RAC集群管理 ---------关键参数以及常用命令
Oracle 19c RAC集群管理 ---------关键参数 Oracle 19C RAC 参数最佳实践 --开启强制归档 ALTER DATABASE FORCE LOGGING; --设置 30分钟 强制归档 ALTER SYSTEM SET ARCHIVE_LAG_TARGET1800 SCOPEBOTH SID*; --设置期望undo保持时间3h ALTER SYSTEM SET UNDO_RETENTION21600…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...