音频处理

滤波分析
效果与操作
Wolfram 语言为参数式和交互式音频处理提供内置支持,并完全与 Wolfram 语言强大的数学和算法能力相集成. 通过应用线性和非线性滤波器,添加效果,使用特定的音频函数分析处理音频对象或通过与其他 Wolfram 语言相集成来拓展对音频对象的处理.
滤波
音频信号可用作许多信号处理函数的输入.
LowpassFilter[audio,ωc]
对音频应用具有截止频率 ωc 的低通滤波器
HighpassFilter[audio,ωc]
对音频应用具有截止频率 ωc 的高通滤波器
WienerFilter[audio,r]
对音频应用 r 样本范围的维纳滤波器
MeanFilter[audio,r]
对音频应用 r 样本范围的均值滤波器
TotalVariationFilter[audio]
对音频应用全变差滤波器
GaussianFilter[audio, r]
对音频应用 r 样本范围的高斯滤波器
可以直接应用到音频对象的滤波器.
Wolfram 语言中的许多滤波函数可直接用于音频对象. 在许多情况下,可以指定截止频率作为一个频率 Quantity.
FIR 滤波器应用于一个音频对象:
Wolfram Language code: a = ExampleData[{"Audio", "Apollo11ReturnSafely"}, "Audio"]
Wolfram Language code: lp = LowpassFilter[a, Quantity[800, "Hertz"], 101]
Wolfram Language code: hp = HighpassFilter[a, Quantity[1600, "Hertz"], 101]
Wolfram Language code: bs = BandstopFilter[a, {Quantity[800, "Hertz"], Quantity[1600, "Hertz"]}, 91]
绘制原始的和处理过的信号的功率谱图:
Wolfram Language code: Periodogram[{a, bs, lp, hp}, 2000, PlotRange -> {{0, 3000}, Automatic}, Frame -> True, ImageSize -> Medium, PlotLegends -> {"Original", "Bandstop", "Lowpass", "Highpass"}]
使用 WienerFilter 对录音除燥:
Wolfram Language code: a = ExampleData[{"Audio", "Apollo11ReturnSafely"}, "Audio"]
Wolfram Language code: WienerFilter[a, 25]
Wolfram Language code: Spectrogram[#, ImageSize -> Small, FrameTicks -> None]& /@ {a, %}
离散时间传递函数模型可以使用 RecurrenceFilter 滤波音频对象.
RecurrenceFilter[tf,audio]
使用由 TransferFunctionModel tf 定义的离散时间滤波
BiquadraticFilterModel[{"type",spec}]
创建给定 {"type",spec} 的二次滤波器
ButterworthFilterModel[{"type",spec}]
创建给定 {"type",spec} 的巴特沃斯滤波器
TransferFunctionModel[m,s]
表示带有复变量 s 的传递函数矩阵 m 的模型
ToDiscreteTimeModel[lsys,τ]
给出连续时间系统模型 lsys 的离散时间近似,其中采样周期为 τ
一些可用的滤波器模型和其他实用程序.
使用模拟(连续时间)滤波器模型的一个最简单方法是用 ToDiscreteTimeModel 离散化传递函数并用 RecurrenceFilter 把结果应用到音频对象.
将谐振二次滤波器应用到音频对象:
Wolfram Language code: filterModel = BiquadraticFilterModel[{ω, q}]
Wolfram Language code: discreteFilter = ToDiscreteTimeModel[filterModel, 1 / 22050, z, Method -> {"BilinearTransform", "CriticalFrequency" -> ω}]
Wolfram Language code: a = \!\(\*AudioBox["![Embedded Audio Player](audio://content-1323j)"]\);
Wolfram Language code: RecurrenceFilter[discreteFilter /. {ω -> 1000 2 Pi, q -> 7}, a]
可使用 TransferFunctionModel 创建离散传递函数并用 RecurrenceFilter 应用于音频对象.
使用 TransferFunctionModel 定义梳妆滤波器并应用于音频对象:
Wolfram Language code: combFilterModel[f_, α_, sr : _ : 22050] := TransferFunctionModel[{{1 / ( 1 - α z^-Round[sr / f])}}, z, SamplingPeriod -> (1/sr)]
Wolfram Language code: combFilterModel[150, α]
Wolfram Language code: RecurrenceFilter[combFilterModel[150, -.9], a]
效果与操作
可以使用内置或用户定义的函数修改和操作音频对象.
AudioTimeStretch[audio,r]
通过指定的因子 r 对音频进行时间拉伸
AudioPitchShift[audio,r]
通过指定的因子 r 对音频进行音调移位
AudioReverb[audio]
对音频应用混响效果
AudioDelay[audio,delay]
用延迟时间 delay 对音频应用延迟效果
AudioChannelMix[audio,desttype]
把音频通道混合到指定的 desttype
一些常用的音频效果.
使用音高移位和时间拉伸独立地修改音频信号的音高和持续时间.
减慢音频对象:
Wolfram Language code: a = ExampleData[{"Audio", "MaleVoice"}, "Audio"]
Wolfram Language code: AudioTimeStretch[a, 1.5]
把音频对象的音高调高:
Wolfram Language code: AudioPitchShift[a, Quantity[2, IndependentUnit["semitones"]]]
延迟和混响效果可用于浸入虚拟环境的录音中或产生特殊的效果.
应用延迟或混响效果:
Wolfram Language code: AudioDelay[a, .7, .8, .4, PaddingSize -> 2]
Wolfram Language code: AudioTrim[AudioReverb[a, ExampleData[{"Audio", "IRStMarysChurch"}]], 10]
通过对一串噪声增加带有高反馈值的短延迟执行 Karplus–Strong 合成. 这将模拟振弦的声音:
Wolfram Language code: freq = 60; feedback = 0.99; AudioDelay[AudioGenerator["Pink", .01], 1 / freq, feedback, 1, PaddingSize -> 5, Method -> {"LowpassCutoff" -> Quantity[8000, "Hertz"]}]
可使用 AudioChannelMix 获取任意通道数下混合与上混合.
下混合与上混合多通道音频对象:
Wolfram Language code: a//AudioChannels
Wolfram Language code: AudioChannelMix[a, "Mono"]//AudioChannels
Wolfram Language code: AudioChannelMix[a, 3]//AudioChannels
通过可在 Audio 对象上执行算术运算的优势可能可以改变录音. 所有带有属性 NumericFunction 或 Listable 的 Wolfram 语言的算符和函数可以重载以便处理音频对象.
使用 Tanh 函数平滑音频对象的失真:
Wolfram Language code: a = AudioNormalize[Import["ExampleData/Rule30.wav"]]
Wolfram Language code: Tanh[5a]
使用 ChebyshevT 函数获取“波形整形器”效果:
Wolfram Language code: ChebyshevT[10, a]
用正弦波乘以音频对象获取“环调制器” 效果:
Wolfram Language code: a×\!\(\*AudioBox["![Embedded Audio Player](audio://content-71fn6)"]\)
分析

整体信号的分析

录音上全局和局部可被计算的属性.
AudioMeasurements[audio,"prop"]
对整个 audio 计算属性 "prop"
计算全局度量的一些功能.
时域和频域属性可以用 AudioMeasurements 度量. 在音频对象的通道上的平均样本值上计算属性.
计算录音的时域属性:
Wolfram Language code: AudioMeasurements[ExampleData[{"Audio", "Drums"}], {"MinMax", "Mean", "StandardDeviation", "RMSAmplitude", "ZeroCrossings"}, "Dataset"]
计算录音的频域属性:
Wolfram Language code: AudioMeasurements[ExampleData[{"Audio", "Drums"}], {"SpectralCentroid", "SpectralFlatness", "SpectralRollOff", "SpectralSpread"}, "Dataset"]
通过直接应用内置统计函数计算其他度量.
计算音频对象的矩和熵:
Wolfram Language code: a = AudioGenerator["Sin"];
Wolfram Language code: Moment[a, 2]
Wolfram Language code: Entropy[a]
不像 AudioMeasurements,重载的函数被应用于数据的展平版本. 如果输入是多通道音频对象,所有通道的样本值会在单个数组中被展平.
计算录音的统计属性:
Wolfram Language code: AssociationThread[{"MinMax", "Mean", "StandardDeviation", "RMSAmplitude", "ZeroCrossings"} -> Through[{MinMax, Mean, StandardDeviation, Sqrt@Mean[# ^ 2]&, Total@CrossingDetect[#, CornerNeighbors -> None]&}@ExampleData[{"Audio", "Drums"}]] ]//Dataset

部分信号分析

除了音频对象的全局属性,还可以局部计算度量.
AudioLocalMeasurements[audio,"prop"]
局部计算 audio 部分的属性 "prop"
AudioIntervals[audio,crit]
求当满足标准 crit 的 audio 区间
计算局部度量的一些功能.
在 AudioLocalMeasurements 中,局部计算属性. 按 PartitionGranularity 规范划分信号,然后在每个分区上计算要求的属性. 结果以 TimeSeries 形式返回,其时间戳对应于每个分区的中心时间.
计算 40 ms 分区上的 RMS 幅度,其中,补偿为 1 ms:
Wolfram Language code: a = \!\(\*AudioBox["![Embedded Audio Player](audio://content-v3fc5)"]\);res = AudioLocalMeasurements[a, "RMSAmplitude", PartitionGranularity -> {Quantity[40, "Milliseconds"], Quantity[1, "Milliseconds"]}]; Show[AudioPlot[a], ListLinePlot[res, PlotStyle -> Red]]
AudioLocalMeasurements 或 AudioMeasurements 的结果可用于 Wolfram 语言中其他函数的输入.
使用 "SpectralCentroid" 和 "SpectralSpread" 度量找到列表中类似音频对象的聚类:
Wolfram Language code: samples = {\!\(\*AudioBox["![Embedded Audio Player](audio://content-ewxls)"]\), \!\(\*AudioBox["![Embedded Audio Player](audio://content-gcjdl)"]\), \!\(\*AudioBox["![Embedded Audio Player](audio://content-fytkk)"]\), \!\(\*AudioBox["![Embedded Audio Player](audio://content-dkdtd)"]\), \!\(\*AudioBox["![Embedded Audio Player](audio://content-pqo5r)"]\), \!\(\*AudioBox["![Embedded Audio Player](audio://content-1iwl9)"]\), \!\(\*AudioBox["![Embedded Audio Player](audio://content-7qywt)"]\), \!\(\*AudioBox["![Embedded Audio Player](audio://content-nldr6)"]\), \!\(\*AudioBox["![Embedded Audio Player](audio://content-xc09e)"]\)}; props = AudioMeasurements[#, {"SpectralCentroid", "SpectralSpread"}, "List"]& /@ samples; clusters = FindClusters[props -> props]
Wolfram Language code: ListPlot[Partition[props, 1], PlotMarkers -> samples, ImageSize -> 300, Prolog -> ({Opacity[.3, RGBColor[1, 0.5, 0.5]], Disk[Mean@#, 400]& /@ clusters}), PlotRange -> {{00, 4000}, {0, 4000}}, AspectRatio -> 1]
使用 MFCC 度量作为特征计算 ExampleData["Audio"] 集合中各元素间的距离c:
Wolfram Language code: list = Select[ExampleData["Audio"], ExampleData[#, "Duration"] < 10&]; a = ConformAudio[AudioNormalize@AudioChannelMix[#, 1]& /@ ExampleData[#, "Audio"]& /@ list, SampleRate -> 11025];
Wolfram Language code: mfcc = AudioLocalMeasurements[#, "MFCC", PartitionGranularity -> {.05, .01}]["Values"]& /@ a;
Wolfram Language code: ticks = Thread[{Range[Length@list], Text /@ list[[All, 2]]}];MatrixPlot[DistanceMatrix[mfcc], ImageSize -> Medium, FrameTicks -> {ticks, Apply[Rotate[#, Pi / 2]&, ticks, {2}]}]
使用 AudioIntervals 允许提取满足用户定义标准的区间.
定位录音中的非声音部分:
Wolfram Language code: a = ExampleData[{"Audio", "NoisyTalk"}, "Audio"]; nonVoicedIntervals = AudioIntervals[a, #RMSAmplitude < .02 && #SpectralFlatness > .0001&, .1, PartitionGranularity -> {.06, .01}]
Wolfram Language code: AudioPlot[a, Epilog -> {RGBColor[1, 0, 0, .3], Rectangle[{#[[1]], -1}, {#[[2]], 1}]& /@ nonVoicedIntervals}, ImageSize -> Medium]

高级分析

可以使用基于神经网络的函数来更深入地了解信号的内容.
SpeechRecognize[audio]
识别 audio 中的音频并以字符串形式返回
PitchRecognize[audio]
识别 audio 中主要音调
AudioIdentify[audio]
识别录制的是哪个 audio
基于神经网络的某些功能.
执行高级音频分析:
Wolfram Language code: a = SpeechSynthesize["hello i am a computer"]
Wolfram Language code: SpeechRecognize[a]
Wolfram Language code: PitchRecognize[a]//ListLinePlot
Wolfram Language code: AudioIdentify[a]
所有机器学习功能都知道 Audio 对象并从语义上重要特征提取开始执行它们的计算.
Classify[{audio1class1,audio2class2,…}]
生成一个在给定范例和类上训练的 ClassifierFunction[…]
FeatureExtraction[{audio1,audio2,…}]
生成一个在给定范例上训练的 FeatureExtractorFunction[…]
FeatureSpacePlot[{audio1,audio2,…}]
用散点图绘制 audioi 上的特征提取
高级机器学习的某些函数.
该预处理转换每个固定大小向量的音频对象,使之可以被容易比较.
分类一个小的乐器声音的数据集:
Wolfram Language code: data = Join@@Table[Thread[WebAudioSearch[instr, "Samples", Sequence[Slot["Duration"] < 5&, MaxItems -> 40]] -> instr], {instr, {"acoustic guitar", "drums", "trumpet"}}]; {train, test} = TakeDrop[RandomSample[data], 90];
Wolfram Language code: cl = Classify[train]
Wolfram Language code: ClassifierMeasurements[cl, test, "Report"]
绘制使用 FeatureSpacePlot 收集的音频特征.
用 FeatureSpacePlot 在有语义意义的空间绘制信号列表:
Wolfram Language code: FeatureSpacePlot[ExampleData[#] -> #[[2]]& /@ ExampleData["Audio"], LabelingFunction -> Callout]

神经网络

Audio 对象紧密集成在强大的神经网络框架中. NetEncoder 为各种高级构造(如 Audio 对象)提供了一个简单的神经网络入口点.
"Audio"
将信号编码为波形
"AudioSpectrogram"
将信号编码为频谱
"AudioMFCC"
将信号编码为梅尔频谱
音频 NetEncoder 的一些范例.
不同的编码器可用于计算不同的特征. 一些维护原始信号的所有信息(比如 "Audio" 和 "AudioSTFT"),另一些在放弃某些信息但是大幅减小维度(比如 "AudioMFCC")之间提供折衷.
使用不同编码器可视化计算的特征:
Wolfram Language code: a = ExampleData[{"Audio", "Bird"}, "Audio"]
Wolfram Language code: Labeled[ListLinePlot[First@Transpose@Normal[NetEncoder["Audio"][a]]], "Audio"]
Wolfram Language code: Labeled[MatrixPlot[Log@Transpose@Normal[NetEncoder["AudioSpectrogram"][a]], DataReversed -> {True, False}], "AudioSpectrogram"]
Wolfram Language code: Labeled[MatrixPlot[Transpose@Normal[NetEncoder["AudioMFCC"][a]], DataReversed -> {True, False}], "AudioMFCC"]
使用编码器,可以轻松地从头开始训练网络,以解决与音频相关的任务,并生成性能测量结果.
NetTrain[net,data]
在数据集 data 上训练网络 net
NetChain[{layer1,layer2,…}]
指定一个 layeri 输出连接到 layeri+1 输入的网络
NetMeasurements[net,data,measurement]
为在 data 上计算的 net 计算请求的 measurement
一些神经网络函数.
使用 NetChain 和 NetGraph 创建任意拓扑的网络,并利用序列聚焦的层(如 GatedRecurrentLayer 和 LongShortTermMemoryLayer )来分析可变长度信号.
训练网络分类语音数字从 0 到 9:
Wolfram Language code: net = NetChain[{GatedRecurrentLayer[64], GatedRecurrentLayer[64], GatedRecurrentLayer[10], AggregationLayer[Mean, 1], SoftmaxLayer[]}, "Input" -> NetEncoder["AudioMFCC"], "Output" -> NetDecoder[{"Class", Range[0, 9]}]]
Wolfram Language code: trainedNet = NetTrain[net, ResourceData["Spoken Digit Commands"], ValidationSet -> Scaled[.05]]
Wolfram Language code: NetMeasurements[trainedNet, ResourceData["Spoken Digit Commands", "TestDataset"], {"Accuracy", "ConfusionMatrixPlot"}]