Това е продължение на моята първата статия за LPCNet. В първото демо ние представихме архитектура, съчетаваща обработка на сигналите и дълбоко машинно обучение за повишаване ефективността на синтеза на човешка реч с помощта на невронни мрежи. Този път ще превърнем LPCNet в невронен речеви кодек с много нисък битрейт, който може да се използва в днешното електронно оборудване и в телефоните.

За първи път имаме случай, в който невронен вокодер работи в реално време с помощта на само едно процесорно ядро на смартфона, а не чрез бърз графичен процесор. Използва се 1600 bit/s битрейт, което е около 10 пъти по-малко в сравнение със сега съществуващите широколентови кодеци. Но качеството е много по-добро от това на днешните кодеци с много нисък битрейт и е съпоставимо с традиционните кодеци, използващи по-висок битрейт.

Кодеци за формата на сигнала и вокодери при синтезирането на човешка реч

Има два типа речеви кодеци. Това са кодеците с променлива форма на сигнала (waveform coder) и вокодерите. Първите включват Opus, AMR/AMR-WB и всички кодеци, които се използват в музиката. Те се опитват да осигурят декодирането на формата на сигнала да бъде възможно най-близка до оригинала, като се вземат предвид някои перцептивни особености. От друга страна, за вокодерите може да се каже, че наистина са синтезатори. Предварително се извлича информацията за височината на звука и формата на вокалния тракт, след което тези данни се подават на декодера, който отново синтезира речта. Това е почти като разпознаване на реч, следвано от четенето на този текст. Само че всичко е съвсем опростено и работи бързо, в сравнение с компютърното разпознаване на речта.

Вокодерите са познати още от 70-те години, но понеже техните декодери се опитват да синтезират речта, те няма как да бъдат по-добри от стандартните системи за синтез на човешка реч, които съвсем доскоро звучаха направо ужасно. Ето защо вокодерите обикновено се използват при скорости под 3 KB/s. Всичко това продължи, докато не се появиха невронните системи за синтез на човешка реч, като например WaveNet. Синтезът на реч изведнъж започна да звучи много по-добре, може да се каже дори перфектно, и разбира се, появиха се много желаещи да си направят вокодер като WaveNet.

Какво е LPCNet

WaveNet дава много качествена реч, но иска стотици гигафлопси изчислителна мощност. LPCNet значително намали сложността на изчисленията. Вокодерът се базира на WaveRNN, която подобрява WaveNet с помощта на рекурентна невронна мрежа (RNN) и разредени матрици. LPCNet допълнително подобрява WaveRNN с помощта на линейно предсказване (LPC), което се представя добре в старите вокодери. То предсказва аудио-семпъл по линейната комбинация на предишните семпли и което е най-главното, прави всичко това многократно по-бързо от невронната мрежа. Разбира се, това не е универсален метод (иначе вокодерите от 70-те години щяха да звучат много по-добре), но сериозно намалява натоварването на невронната мрежа. По този начин става възможно да се използва невронна мрежа с много по-малък размер, отколкото WaveRNN, без това да окаже влияние на качеството.

Характеристики на компресията

LPCNet синтезира речта чрез вектор от 20 признака за всеки фрейм от 10 милисекунди. 18 от тях са кепстрални коефициенти за формата на спектъра. От останалите два признака единият се използва за стъпката на нивото (pitch period), а другият е за силата (доколко сигналът корелира със себе си, ако се въведе забавяне на един pitch period). Ако тези параметри се съхраняват във вида на числа с плаваща запетая, то цялата информация заема до 64 kb/s при запис на сигнала или при неговото предаване. Това е твърде много – дори Opus кодека осигурява качествено кодиране на речта само при 16 kb/s (за 16 KHz моно). Очевидно е, че ще трябва да се използва силна компресия.

Височината

Всички кодеци в значителна степен се базират на височината на тона. Ако височината бъде подбрана неправилно, то започва да се генерира зле звучаща реч, която често пъти е неразбираема. Без да навлизаме в подробности, енкодерът на LPCNet най-внимателно се опитва да не сгреши при определяне на височината. Търсенето на най-подходящото значение започва с търсенето на корелация по време в речевия сигнал. По долу е показано как работи това търсене.

