Degradar paramétricamente el discurso para eliminar el contenido emocional

12

Estoy feliz de aceptar sugerencias en R o Matlab, pero el código que presento a continuación es solo para R.

El archivo de audio adjunto a continuación es una breve conversación entre dos personas. Mi objetivo es distorsionar su discurso para que el contenido emocional se vuelva irreconocible. La dificultad es que necesito un espacio paramétrico para esta distorsión, digamos del 1 al 5, donde 1 es 'emoción altamente reconocible' y 5 es 'emoción no reconocible'. Hay tres formas que pensé que podría usar para lograr eso con R.

Descargue la onda de audio 'feliz' desde aquí .

Descargue la onda de audio 'enojado' desde aquí .

El primer enfoque fue disminuir la inteligibilidad general mediante la introducción de ruido. Esta solución se presenta a continuación (gracias a @ carl-witthoft por sus sugerencias). Esto disminuirá tanto la inteligibilidad como el contenido emocional del discurso, pero es un enfoque muy 'sucio': es difícil hacer lo correcto para obtener el espacio paramétrico, porque el único aspecto que puede controlar allí es una amplitud (volumen) de ruido.

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)

ingrese la descripción de la imagen aquí

El segundo enfoque sería ajustar de alguna manera el ruido, distorsionar el habla solo en las bandas de frecuencia específicas. Pensé que podría hacerlo extrayendo la envolvente de amplitud de la onda de audio original, generar ruido a partir de esta envolvente y luego volver a aplicar el ruido a la onda de audio. El siguiente código muestra cómo hacerlo. Hace algo diferente al ruido en sí, hace que el sonido se agriete, pero vuelve al mismo punto: que solo soy capaz de cambiar la amplitud del ruido aquí.

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)

ingrese la descripción de la imagen aquí

El enfoque final podría ser la clave para resolver esto, pero es bastante complicado. Encontré este método en un informe publicado en Science por Shannon et al. (1996) . Utilizaron un patrón bastante complejo de reducción espectral para lograr algo que probablemente suene bastante robótico. Pero al mismo tiempo, a partir de la descripción, supongo que podrían haber encontrado la solución que podría resolver mi problema. La información importante se encuentra en el segundo párrafo del texto y la nota número 7 en Referencias y Notas.- Todo el método se describe allí. Mis intentos de replicarlo hasta ahora no han tenido éxito, pero a continuación se muestra el código que pude encontrar, junto con mi interpretación de cómo se debe realizar el procedimiento. Creo que casi todos los acertijos están ahí, pero todavía no puedo entender la imagen completa.

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

Entonces, ¿cómo debería sonar el resultado? Debería ser algo entre la ronquera, un crujido ruidoso, pero no tanto robótico. Sería bueno si el diálogo se mantuviera hasta cierto punto inteligible. Lo sé, todo es un poco subjetivo, pero no te preocupes por eso, son bienvenidas las sugerencias salvajes y las interpretaciones sueltas.

Referencias

Friki en ácido
fuente
Un enfoque simple sería modular, por lo tanto, multiplicar la voz con (ruido + 1.0). Pero otra pregunta: ¿qué estás tratando de hacer? ¿Cuál es su objetivo principal cuando hace que las voces sean ininteligibles?
1
¿Por qué simplemente no noisy <- audio + k*white_noisehacer lo que quieres para una variedad de valores de k? Teniendo en cuenta, por supuesto, que "inteligible" es altamente subjetivo. Ah, y probablemente desee unas pocas docenas de white_noisemuestras diferentes para evitar cualquier efecto coincidente debido a la falsa correlación entre audioy un único noisearchivo de valor aleatorio .
En última instancia, quiero disminuir paramétricamente la confiabilidad de la información auditiva, de modo que los juicios de precisión difieran para los diferentes niveles de clip de audio manipulado. El juicio de precisión será para la emoción, ya sea que la conversación sea feliz o enojada. El problema es que es extremadamente difícil manipular el contenido emocional de un discurso largo (como mi clip adjunto arriba). La gente lo hace con vocales simples, pero no con oraciones completas. Así que decidí generalizar la pregunta y encontrar la manera de degradar paramétricamente todo el espectro de información de audio.
@CarlWitthoft Su solución solo ajusta la amplitud del ruido y, como dije, necesito algo que mezcle el ruido con la señal. Hace +1 la sugerencia de que necesito diferentes muestras de ruido blanco, que de hecho podría marcar la diferencia como usted señaló.
Bueno ... alego ignorancia aquí: ¿cuál es la definición matemática de "mezclar" dos secuencias de audio? Estaba asumiendo ingenuamente que, dejando de lado la existencia de un filtro programable, todo lo que puede hacer con dos vectores de amplitudes muestreadas en el tiempo es agregarlos.

