RまたはMatlabで提案を受け入れますが、以下に示すコードはRのみです。
以下に添付されている音声ファイルは、2人の間の短い会話です。私の目標は、感情的な内容が認識できなくなるように、彼らのスピーチを歪めることです。難点は、この歪みのために1〜5のパラメトリックスペースが必要なことです。1〜5は「非常に認識可能な感情」、5は「認識できない感情」です。Rでそれを達成するために使用できると思った3つの方法があります。
最初のアプローチは、ノイズを導入して全体的な明瞭度を低下させることでした。このソリューションを以下に示します(彼の提案に対して@ carl-witthoftに感謝します)。これにより、音声の明瞭度と感情的な内容の両方が低下しますが、非常に「汚い」アプローチです-パラメトリック空間を取得するのが正しいことは困難です。
require(seewave)
require(tuneR)
require(signal)
h <- readWave("happy.wav")
h <- cutw(h.norm,f=44100,from=0,to=2)#cut down to 2 sec
n <- noisew(d=2,f=44100)#create 2-second white noise
h.n <- h + n #combine audio wave with noise
oscillo(h.n,f=44100)#visualize wave with noise(black)
par(new=T)
oscillo(h,f=44100,colwave=2)#visualize original wave(red)
2番目のアプローチは、特定の周波数帯域でのみ音声を歪めるために、何らかの方法でノイズを調整することです。元のオーディオ波から振幅エンベロープを抽出し、このエンベロープからノイズを生成してから、オーディオウェーブにノイズを再適用することでそれができると考えました。以下のコードはその方法を示しています。ノイズ自体とは異なる何かをし、音が割れますが、同じポイントに戻ります-ここでノイズの振幅を変更することしかできません。
n.env <- setenv(n, h,f=44100)#set envelope of noise 'n'
h.n.env <- h + n.env #combine audio wave with 'envelope noise'
par(mfrow=c(1,2))
spectro(h,f=44100,flim=c(0,10),scale=F)#spectrogram of normal wave (left)
spectro(h.n.env,f=44100,flim=c(0,10),scale=F,flab="")#spectrogram of wave with 'envelope noise' (right)
最終的なアプローチがこれを解決するための鍵になるかもしれませんが、それは非常にトリッキーです。この方法は、Shannon et al。によってScienceに発表されたレポートペーパーで見つけました。(1996)。彼らは非常にトリッキーなスペクトル削減のパターンを使用して、おそらく非常にロボット的なサウンドを実現しました。しかし同時に、説明から、彼らは私の問題に答えることができる解決策を見つけたかもしれないと思います。重要な情報は、参照とメモのテキストとメモ番号7の2番目の段落にあります。-メソッド全体がそこに記述されています。これを複製する試みはこれまでのところ失敗しましたが、手順をどのように行うべきかについての私の解釈とともに、見つけたコードを以下に示します。ほとんどすべてのパズルがそこにあると思いますが、どうにか全体像を得ることができません。
###signal was passed through preemphasis filter to whiten the spectrum
#low-pass below 1200Hz, -6 dB per octave
h.f <- ffilter(h,to=1200)#low-pass filter up to 1200 Hz (but -6dB?)
###then signal was split into frequency bands (third-order elliptical IIR filters)
#adjacent filters overlapped at the point at which the output from each filter
#was 15dB down from the level in the pass-band
#I have just a bunch of options I've found in 'signal'
ellip()#generate an Elliptic or Cauer filter
decimate()#downsample a signal by a factor, using an FIR or IIR filter
FilterOfOrder()#IIR filter specifications, including order, frequency cutoff, type...
cutspec()#This function can be used to cut a specific part of a frequency spectrum
###amplitude envelope was extracted from each band by half-wave rectification
#and low-pass filtering
###low-pass filters (elliptical IIR filters) with cut-off frequencies of:
#16, 50, 160 and 500 Hz (-6 dB per octave) were used to extract the envelope
###envelope signal was then used to modulate white noise, which was then
#spectrally limited by the same bandpass filter used for the original signal
では、結果はどのように聞こえるのでしょうか?それはar声、うるさいクラッキングの間の何かであるべきですが、それほどロボット的ではありません。対話がある程度理解しやすいままになっているとよいでしょう。私は知っています-それは少し主観的ですが、それについて心配しないでください-ワイルドな提案とゆるい解釈は大歓迎です。
参照:
- Shannon、RV、Zeng、FG、Kamath、V.、Wygonski、J.、&Ekelid、M.(1995)。主に一時的なキューを使用した音声認識。Science、270(5234)、303。http ://www.cogsci.msu.edu/DSS/2007-2008/Shannon/temporal_cues.pdfからダウンロード
noisy <- audio + k*white_noise
さまざまなkの値を単純に実行しても、必要な処理が実行されないのはなぜですか?もちろん、「わかりやすい」ことは非常に主観的であることに留意してください。ああ、そしておそらくあなたは数十種類の異なるwhite_noise
サンプルを望んでいてaudio
、単一のランダム値noise
ファイルとの間の誤った相関による偶然の影響を避けたい。