感情的なコンテンツを削除するために、音声をパラメトリックに劣化させます


12

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声、うるさいクラッキングの間の何かであるべきですが、それほどロボット的ではありません。対話がある程度理解しやすいままになっているとよいでしょう。私は知っています-それは少し主観的ですが、それについて心配しないでください-ワイルドな提案とゆるい解釈は大歓迎です。

参照:


単純なアプローチの1つは、(ノイズ+ 1.0)で音声を変調する(乗算する)ことです。しかし、別の質問:何をしようとしているのですか?音声を判読不能にするとき、あなたの主な目標は何ですか?

1
noisy <- audio + k*white_noiseさまざまなkの値を単純に実行しても、必要な処理が実行されないのはなぜですか?もちろん、「わかりやすい」ことは非常に主観的であることに留意してください。ああ、そしておそらくあなたは数十種類の異なるwhite_noiseサンプルを望んでいてaudio、単一のランダム値noiseファイルとの間の誤った相関による偶然の影響を避けたい。

最終的に、聴覚情報の信頼性をパラメトリックに低下させ、操作されたオーディオクリップのレベルごとに精度の判断が異なるようにします。会話が幸せか怒っているかどうか-正確さの判断は感情のためになります。問題は、長い音声発話の感情的なコンテンツを操作することは非常に難しいことです(上記の私のクリップのように)。人々は単一の母音でそれをしますが、文全体ではありません。そこで、質問を一般化し、パラメトリックに音声情報のスペクトル全体を劣化させる方法を見つけ出すことにしました。

@CarlWitthoftあなたの解決策はノイズの振幅を調整するだけであり、私が言ったように- ノイズと信号を混ぜる何かが必要です。ホワイトノイズの異なるサンプルが必要であるという提案を+1してください。これは、実際にあなたが指摘したように違いがあるかもしれません。

さて...ここで無知を訴えます:2つのオーディオストリームを「混合」する数学的な定義は何ですか?私は、プログラム可能なフィルターの存在を除外して、時間サンプリングされた振幅の2つのベクトルでできることはそれらを追加するだけだと単純に仮定していました。

回答:


11

私はあなたの元の質問を読みましたが、あなたが何を得ているのかよくわかりませんでしたが、今ではかなりはっきりしています。あなたが持っている問題は、あなたの既存の試みが限られた成功しかなかったバックグラウンドノイズが非常に高いときでさえ、脳がスピーチと感情を拾うのに非常に優れているということです。

あなたが望むものを手に入れる鍵は、感情的な内容を伝えるメカニズムを理解することだと思います。私はこれについていくつかの経験を持っています(実際、私の学位論文は同様のテーマでした)ので、私はいくつかのアイデアを試して提供します。

非常に感情的な発話の例として2つのサンプルを検討し、「感情のない」例となるものを検討します。私が今考えることができる最高のものは、コンピューターが生成した「Stephen Hawking」タイプの音声です。ですから、私があなたがやりたいことを正しく理解していれば、それらの違いを理解し、サンプルを歪ませてコンピューターが生成する感情のない声のように徐々に変化させる方法を見つけ出すことです。

感情的なコンテンツの多くは音声のイントネーションとリズムに含まれているため、必要なものを取得するための2つの主なメカニズムはピッチと時間の歪みによるものです。だから、試してみる価値があるかもしれないいくつかのことの提案:

  1. ピッチを曲げてイントネーションを減らすピッチディストーションタイプのエフェクト。これは、完全なモノトーンになるまで徐々に一定の値に向かってピッチを徐々に曲げるAntares Autotuneの動作と同じ方法で実行できます。

  2. スピーチのいくつかの部分の長さを変更するタイムストレッチ効果-おそらくスピーチのリズムを壊す一定の有声音素。

さて、これらの方法のいずれかにアプローチすることを決めた場合、私は正直に言います-それらはDSPで実装するのは簡単ではなく、ほんの数行のコードではありません。信号処理を理解するには、何らかの作業を行う必要があります。Pro-Tools / Logic / CubaseとAntares Autotuneのコピーを知っている人は、似たようなコードを作成する前に、必要な効果があるかどうかを確認する価値があるでしょう。

私はそれがあなたにいくつかのアイデアを提供し、少し助けになることを願っています。あなたが私がこれ以上言ったことを説明する必要があるなら、私に知らせてください。


@Redeyeのご提案ありがとうございます。残念ながら、タイムストレッチはオプションではありません。ビデオ情報を提示する条件があるため、変更後の音声を元の音声と同じ長さに維持する必要があるためです。ピッチの歪みは興味深いアプローチです-この方法をよりよく説明する公開された参考文献を知っていますか?
オタクの酸

1
音声をピッチシフトして目的の処理を行うには、2つの段階が必要です。まず、現在の基本周波数プロファイルを確立するための音声の分析、次にピッチシフトです。分析はかなり簡単で、効果的な方法がいくつかあります。ピッチシフトはより複雑です。公開された参考文献についてAESジャーナルを検索してみます(JAES Volume 47 Issue 11 pp。928-936; 1999年11月は役に立つかもしれません)。前に言ったように、ここではかなり複雑な処理を行っているので、まずAutotuneで試してみる価値があります。
赤目

2
Redeyeには良い提案がありますが、ピッチシフトスピーチには、位相ボコーダーや周波数ドメインアプローチをお勧めしません-PSOLA(ピッチ同期オーバーラップ加算)は、より良い音になるので良い方法です声のようなモノフォニック位相ロック楽器。
シュナーフ

4

いくつかの音楽制作ソフトウェアを入手して、それを試して、希望する効果を得るようにしてください。その後、プログラムでこれを解決することを心配する必要があります。(音楽ソフトウェアをコマンドラインから呼び出すことができる場合は、RまたはMATLABから呼び出すことができます)。


議論されていないもう1つの可能性は、音声からテキストへのソフトウェアを使用して文字列を作成し、次にテキストから音声へのソフトウェアを使用してその文字列をロボットの声に変えることによって感情を完全に取り除くことです。/programming/491578/how-do-i-convert-speech-to-text および/programming/637616/open-source-text-to-speech-libraryを参照 して ください

これを確実に機能させるには、おそらく最初のソフトウェアを訓練して話者を認識させる必要があります。


元のファイルをフィルタリングする必要があるので、残念ながら、テキスト読み上げは実際にはオプションではありませんが、通常の音声と合成音声の間のモーフィングパラダイムについて考えるかもしれません。
オタクの酸
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.