Respuestas:

11

Leí tu pregunta original y no estaba muy seguro de a qué te referías, pero ahora es mucho más claro. El problema que tiene es que el cerebro es extremadamente bueno para distinguir el habla y la emoción, incluso cuando el ruido de fondo es muy alto, ya que sus intentos existentes solo han tenido un éxito limitado.

Creo que la clave para obtener lo que quieres es comprender los mecanismos que transmiten el contenido emocional, ya que en su mayoría están separados de los que transmiten la inteligibilidad. Tengo algo de experiencia en esto (de hecho, mi tesis de grado fue sobre un tema similar), así que intentaré ofrecer algunas ideas.

Considere sus dos muestras como ejemplos de discurso muy emocional, luego considere lo que sería un ejemplo "sin emociones". Lo mejor que puedo pensar en este momento es la voz tipo "Stephen Hawking" generada por computadora. Entonces, si entiendo bien, lo que quieres hacer es comprender las diferencias entre ellos y descubrir cómo distorsionar tus muestras para que se conviertan gradualmente en una voz sin emociones generada por computadora.

Diría que los dos mecanismos principales para obtener lo que quieres son a través de la distorsión de tono y tiempo, ya que gran parte del contenido emocional está contenido en la entonación y el ritmo del discurso. Entonces, una sugerencia de un par de cosas que vale la pena probar:

  1. Un efecto de tipo de distorsión de tono que dobla el tono y reduce la entonación. Esto podría hacerse de la misma manera que Antares Autotune funciona donde gradualmente dobla el tono hacia un valor constante cada vez más hasta que sea un monótono completo.

  2. Un efecto de extensión temporal que cambia la duración de algunas partes del discurso, tal vez los fonemas con voz constante que romperían el ritmo del discurso.

Ahora, si decidiste abordar cualquiera de estos métodos, seré sincero: no son tan fáciles de implementar en DSP y no serán solo unas pocas líneas de código. Tendrá que hacer un trabajo para comprender el procesamiento de la señal. Si conoces a alguien con Pro-Tools / Logic / Cubase y una copia de Antares Autotune, probablemente valga la pena intentar ver si tendrá el efecto que deseas antes de intentar codificar algo similar.

Espero que eso te dé algunas ideas y te ayude un poco. Si necesita que le explique alguna de las cosas que he dicho más, avíseme.

Ojo rojo
fuente
Gracias por tus sugerencias @Redeye. Lamentablemente, la extensión de tiempo no es una opción, porque habrá una condición en la que les presente la información del video, por lo que necesito mantener la voz modificada con la misma duración que la original. La distorsión de tono es un enfoque interesante: ¿conoce alguna referencia publicada para explicar mejor este método?
Geek On Acid
1
El cambio de tono para hacer lo que desee implicará dos etapas: en primer lugar, el análisis del discurso para establecer el perfil de frecuencia fundamental actual, luego el cambio de tono. El análisis es bastante sencillo y hay varios métodos que son efectivos. El cambio de tono es más complejo: intentaría buscar en la revista AES referencias publicadas (JAES Volumen 47 Número 11 págs. 928-936; noviembre de 1999 parece que podría ser útil). Como dije antes, te estás metiendo en un procesamiento bastante complejo aquí y definitivamente valdría la pena probarlo primero con Autotune.
Redeye
2
Redeye tiene buenas sugerencias, pero solo señalaría que para el discurso de cambio de tono, no recomendaría vocoder de fase o cualquier enfoque de dominio de frecuencia: PSOLA (agregado de superposición sincronizada de tono) es una buena manera de hacerlo porque sonará mejor para un Instrumento monofónico con bloqueo de fase como la voz.
schnarf
4

Le sugiero que obtenga un software de producción musical y juegue con eso para obtener el efecto que desea. Solo entonces debería preocuparse por resolver esto programáticamente. (Si puede llamar a su software de música desde una línea de comandos, puede llamarlo desde R o MATLAB).


Otra posibilidad que no se ha discutido es eliminar por completo la emoción mediante el uso del software de voz a texto para crear una cadena, luego el software de texto a voz para convertir esa cadena en una voz de robot. Ver /programming/491578/how-do-i-convert-speech-to-text y /programming/637616/open-source-text-to-speech-library .

Para que esto funcione de manera confiable, probablemente tendrá que entrenar la primera pieza de software para reconocer al orador.

Algodón Richie
fuente
Necesito filtrar los archivos originales para que texto a voz no sea realmente una opción desafortunadamente, aunque podría pensar en algún paradigma de transformación entre el habla normal y el habla sintética.
Geek On Acid