Параметрически ухудшить речь, убрать эмоциональный контент


12

Я рад принять предложения в R или Matlab, но приведенный ниже код предназначен только для R.

Аудиофайл, прикрепленный ниже, представляет собой небольшую беседу между двумя людьми. Моя цель - исказить их речь, чтобы эмоциональное содержание стало неузнаваемым. Сложность в том, что мне нужно некоторое параметрическое пространство для этого искажения, скажем, от 1 до 5, где 1 - это «хорошо распознаваемая эмоция», а 5 - «неузнаваемая эмоция». Я думал, что могу достичь этого тремя способами.

Загрузите «счастливую» звуковую волну отсюда .

Загрузите «сердитую» звуковую волну отсюда .

Первый подход состоял в том, чтобы уменьшить общую разборчивость путем введения шума. Это решение представлено ниже (спасибо @ 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)

введите описание изображения здесь

Второй подход заключается в том, чтобы как-то регулировать шум, искажать речь только в определенных полосах частот. Я думал, что смогу сделать это, извлекая амплитудную огибающую из исходной звуковой волны, генерируя шум из этой огибающей и затем повторно применяя шум к звуковой волне. Код ниже показывает, как это сделать. Он делает что-то отличное от самого шума, заставляет звук трещать, но он возвращается к той же точке - что я могу только изменить амплитуду шума здесь.

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)

введите описание изображения здесь

Окончательный подход может быть ключом к решению этой проблемы, но это довольно сложно. Я нашел этот метод в отчете, опубликованном в Science Shannon et al. (1996) . Они использовали довольно сложную схему спектрального сокращения, чтобы достичь чего-то, что, вероятно, звучит довольно роботизировано. Но в то же время, исходя из описания, я предполагаю, что они могли найти решение, которое могло бы ответить на мою проблему. Важная информация содержится во втором абзаце текста и примечании № 7 в « Литературе и примечаниях».- весь метод описан там. Мои попытки воспроизвести его до сих пор были безуспешными, но ниже приведен код, который мне удалось найти, вместе с моей интерпретацией того, как должна выполняться процедура. Я думаю, что есть почти все загадки, но я пока не могу получить полную картину.

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

Так как должен звучать результат? Это должно быть что-то среднее между хрипотой, шумным треском, но не таким уж роботизированным. Было бы хорошо, если бы диалог оставался в какой-то степени понятным. Я знаю - это все немного субъективно, но не беспокойтесь об этом - дикие предложения и свободные толкования очень приветствуются.

Ссылки:

  • Шеннон Р.В., Зенг Ф.Г., Камат В., Вигонски Дж. И Экелид М. (1995). Распознавание речи с преимущественно временными сигналами. Science , 270 (5234), 303. Скачать с http://www.cogsci.msu.edu/DSS/2007-2008/Shannon/temporal_cues.pdf

Одним из простых подходов было бы модулировать, а значит, умножить голос с (шум + 1,0). Но другой вопрос: что вы пытаетесь сделать? Какова ваша главная цель, когда голос становится непонятным?

1
Почему просто не делать noisy <- audio + k*white_noiseдля различных значений k то, что вы хотите? Конечно, помнить, что «вразумительный» очень субъективно. О, и вы, вероятно, хотите, чтобы несколько десятков различных white_noiseвыборок избежали каких-либо случайных эффектов из-за ложной корреляции между audioодним noiseфайлом случайных значений .

В конечном счете, я хочу параметрически снизить достоверность слуховой информации, чтобы суждения о точности отличались для разных уровней манипулируемого аудиоклипа. Точность суждения будет зависеть от эмоций, будь то разговор счастливый или злой. Проблема в том, что чрезвычайно трудно манипулировать эмоциональным содержанием длинного речевого высказывания (как мой клип, прикрепленный выше). Люди делают это с помощью одного гласного, но не всего предложения. Поэтому я решил обобщить вопрос и найти способ параметрически ухудшить весь спектр аудиоинформации.

@CarlWitthoft Ваше решение регулирует только амплитуду шума, и, как я уже сказал, мне нужно что-то, что смешивает шум с сигналом. +1 Вы предполагаете, что мне нужны разные образцы белого шума - это действительно может иметь значение, как вы указали.

Ну ... я здесь прошу неведения: каково математическое определение "микширования" двух аудиопотоков? Я наивно полагал, что, если не учитывать наличие программируемого фильтра, все, что вы можете сделать с двумя векторами амплитуд с дискретизацией по времени, это сложить их.

Ответы:


11

Я прочитал ваш первоначальный вопрос и не совсем понял, к чему вы клоните, но теперь это стало намного понятнее. Проблема, с которой вы столкнулись, заключается в том, что мозг очень хорошо выделяет речь и эмоции, даже если фоновый шум очень высок, то есть ваши попытки имели лишь ограниченный успех.

