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)
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)
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:
- Shannon, RV, Zeng, FG, Kamath, V., Wygonski, J. & Ekelid, M. (1995). Spracherkennung mit vorwiegend zeitlichen Hinweisen. Science , 270 (5234), 303. Herunterladen von http://www.cogsci.msu.edu/DSS/2007-2008/Shannon/temporal_cues.pdf
noisy <- audio + k*white_noise
fü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 verschiedenewhite_noise
Samples, um zufällige Effekte aufgrund einer falschen Korrelation zwischenaudio
einer einzelnen Zufallswertdatei zu vermeidennoise
.Antworten:
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:
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.
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.
quelle
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.
quelle