音声処理
音声処理
Wolfram言語は,他のパワフルな数学およびアルゴリズム機能と完全に統合した,プログラム的でありインタラクティブでもある音声処理に対する組込のサポートを提供している.音声オブジェクトは,線形および非線形フィルタを適用したり,エフェクトを加えたり,音声特定の関数を使って解析することもできれば,Wolfram言語の他の部分との密接な統合を利用して処理することもできる.
| LowpassFilter[audio,ωc] | カットオフ周波数が ωc のローパスフィルタを音声に適用する |
| HighpassFilter[audio,ωc] | カットオフ周波数が ωc のハイパスフィルタを音声に適用する |
| WienerFilter[audio,r] | 範囲 r サンプルのWienerフィルタを音声に適用する |
| 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}のButterworthフィルタを作る |
| TransferFunctionModel[m,s] | 複素変数 s を持つ伝達関数行列 m のモデルを表す |
| ToDiscreteTimeModel[lsys,τ] | サンプリング周期が τ の連続時間系モデル lsys の離散時間近似を与える |
アナログ(連続時間)フィルタモデルの一つを使う最も簡単な方法は,ToDiscreteTimeModelを使って伝達関数を離散化し,RecurrenceFilterを使ってその結果を音声オブジェクトに適用するというものである.
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]//AudioChannelsAudioオブジェクトの算術機能を利用して,録音を変更することができる.属性NumericFunctionあるいはListableを持つWolfram言語の演算子および関数はすべて音声オブジェクトで利用できるよう多重定義されている.
Tanh関数を使って,音声オブジェクトに滑らかなディストーションを適用する:
a = AudioNormalize[Import["ExampleData/Rule30.wav"]]Tanh[5a]ChebyshevT関数を使って「ウェーブシェイパー」エフェクトを得る:
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とは異なり,多重定義された関数は平坦化されたデータに適用される(入力がマルチチャンネルの音声オブジェクトの場合,すべてのチャンネルからのサンプル値は1つの配列に平滑化される).
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 を満たす音声区間を求める |
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"]集合のさまざまな要素間の距離を計算する機能として使う:
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オブジェクトは,パワフルなニューラルネットワークフレームワークと緊密に統合されている.NetEncoderはAudioオブジェクト等のさまざまな高レベル構造にタメノニューラルネットの入り口を提供する.
| "Audio" | 信号を波形として符号化する |
| "AudioSpectrogram" | 信号をすペクトログラムとして符号化する |
| "AudioMFCC" | 信号をメルスペクトログラムとして符号化する |
音声NetEncoderの例
いろいろな種類の特徴を計算するためには,異なるエンコーダを使うことができる.もとの信号の情報をすべて維持するもの("Audio"や"AudioSTFT"等)もあれば,いくらかの情報を捨てて次元を劇的に減少させるもの("AudioMFCC"等)もある.
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"}]関連するガイド
-
▪
- 音声処理 ▪
- 音声表現 ▪
- 信号処理 ▪
- 時系列 ▪
- 距離と類似殿測定基準 ▪
- 機械学習 ▪
- ニューラルネットワーク