Я думаю, что ключом к получению того, что вы хотите, является понимание механизмов, которые передают эмоциональный контент, поскольку они в основном отделены от тех, которые передают понятность. У меня есть некоторый опыт в этом (на самом деле моя дипломная работа была на подобную тему), поэтому я попытаюсь предложить некоторые идеи.

Рассмотрите ваши два образца как примеры очень эмоциональной речи, а затем рассмотрите то, что было бы «бесчувственным» примером. Лучшее, о чем я могу думать сейчас, - это компьютерный голос типа «Стивен Хокинг». Итак, если я правильно понимаю, то, что вы хотите сделать, это понять различия между ними и выяснить, как исказить ваши семплы, чтобы постепенно стать похожим на компьютер безэмоциональным голосом.

Я бы сказал, что два основных механизма, чтобы получить то, что вы хотите, через высоту тона и искажение времени, так как большая часть эмоционального содержания содержится в интонации и ритме речи. Итак, предложение о нескольких вещах, которые стоит попробовать:

  1. Эффект типа искажения высоты тона, который изгибает высоту тона и уменьшает интонацию. Это можно сделать так же, как работает Antares Autotune, когда вы постепенно все больше и больше наклоняете высоту звука до постоянного значения, пока оно не станет полностью монотонным.

  2. Эффект растяжения времени, который изменяет длину некоторых частей речи - возможно, постоянные голосовые фонемы, которые нарушали бы ритм речи.

Теперь, если вы решили использовать любой из этих методов, я буду честен - их не так просто реализовать в DSP, и это не будет всего лишь несколькими строками кода. Вам нужно будет поработать, чтобы понять обработку сигналов. Если вы знаете кого-то с Pro-Tools / Logic / Cubase и копией Antares Autotune, то, вероятно, стоит попробовать проверить, даст ли это тот эффект, который вы хотите, прежде чем пытаться кодировать нечто подобное самостоятельно.

Я надеюсь, что это дает вам некоторые идеи и немного помогает. Если вам нужно, чтобы я объяснил что-то из сказанного мною, дайте мне знать.


Спасибо за ваши предложения @Redeye. Растягивание по времени, к сожалению, не вариант, потому что будет условие, при котором я предоставляю им видеоинформацию, поэтому мне нужно сохранить измененную речь такой же длины, как и исходная. Искажение высоты звука - интересный подход - знаете ли вы какие-либо опубликованные ссылки, чтобы лучше объяснить этот метод?
Geek On Acid

1
Сдвиг высоты тона речи, чтобы сделать то, что ты хочешь, будет состоять из двух этапов - во-первых, анализ речи для определения текущего профиля основной частоты, затем во-вторых, смещение высоты тона. Анализ довольно прост, и есть несколько эффективных методов. Сдвиг высоты тона более сложный - я бы попробовал поискать в журнале AES опубликованные ссылки (JAES, том 47, выпуск 11, с. 928-936; ноябрь 1999 г. выглядит так, как будто это может быть полезно). Как я уже говорил ранее, вы попадаете в довольно сложную обработку, и вам, безусловно, стоит сначала попробовать ее с Autotune.
Редей

2
У Redeye есть хорошие предложения, но я просто хотел бы отметить, что для речи со сдвигом высоты тона я бы не рекомендовал фазовый вокодер или какой-либо подход в частотной области - PSOLA (добавление с синхронным высотой тона) - хороший способ, потому что он будет звучать лучше для однотонный фазовый инструмент, как голос.
Шнарф

4

Я предлагаю вам приобрести программное обеспечение для производства музыки и поиграть с ним, чтобы получить желаемый эффект. Только тогда вы должны беспокоиться о программном решении этого. (Если ваше музыкальное программное обеспечение может быть вызвано из командной строки, то вы можете вызвать его из R или MATLAB).


Еще одна возможность, которая не обсуждалась, состоит в том, чтобы полностью убрать эмоцию, используя программное обеспечение для преобразования речи в текст, чтобы создать строку, а затем программное обеспечение для преобразования текста в речь, чтобы превратить эту строку в голос робота. См. Https://stackoverflow.com/questions/491578/how-do-i-convert-speech-to-text и /programming/637616/open-source-text-to-speech-library ,

Чтобы это работало надежно, вам, вероятно, придется обучить первое программное обеспечение распознаванию говорящего.


Мне нужно отфильтровать исходные файлы, чтобы, к сожалению, вариант преобразования текста в речь на самом деле не был вариантом, хотя я мог бы подумать о некоторой изменяющейся парадигме между нормальной речью и синтетической речью.
Geek On Acid
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.