Verringern Sie die Sprache parametrisch, um emotionalen Inhalt zu entfernen

12

Ich akzeptiere gerne Vorschläge in R oder Matlab, aber der Code, den ich unten präsentiere, ist R-only.

Die unten angehängte Audiodatei ist eine kurze Unterhaltung zwischen zwei Personen. Mein Ziel ist es, ihre Sprache so zu verzerren, dass der emotionale Inhalt nicht mehr erkennbar ist. Die Schwierigkeit besteht darin, dass ich für diese Verzerrung einen parametrischen Bereich benötige, sagen wir mal von 1 bis 5, wobei 1 "stark erkennbare Emotion" und 5 "nicht erkennbare Emotion" ist. Es gibt drei Möglichkeiten, wie ich das mit R erreichen könnte.

Download ‚glücklich‘ Audio-Welle , die von hier .

Laden Sie 'angry' Audio Wave von hier herunter .

Der erste Ansatz bestand darin, die Gesamtverständlichkeit durch Einführung von Rauschen zu verringern. Diese Lösung wird im Folgenden vorgestellt (danke an @ carl-witthoft für seine Vorschläge). Dies verringert sowohl die Verständlichkeit als auch den emotionalen Inhalt der Sprache, aber es ist sehr "schmutzig" - es ist schwierig, den parametrischen Raum richtig zu bestimmen, da der einzige Aspekt, den Sie steuern können, eine Amplitude (Lautstärke) des Rauschens ist.

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)

Bildbeschreibung hier eingeben

Der zweite Ansatz wäre, das Rauschen irgendwie anzupassen, um die Sprache nur in den spezifischen Frequenzbändern zu verzerren. Ich dachte, ich könnte dies tun, indem ich die Amplitudenhüllkurve aus der ursprünglichen Audiowelle extrahiere, Rauschen aus dieser Hüllkurve generiere und das Rauschen dann erneut auf die Audiowelle anwende. Der folgende Code zeigt, wie das geht. Es macht etwas anderes als das Geräusch selbst, bringt den Klang zum Knacken, aber es geht auf den gleichen Punkt zurück - dass ich hier nur die Amplitude des Geräusches ändern kann.

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)

Bildbeschreibung hier eingeben

Der endgültige Ansatz könnte der Schlüssel zur Lösung sein, ist aber recht knifflig. Ich fand diese Methode in einem Bericht, der in Science von Shannon et al. (1996) . Sie verwendeten ein ziemlich trickreiches Muster der Spektralreduktion, um etwas zu erreichen, das sich wahrscheinlich ziemlich roboterhaft anhört. Gleichzeitig gehe ich aus der Beschreibung davon aus, dass sie möglicherweise die Lösung gefunden haben, die mein Problem beantworten könnte. Die wichtigen Informationen finden Sie im zweiten Absatz im Text und in Anmerkung Nr. 7 unter Referenzen und Anmerkungen- Dort wird die gesamte Methode beschrieben. Meine Versuche, es zu replizieren, waren bisher erfolglos. Nachstehend ist der Code aufgeführt, den ich zusammen mit meiner Interpretation der Vorgehensweise gefunden habe. Ich denke, dass fast alle Puzzles da sind, aber ich kann noch nicht das ganze Bild bekommen.

###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

Wie soll das Ergebnis also klingen? Es sollte etwas zwischen Heiserkeit, einem lauten Knacken, aber nicht so viel Roboter sein. Es wäre gut, wenn der Dialog einigermaßen verständlich bleiben würde. Ich weiß - es ist alles ein bisschen subjektiv, aber mach dir keine Sorgen - wilde Vorschläge und lose Interpretationen sind sehr willkommen.

Verweise:

Aussenseiter Auf Säure
quelle
Ein einfacher Ansatz wäre, die Stimme mit (Noise + 1.0) zu modulieren, also zu multiplizieren. Aber noch eine Frage: Was versuchst du zu tun? Was ist Ihr übergeordnetes Ziel, wenn Sie Stimmen unverständlich machen?
1
Warum macht man nicht einfach noisy <- audio + k*white_noisefür eine Vielzahl von Werten von k das, was man will? Natürlich ist "verständlich" höchst subjektiv. Oh, und Sie möchten wahrscheinlich ein paar Dutzend verschiedene white_noiseSamples, um zufällige Effekte aufgrund einer falschen Korrelation zwischen audioeiner einzelnen Zufallswertdatei zu vermeiden noise.
Letztendlich möchte ich die Zuverlässigkeit von Hörinformationen parametrisch verringern, damit sich die Genauigkeitsbeurteilungen für verschiedene Ebenen manipulierter Audioclips unterscheiden. Die Richtigkeitsprüfung richtet sich nach der Emotion - ob das Gespräch glücklich oder böse ist. Das Problem ist, dass es extrem schwierig ist, den emotionalen Inhalt einer langen Sprachäußerung zu manipulieren (wie in meinem oben angehängten Clip). Die Leute machen es mit einem einzigen Vokal, aber nicht mit den ganzen Sätzen. Deshalb habe ich beschlossen, die Frage zu verallgemeinern und den Weg zu finden, um das gesamte Spektrum der Audioinformationen parametrisch abzubauen.
@CarlWitthoft Deine Lösung passt nur die Rauschamplitude an, und wie gesagt - ich brauche etwas, das Rauschen mit dem Signal mischt . +1 Sie den Vorschlag, dass ich verschiedene Proben von weißem Rauschen brauche - das könnte in der Tat einen Unterschied machen, wie Sie darauf hingewiesen haben.
Nun ... Ich plädiere hier für Unwissenheit: Was ist die mathematische Definition des "Mischens" zweier Audio-Streams? Ich bin naiv davon ausgegangen, dass man mit zwei Vektoren von zeitgetasteten Amplituden nichts weiter machen kann, als sie zu addieren, ohne auf die Existenz eines programmierbaren Filters zu verzichten.

Antworten:

11

Ich habe deine ursprüngliche Frage gelesen und war mir nicht ganz sicher, worauf du hinaus willst, aber es ist jetzt viel klarer. Das Problem, das Sie haben, ist, dass das Gehirn sehr gut in der Lage ist, Sprache und Emotionen zu erkennen, auch wenn das Hintergrundgeräusch sehr hoch ist. Dies ist der Grund, warum Ihre bisherigen Versuche nur von begrenztem Erfolg waren.

Ich denke, der Schlüssel zu dem, was Sie wollen, besteht darin, die Mechanismen zu verstehen, die den emotionalen Inhalt vermitteln, da sie größtenteils von denen getrennt sind, die die Verständlichkeit vermitteln. Ich habe einige Erfahrungen damit gesammelt (meine Diplomarbeit befasste sich mit einem ähnlichen Thema), daher werde ich versuchen, einige Ideen anzubieten.

Betrachten Sie Ihre beiden Beispiele als Beispiele für sehr emotionale Sprache und betrachten Sie dann ein "emotionsloses" Beispiel. Das Beste, woran ich momentan denken kann, ist die computergenerierte Stimme vom Typ "Stephen Hawking". Also, wenn ich richtig verstehe, was Sie tun möchten, ist, die Unterschiede zwischen ihnen zu verstehen und herauszufinden, wie Sie Ihre Samples verzerren können, um allmählich zu einer computergenerierten emotionslosen Stimme zu werden.

Ich würde sagen, dass die beiden Hauptmechanismen, um das zu erreichen, was Sie wollen, über Tonhöhe und Zeitverzerrung erfolgen, da ein Großteil des emotionalen Inhalts in der Intonation und dem Rhythmus der Rede enthalten ist. Also ein Vorschlag von ein paar Dingen, die es wert sein könnten, ausprobiert zu werden:

  1. Ein Effekt vom Typ Tonhöhenverzerrung, der die Tonhöhe verbiegt und die Intonation verringert. Dies kann auf die gleiche Weise geschehen wie bei Antares Autotune, bei dem Sie die Tonhöhe allmählich mehr und mehr auf einen konstanten Wert einstellen, bis sie vollständig monoton ist.

  2. Ein Zeitdehnungseffekt, der die Länge einiger Teile der Sprache ändert - vielleicht die ständigen stimmhaften Phoneme, die den Rhythmus der Sprache aufbrechen würden.

