音频处理
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.
a = ExampleData[{"Audio", "Apollo11ReturnSafely"}, "Audio"]lp = LowpassFilter[a, Quantity[800, "Hertz"], 101]hp = HighpassFilter[a, Quantity[1600, "Hertz"], 101]bs = BandstopFilter[a, {Quantity[800, "Hertz"], Quantity[1600, "Hertz"]}, 91]Periodogram[{a, bs, lp, hp}, 2000, PlotRange -> {{0, 3000}, Automatic}, Frame -> True, ImageSize -> Medium, PlotLegends -> {"Original", "Bandstop", "Lowpass", "Highpass"}]使用 WienerFilter 对录音除燥:
a = ExampleData[{"Audio", "Apollo11ReturnSafely"}, "Audio"]WienerFilter[a, 25]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 的离散时间近似,其中采样周期为 τ |
filterModel = BiquadraticFilterModel[{ω, q}]discreteFilter = ToDiscreteTimeModel[filterModel, 1 / 22050, z, Method -> {"BilinearTransform", "CriticalFrequency" -> ω}]a = \!\(\*AudioBox[""]\);RecurrenceFilter[discreteFilter /. {ω -> 1000 2 Pi, q -> 7}, a]使用 TransferFunctionModel 定义梳妆滤波器并应用于音频对象:
combFilterModel[f_, α_, sr : _ : 22050] := TransferFunctionModel[{{1 / ( 1 - α z^-Round[sr / f])}}, z, SamplingPeriod -> (1/sr)]combFilterModel[150, α]RecurrenceFilter[combFilterModel[150, -.9], a]| AudioTimeStretch[audio,r] | 通过指定的因子 r 对音频进行时间拉伸 |
| AudioPitchShift[audio,r] | 通过指定的因子 r 对音频进行音调移位 |
| AudioReverb[audio] | 对音频应用混响效果 |
| AudioDelay[audio,delay] | 用延迟时间 delay 对音频应用延迟效果 |
| AudioChannelMix[audio,desttype] | 把音频通道混合到指定的 desttype |
a = ExampleData[{"Audio", "MaleVoice"}, "Audio"]AudioTimeStretch[a, 1.5]AudioPitchShift[a, Quantity[2, IndependentUnit["semitones"]]]AudioDelay[a, .7, .8, .4, PaddingSize -> 2]AudioTrim[AudioReverb[a, ExampleData[{"Audio", "IRStMarysChurch"}]], 10]freq = 60;
feedback = 0.99;
AudioDelay[AudioGenerator["Pink", .01], 1 / freq, feedback, 1, PaddingSize -> 5, Method -> {"LowpassCutoff" -> Quantity[8000, "Hertz"]}]可使用 AudioChannelMix 获取任意通道数下混合与上混合.
a//AudioChannelsAudioChannelMix[a, "Mono"]//AudioChannelsAudioChannelMix[a, 3]//AudioChannels使用 Tanh 函数平滑音频对象的失真:
a = AudioNormalize[Import["ExampleData/Rule30.wav"]]Tanh[5a]ChebyshevT[10, a]a×\!\(\*AudioBox[""]\)整体信号的分析
| AudioMeasurements[audio,"prop"] | 对整个 audio 计算属性 "prop" |
时域和频域属性可以用 AudioMeasurements 度量. 在音频对象的通道上的平均样本值上计算属性.
AudioMeasurements[ExampleData[{"Audio", "Drums"}], {"MinMax", "Mean", "StandardDeviation", "RMSAmplitude", "ZeroCrossings"}, "Dataset"]AudioMeasurements[ExampleData[{"Audio", "Drums"}], {"SpectralCentroid", "SpectralFlatness", "SpectralRollOff", "SpectralSpread"}, "Dataset"]a = AudioGenerator["Sin"];Moment[a, 2]Entropy[a]不像 AudioMeasurements,重载的函数被应用于数据的展平版本. 如果输入是多通道音频对象,所有通道的样本值会在单个数组中被展平.
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 形式返回,其时间戳对应于每个分区的中心时间.
a = \!\(\*AudioBox[""]\);res = AudioLocalMeasurements[a, "RMSAmplitude", PartitionGranularity -> {Quantity[40, "Milliseconds"], Quantity[1, "Milliseconds"]}];
Show[AudioPlot[a], ListLinePlot[res, PlotStyle -> Red]]samples = {\!\(\*AudioBox[""]\), \!\(\*AudioBox[""]\), \!\(\*AudioBox[""]\), \!\(\*AudioBox[""]\), \!\(\*AudioBox[""]\), \!\(\*AudioBox[""]\), \!\(\*AudioBox[""]\), \!\(\*AudioBox[""]\), \!\(\*AudioBox[""]\)};
props = AudioMeasurements[#, {"SpectralCentroid", "SpectralSpread"}, "List"]& /@ samples;
clusters = FindClusters[props -> props]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:
list = Select[ExampleData["Audio"], ExampleData[#, "Duration"] < 10&];
a = ConformAudio[AudioNormalize@AudioChannelMix[#, 1]& /@ ExampleData[#, "Audio"]& /@ list, SampleRate -> 11025];mfcc = AudioLocalMeasurements[#, "MFCC", PartitionGranularity -> {.05, .01}]["Values"]& /@ a;ticks = Thread[{Range[Length@list], Text /@ list[[All, 2]]}];MatrixPlot[DistanceMatrix[mfcc], ImageSize -> Medium, FrameTicks -> {ticks, Apply[Rotate[#, Pi / 2]&, ticks, {2}]}]使用 AudioIntervals 允许提取满足用户定义标准的区间.
a = ExampleData[{"Audio", "NoisyTalk"}, "Audio"];
nonVoicedIntervals = AudioIntervals[a, #RMSAmplitude < .02 && #SpectralFlatness > .0001&, .1, PartitionGranularity -> {.06, .01}]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 |
a = SpeechSynthesize["hello i am a computer"]SpeechRecognize[a]PitchRecognize[a]//ListLinePlotAudioIdentify[a]所有机器学习功能都知道 Audio 对象并从语义上重要特征提取开始执行它们的计算.
| Classify[{audio1class1,audio2class2,…}] | 生成一个在给定范例和类上训练的 ClassifierFunction[…] |
| FeatureExtraction[{audio1,audio2,…}] | 生成一个在给定范例上训练的 FeatureExtractorFunction[…] |
| FeatureSpacePlot[{audio1,audio2,…}] | 用散点图绘制 audioi 上的特征提取 |
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];cl = Classify[train]ClassifierMeasurements[cl, test, "Report"]绘制使用 FeatureSpacePlot 收集的音频特征.
用 FeatureSpacePlot 在有语义意义的空间绘制信号列表:
FeatureSpacePlot[ExampleData[#] -> #[[2]]& /@ ExampleData["Audio"], LabelingFunction -> Callout]神经网络
| "Audio" | 将信号编码为波形 |
| "AudioSpectrogram" | 将信号编码为频谱 |
| "AudioMFCC" | 将信号编码为梅尔频谱 |
音频 NetEncoder 的一些范例.
a = ExampleData[{"Audio", "Bird"}, "Audio"]Labeled[ListLinePlot[First@Transpose@Normal[NetEncoder["Audio"][a]]], "Audio"]Labeled[MatrixPlot[Log@Transpose@Normal[NetEncoder["AudioSpectrogram"][a]], DataReversed -> {True, False}], "AudioSpectrogram"]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 )来分析可变长度信号.
net = NetChain[{GatedRecurrentLayer[64], GatedRecurrentLayer[64], GatedRecurrentLayer[10], AggregationLayer[Mean, 1], SoftmaxLayer[]}, "Input" -> NetEncoder["AudioMFCC"], "Output" -> NetDecoder[{"Class", Range[0, 9]}]]trainedNet = NetTrain[net, ResourceData["Spoken Digit Commands"], ValidationSet -> Scaled[.05]]NetMeasurements[trainedNet, ResourceData["Spoken Digit Commands", "TestDataset"], {"Accuracy", "ConfusionMatrixPlot"}]