Параметрично деградують мовлення, щоб видалити емоційний зміст


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). Розпізнавання мовлення за допомогою насамперед часових підказів. Наука , 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.
Redeye

2
У Redeye є хороші пропозиції, але я б просто зазначив, що для мови зсуву висоти я не рекомендую фазовий вокодер або будь-який підхід до частотної області - PSOLA (додавання синхронного синхронного накладу) - хороший спосіб, оскільки це буде звучати краще для монофонічний фазовий інструмент, як голос.
шнарф

4

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


Ще одна можливість, про яку не обговорювалося, - повністю викреслити емоцію, використовуючи мовленнєве текстове програмне забезпечення для створення рядка, а потім програмне забезпечення для тексту для мовлення, щоб перетворити цю струну в голос робота. Дивіться /programming/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.