Анимацията показва търсенето на стъпката, съответстваща на максималната корелация между сигнала x(n) и неговото леко забавено копие x(n-T). Значението на T при максимална корелация е стъпката на височината

Тази информация трябва да бъде кодирана във възможно най-малък брой битове. И понеже ние по природа възприемаме честотата по логаритмична скала, има смисъл от използването на логаритмично кодиране. Нивото на речевия сигнал при повечето хора (няма да кодираме сопрано) е в диапазона от 62,5 и 500 Hz. Със седем бита (128 значения) ножем да получим резолюция от четвърт тон (разликата между нотите до и ре е един тон)

Но хората не говорят като роботи от филмите от 60-те години. Височината на човешкия глас може да се променя дори и в рамките на един 40 ms пакет. Това трябва да се отчете и да се оставят битове за параметъра на промяната на височината: 3 бита за кодиране на разликата до два полутона между началото и края на пакета. И накрая, необходимо е да се кодира корелацията на височината на тоновете, за да можем да различаваме гласните и съгласните. За тази корелация са достатъчни два бита.

Кепстър

Докато нивата съдържат външните характеристики на речта (прозодия, емоции, акцент…), спектралната характеристика определя, какво точно е било казано (за изключение на тоналните езици, като китайския, в които различните нива са важни за смисъла). Гласните връзки дават приблизително еднакъв звук за всяка гласна, а формата на говорния апарат определя какъв звук ще бъде произнесен. Това може много ефективно да се направи, ако спектърът се преобразува в кепстър. Да обърнем внимание на този момент.

За входен сигнал с честота 16 KHz кепстърът е вектор от 18 числа за всеки 10 милисекунди, които трябва да се компресират възможно най-много. Един наш пакет е с времетраене 40 ms – тоест това са четири подобни вектора, които обикновено си приличат, а ние искаме да премахнем излишъка. Това може да стане чрез използване на съседните вектори и да използваме само разликата между предсказаното и реалното значение. В същото време, не искаме да зависим прекалено много от предишните пакети, понеже ако някой от тях бъде изгубен, резултатът не е добър.

„Ако имате само чук, всичко започва да изглежда като пирони“ – Абрахам Маслоу

Ако имате опит с видео кодеците, навярно сте се сблъскали с понятието В-фрейм. Но за разлика от видео кодеците, които разделят кадъра на множество пакети, при нас е обратното – имаме много фреймове в един пакет. Започваме с кодирането на ключовия фрейм – тоест, с независимия вектор, както и с края на пакета. Този вектор се кодира без предсказване и заема 37 бита: 7 за първия кепстрален коефициент и още 30 бита за за останалите параметри чрез използването на векторно квантуване (VQ). След това идват йерархичните В-фреймове. От двата ключови вектора (единият от текущия пакет, а другият от предишния) се прогнозира кепстъра между тях. Отново използваме векторно квантуване и кодираме получения вектор в 13 бита. По лесно е да се разбере от следното изображение:

Зелените вектори се квантуват независимо, сините – с предсказване, а червените използват предсказване без остатъчно квантуване. Предсказването е показано със стрелки

Сглобяваме всичко на едно място

Когато съберем всичко изброено дотук, получаваме 64 бита на един 40 ms пакет или 1600 бита в секунда. Да пресметнем коефициента на компресията. Широколентовата човешка реч без компресия е с битрейт около 256 Kb/s (16 KHz по 16 бита на семпъл). А това означава компресия от 160 пъти! Разбира се, могат да се променят параметрите на квантуването и да се получи по-висок или по-нисък битрейт, при което се получава по-високо или по-ниско качество на речта. Ето и таблицата, показваща за какво се използват битовете:

По 64 бита на 40 ms пакет: при 25 пакета в секунда получаваме 1600 бита в секунда.

Реализацията