Wenn Sie sich für eine dieser Methoden entscheiden, dann bin ich ehrlich: Sie sind nicht so einfach in DSP zu implementieren und es werden nicht nur ein paar Codezeilen sein. Sie müssen einige Arbeiten ausführen, um die Signalverarbeitung zu verstehen. Wenn Sie jemanden mit Pro-Tools / Logic / Cubase und einer Kopie von Antares Autotune kennen, lohnt es sich wahrscheinlich, zu prüfen, ob es den gewünschten Effekt hat, bevor Sie versuchen, selbst etwas Ähnliches zu codieren.

Ich hoffe das gibt dir ein paar Ideen und hilft ein wenig. Wenn ich eines der Dinge erklären muss, die ich noch gesagt habe, dann lass es mich wissen.

Redeye
quelle
Vielen Dank für Ihre Vorschläge @Redeye. Zeitverzögerung ist leider keine Option, da es eine Bedingung gibt, in der ich ihnen die Videoinformationen vorlege, sodass ich die geänderte Sprache auf der gleichen Länge wie die ursprüngliche halten muss. Tonhöhenverzerrung ist ein interessanter Ansatz - kennen Sie veröffentlichte Referenzen, um diese Methode besser zu erklären?
Geek On Acid
1
Die Tonhöhenverschiebung der Sprache, um das zu tun, was Sie wollen, umfasst zwei Schritte: erstens die Analyse der Sprache, um das aktuelle Grundfrequenzprofil zu ermitteln, und zweitens die Tonhöhenverschiebung. Die Analyse ist ziemlich einfach und es gibt verschiedene Methoden, die effektiv sind. Die Tonhöhenverschiebung ist komplexer - ich würde versuchen, im AES-Journal nach veröffentlichten Referenzen zu suchen (JAES, Band 47, Ausgabe 11, S. 928-936; November 1999, scheint nützlich zu sein). Wie ich bereits sagte, sind Sie hier in eine ziemlich komplexe Verarbeitung verwickelt, und es lohnt sich auf jeden Fall, sie zuerst mit Autotune zu testen.
Redeye
2
Redeye hat gute Vorschläge, aber ich möchte nur darauf hinweisen, dass ich für die Tonhöhenverschiebung von Sprache keinen Phasenvocoder oder Frequenzbereich-Ansatz empfehlen würde monophone Phase-Locked-Instrument wie die Stimme.
Schnarf
4

Ich schlage vor, dass Sie Musikproduktionssoftware kaufen und damit spielen, um den gewünschten Effekt zu erzielen. Nur dann sollten Sie sich Gedanken machen, dies programmgesteuert zu lösen. (Wenn Ihre Musiksoftware über eine Befehlszeile aufgerufen werden kann, können Sie sie über R oder MATLAB aufrufen.)


Eine andere Möglichkeit, die noch nicht erörtert wurde, besteht darin, die Emotionen vollständig zu beseitigen, indem mithilfe von Speech-to-Text-Software eine Zeichenfolge erstellt und anschließend mit Text-to-Speech-Software eine Zeichenfolge in eine Roboterstimme umgewandelt wird. Siehe /programming/491578/how-do-i-convert-speech-to-text und /programming/637616/open-source-text-to-speech-library .

Damit dies zuverlässig funktioniert, müssen Sie wahrscheinlich die erste Software trainieren, um den Lautsprecher zu erkennen.

Richie Cotton
quelle
Ich muss die Originaldateien filtern, damit Text-to-Speech leider keine Option ist, obwohl ich vielleicht über ein Morphing-Paradigma zwischen normaler Sprache und synthetischer Sprache nachdenken könnte.
Geek On Acid