音频处理
处理音频数据对于从事语音分析、音乐信息检索以及多模态数据分析的机器学习工程师来说是一项基本任务。当然如果仅仅需要编辑、录制和转码音频也应该知道应当如何处理音频。
音频的基本属性
声音通过震动产生,他是一种波。它具有两个基本的属性:
- 增幅(amplitude): 也被称为响度
- 频率(frequency): 每单位时间内波震动的次数
声音本身是一种模拟信号,而为了让计算机处理就必须转换为数字信号。这个模数转换要经过两个过程:
- 采样(sampling): 即将时变连续信号
x(t)
转为离散实数序列x(n)
,两个连续离散样本之间的间隔被称为采样周期(Ts),我们又将fs = 1/Ts
称为采样频率。采样频率就是描述采样过程的基本属性。典型的采用频率是 8KHz、16KHz 和 44.1KHz,越高也意味着信号质量越好 - 量化(quantization): 即将样本序列中的每个实数
x(n)
替换为有限离散值集的近似值的过程。类似于 RGB 颜色,颜色本身是无限的,但是三原色必须分配到 256 上来合成最终的颜色。声音也是同样的道理。例如每个样本的位数是 16,这意味着具有 2^16 = 65536 个级别,因此x(n)
的范围应该在 2^-15 ~ 2^15 之间变化
处理工具
- ffmpeg: 开源项目,用于处理多媒体文件和流,已经是事实上的标准,几乎所有的媒体处理相关程序都会使用到该库
- sox: 同样的开源项目,被称为声音处理程序的瑞士军刀,尽管已经长久不更新了但是仍然被广泛使用
- audacity: 免费开源的跨平台声音编辑程序
编程语言通常都会提供对 ffmpeg 的绑定,python 中还包括:
他们都能够读取音频数据,之后如果要进行分析通常需要使用pyAudioAnalysis库,它提供了更高级的特征提取和信号分析。
最后我们还可以使用plotly来进行信号可视化。
处理音频数据
ffmpeg 中处理音频数据:
Bash
# ============== 转换音频 =================
# -i 指定要处理的媒体文件
# -f 指定要转换的目标格式(通常会根据后缀检查,并不是必须的)
# -ac 声道
# -ar 采样频率
# -ab 音频码率
ffmpeg -i test.mp4 -ac 1 -ar 16000 -ab 256k -f wav output.wav
# ============== 修剪音频 ==================
# 修剪音频从 60s 到 80s(-t 20 表示 20s 持续时间)
# 也可以是 -to 80
ffmpeg -i output.wav -ss 60 -t 20 output_small.wav
Tips
在进行音频信号处理时,第一步就是将 ar ac 等基本信息保持一致。最终的向量生成都是基于采样频率、量化的结果来构建的
声音分析
声音分析是一项具有挑战性的任务。我们不需要深入了解其中的细节。整个流程大致分为:
- 通过一种方式来获取一段音频的特征,他们最终以向量表示(numpy)
- 通过监督模型,即提供了几组特定领域的音频,如果研究音乐就是爵士、古典、说唱等,如果研究情绪就是喜、怒、哀、乐等。每种领域需要人为监督一些该类型的语音文件来进行训练
- 之后通过监督的数据来进行训练来得到一个模型
- 使用该模型来猜测未被监督的类型属于哪一个领域
目前比较流行的声音分析库有:
- pyAudioAnalysis: 音频分析库
- speech-emotion-recognition: 语音情感识别