Сорс кодът на LPCNet се предлага под BSD лиценза. Включена е и библиотеката, която опростява използването на кодека. Обърнете внимание, че проектът не е приключен: и форматът и API задължително ще бъдат променени. В хранилището е качено демонстрационното приложение lpcnet_demo, с помощта на което кодекът лесно може да се тества от командния ред.

Производителност

Невронният синтез на речта изисква много ресурси. На миналогодишната конференция ICASSP Бастиан Кей с колегите си от Google/DeepMind представиха кодек с 2400 бита в секунда на базата на WaveNet. Речта на тази система звучи потресаващо, но изчислителната сложност от стотици гигафлопси означава, че тази система няма как да работи в реално време без скъпи графични ускорители и сериозни усилия.

Напротив, нашият 1600 bit/s кодек има нужда само от 3 гигафлопса и е специално предназначен да работи в реално време на достъпен хардуер. На практика, той може още днес да се използва в реални приложения. При оптимизацията се наложи да се напише малко код с инструкциите AVX2/FMA и Neon (само вграден код без асемблер). Благодарение на този подход сега можем да кодираме и особено да декодираме човешка реч в режим на реално време не само в персоналните компютри, но и в по-съвременните смартфони. По-долу е показана производителността при използването на x86 и ARM процесори.

Цифрите са доста интересни. Въпреки че са показани само Broadwell и Threadripper, при x86 платформата процесорите Haswell и Skylake демонстрират сходна производителност. Но резултатите на ARM процесорите значително се различават. Дори като се отчете разликата в честотите, A76 ядрото е пет-шест пъти по-бързо от A53. Това е разбираемо, понеже A53 ядрото се използва предимно за по-висока енергийна ефективност в big.LITTLE процесорите. Но LPCNet съвсем ефективно работи в режим на реално време в по-съвременните телефони, като използва само едно ядро. Обмисляме да направим дпециална версия и за Raspberry Pi 3.

x86 процесорите си останаха загадка и не можахме да разберем, защо демонстрират токова ограничена производителност – цели 5 пъти по-ниска от теоретичния максимум. Известно е, че умножението на матрица с вектор е по-малко ефективно отколкото на матрица с матрица, понеже има повече обръщения към оперативната памет. От една страна, производителността е свързана с L2 кеша, който предоставя само 16 бита на цикъл. Но от друга страна Intel твърди, че L2 кешът може да даде до 32 бита на цикъл при Broadwell и 64 бита на цикъл при Skylake.

Чуйте сами:

Жена:

Мъж

Къде би могъл да се използва LPNet?

Ние считаме, че това е една перфектна технология, които може да бъде широко използвана. Ето някои варианти:

VoIP в държави с лоша интернет връзка

Не всички имат по 24 часа в денонощието високоскоростна връзка. Новият 1600 bit/s кодек на човешката реч нормално работи в подобни условия и дори успява да вмъкне допълнителни пакети за по-висока надеждност и по-добро качество. В този случай е по-добре да се използват по-дълги пакети – 40, 80 или 120 милисекунди.

Любителско HF радио

От десет години добре известният Дейвид Роу работи върху кодирането на речта, което да се използва в радиовръзките. Той разработи кодека Codec2, който предава глас със скорост от 700 до 3200 bit/s. Миналата година обсъдихме с него подобряването на Codec2 с помощта на невронен анализ и тази година направихме това. Дейвид описа в своя блог собствената си реализация на нов кодек на базата на LPCNet, интегриран с FreeDV.

Бъдещи планове

Предстои ни да приложим LPCNet в още много области. Така например, възможно е значително подобрение в работата на сега съществуващите кодеци. Както и всички други кодеци, Opus бързо деградира при много нисък битрейт (под 8000 bit/s). Но нашият алгоритъм за линейно предсказване е достатъчен на LPCNet, за да синтезира нормално звучаща човешка реч – много по-добре отколкото Opus може да направи при подобен битрейт. От друга страна, прогнозните алгоритми на Opus помагат на LPCNet да синтезира още по-добър резултат и тяхната съвместна работа е много удачна. Подобен подход може да се приложи и при редица други кодеци.

ДОБАВИ КОМЕНТАР

  Абонирай се  
Извести ме за