Pengodean suara 1600bit / s dengan neural vocoder LPCNet



Ini adalah kelanjutan dari artikel pertama tentang LPCNet . Dalam demo pertama, kami mempresentasikan arsitektur yang menggabungkan pemrosesan sinyal dan pembelajaran mendalam untuk meningkatkan efektivitas sintesis pidato saraf. Kali ini kita akan mengubah LPCNet menjadi codec pidato saraf dengan bitrate sangat rendah (lihat artikel ilmiah ). Itu dapat digunakan pada peralatan saat ini dan bahkan pada ponsel.

Untuk pertama kalinya, seorang neoder vocoder bekerja secara real time pada satu inti prosesor ponsel, dan bukan pada GPU berkecepatan tinggi. Bitrate akhir 1600 bps adalah sekitar sepuluh kali lebih sedikit daripada codec broadband biasa. Kualitasnya jauh lebih baik daripada vocoders yang ada dengan bitrate sangat rendah dan sebanding dengan codec yang lebih tradisional yang menggunakan bitrate lebih tinggi.

Encoder dan Vocoder Gelombang


Ada dua jenis besar codec ucapan: codec bentuk gelombang dan vocoder. Encoder bentuk gelombang termasuk Opus, AMR / AMR-WB, dan semua codec yang dapat digunakan untuk musik. Mereka mencoba untuk menyediakan bentuk gelombang yang didekodekan sedekat mungkin dengan aslinya - biasanya dengan mempertimbangkan beberapa fitur persepsi. Vocoder, di sisi lain, sebenarnya adalah synthesizer. Encoder mengekstrak informasi tentang pitch dan bentuk jalur bicara, meneruskan informasi ini ke decoder, dan dia menyintesis ulang pidato. Ini hampir seperti pengenalan ucapan diikuti dengan membaca teks dalam synthesizer ucapan, kecuali bahwa pengkodean teks lebih sederhana / lebih cepat daripada pengenalan suara (dan menyampaikan sedikit informasi lebih lanjut).

Vocoder sudah ada sejak tahun 70-an, tetapi karena decoder mereka melakukan sintesis wicara, mereka tidak bisa jauh lebih baik daripada sistem sintesis wicara konvensional, yang sampai saat ini terdengar hanya mengerikan. Inilah sebabnya mengapa vocoders biasanya digunakan pada kecepatan di bawah 3 kB / s. Selain itu, pembuat enkode gelombang hanya memberikan kualitas terbaik. Ini berlanjut sampai baru-baru ini, ketika sistem sintesis pidato saraf seperti WaveNet muncul . Tiba-tiba, sintesis mulai terdengar jauh lebih baik, dan, tentu saja, ada orang yang ingin membuat vocoder dari WaveNet .

Ikhtisar LPCNet


WaveNet menghasilkan ucapan berkualitas tinggi, tetapi membutuhkan ratusan gigaflop daya komputasi. LPCNet secara signifikan mengurangi kompleksitas komputasi. Vokoder didasarkan pada WaveRNN, yang meningkatkan WaveNet menggunakan jaringan saraf berulang (RNN) dan matriks jarang. LPCNet lebih lanjut meningkatkan WaveRNN dengan prediksi linier (LPC), yang berkinerja baik di vocoders yang lebih tua. Ini memprediksi sampel dari kombinasi linear dari sampel sebelumnya dan, yang paling penting, membuatnya berkali-kali lebih cepat daripada jaringan saraf. Tentu saja, ini tidak universal (jika tidak, vokalis tahun 70-an akan terdengar hebat), tetapi ini dapat secara serius mengurangi beban pada jaringan saraf. Ini memungkinkan Anda untuk menggunakan jaringan yang lebih kecil dari WaveRNN tanpa mengorbankan kualitas.


Mari kita lihat lebih dekat pada LPCNet. Bagian kuning di sebelah kiri dihitung sekali per frame, dan outputnya digunakan untuk frekuensi pengambilan sampel jaringan di sebelah kanan (biru). Unit komputasi memprediksi sampel pada waktu t berdasarkan sampel sebelumnya dan koefisien prediksi linier

Karakteristik kompresi


LPCNet mensintesis ucapan dari vektor 20 karakter per bingkai selama 10 ms. Dari jumlah tersebut, 18 tanda adalah koefisien cepstral yang mewakili bentuk spektrum. Dua sisanya menggambarkan tinggi: satu parameter untuk periode pitch (periode pitch), dan yang lainnya untuk kekuatan (seberapa besar sinyal berkorelasi dengan dirinya sendiri, jika Anda memperkenalkan penundaan oleh pitch). Jika Anda menyimpan parameter dalam bentuk nilai floating point, maka semua informasi ini memakan waktu hingga 64 kbit / s selama penyimpanan atau transmisi. Ini terlalu banyak, karena bahkan codec Opus menyediakan pengodean suara berkualitas sangat tinggi hanya pada 16 kbit / s (untuk mono 16 kHz). Jelas, Anda perlu menerapkan kompresi kuat di sini.

Tinggi


Semua codec sangat bergantung pada pitch, tetapi tidak seperti encoders bentuk gelombang, di mana pitch "hanya" membantu mengurangi redundansi, vocoder tidak memiliki cadangan. Jika Anda memilih ketinggian yang salah, mereka akan mulai menghasilkan suara yang terdengar buruk (atau bahkan tidak terbaca). Tanpa merinci (lihat artikel ilmiah), pembuat kode LPCNet berusaha keras untuk tidak membuat kesalahan dalam hal ketinggian. Pencarian dimulai dengan pencarian korelasi waktu dalam sinyal ucapan. Lihat di bawah ini cara kerja pencarian biasa.


Pitch adalah periode di mana pitch diulang. Animasi mencari langkah yang sesuai dengan korelasi maksimum antara sinyal x (n) dan salinan x (nT) dengan penundaan. Nilai T dengan korelasi maksimum adalah tinggi nada

Informasi ini perlu dikodekan dengan sesedikit mungkin bit tanpa menurunkan hasilnya terlalu banyak. Karena kita melihat frekuensi secara alami pada skala logaritmik (misalnya, setiap oktaf musik menggandakan frekuensi sebelumnya), masuk akal dalam pengkodean logaritmik. Ketinggian sinyal bicara pada kebanyakan orang (kami tidak mencoba untuk menutupi sopran di sini) adalah antara 62,5 dan 500 Hz. Dengan tujuh bit (128 nilai yang mungkin) kami mendapatkan resolusi sekitar seperempat nada (perbedaan antara dan sebelum dan kembali adalah satu nada).

Jadi, dengan ketinggian selesai? Yah, tidak secepat itu. Orang tidak berbicara seperti robot dari film tahun 1960-an. Nada suara dapat bervariasi bahkan dalam paket 40 milidetik. Anda perlu mempertimbangkan hal ini, meninggalkan bit sebagai parameter untuk mengubah ketinggian: 3 bit untuk mengkodekan perbedaan hingga 2,5 semiton antara awal dan akhir paket. Akhirnya, Anda perlu kode korelasi langkah-langkah pitch, membedakan antara vokal dan konsonan (misalnya, s dan f). Dua bit sudah cukup untuk korelasi.

Cepstrum


Sementara pitch berisi karakteristik eksternal dari bicara (prosodi, emosi, penekanan, ...), karakteristik spektral menentukan apa yang dikatakan (kecuali untuk bahasa nada seperti Cina, di mana pitch penting untuk makna). Tali suara menghasilkan suara yang kira-kira sama untuk setiap vokal, tetapi bentuk saluran vokal menentukan suara mana yang akan diucapkan. Jalur suara bertindak sebagai filter, dan tugas pembuat enkode adalah mengevaluasi filter ini dan meneruskannya ke dekoder. Ini dapat dilakukan secara efektif jika Anda mengubah spektrum ke cepstrum (ya, ini adalah "spektrum" dengan urutan huruf yang berubah, ini adalah kami orang-orang lucu dalam pemrosesan sinyal digital).

Untuk sinyal input pada 16 kHz, cepstrum pada dasarnya mewakili vektor 18 angka setiap 10 ms, yang perlu dikompresi sebanyak mungkin. Karena kami memiliki empat vektor dalam paket 40 ms dan biasanya mirip satu sama lain, kami ingin menghilangkan redundansi sebanyak mungkin. Ini dapat dilakukan dengan menggunakan vektor tetangga sebagai prediktor dan hanya menyampaikan perbedaan antara prediksi dan nilai sebenarnya. Pada saat yang sama, kami tidak ingin terlalu bergantung pada paket sebelumnya jika salah satunya hilang. Sepertinya masalahnya sudah diselesaikan ...

Jika Anda hanya memiliki palu, semuanya terlihat seperti paku - Abraham Maslow.

Jika Anda banyak bekerja dengan codec video , maka Anda mungkin menemukan konsep B-frame. Tidak seperti codec video, yang membagi bingkai menjadi banyak paket, kami, sebaliknya, memiliki banyak bingkai dalam satu paket. Kita mulai dengan menyandikan bingkai kunci , yaitu, vektor independen, dan akhir paket. Vektor ini dikodekan tanpa prediksi, menempati 37 bit: 7 untuk energi total (koefisien cepstral pertama) dan 30 bit untuk parameter lain menggunakan vektor kuantisasi (VQ). Lalu datanglah B-frame (hierarkis). Dari dua kata kunci (satu dari paket saat ini dan satu dari yang sebelumnya), sebuah cepstrum di antaranya diperkirakan. Sebagai prediktor untuk mengkodekan perbedaan antara nilai riil dan prediksi, Anda dapat memilih salah satu dari dua bingkai kunci atau nilai rata-rata mereka. Kami menggunakan VQ lagi dan menyandikan vektor ini menggunakan total 13 bit, termasuk pilihan prediktor. Sekarang kita hanya memiliki dua vektor tersisa dan sangat sedikit bit. Gunakan 3 bit terakhir untuk memilih prediktor untuk vektor yang tersisa. Tentu saja, semua ini jauh lebih mudah dipahami dalam gambar:


Prediksi dan kuantisasi cepstrum untuk paket k. Vektor hijau dikuantisasi secara independen, vektor biru diprediksi, dan vektor merah menggunakan prediksi tanpa kuantisasi residual. Prediksi ditunjukkan oleh panah.

Menyatukan semuanya


Menambahkan semua hal di atas, kita mendapatkan 64 bit per paket 40 milidetik atau 1600 bit per detik. Jika Anda ingin menghitung rasio kompresi, maka ucapan broadband terkompresi adalah 256 kbps (16 kHz pada 16 bit per sampel), yang berarti rasio kompresi 160 kali! Tentu saja, Anda selalu dapat bermain dengan quantizer dan mendapatkan bitrate yang lebih rendah atau lebih tinggi (dengan efek yang sesuai pada kualitas), tetapi Anda harus memulai dari suatu tempat. Berikut adalah tabel dengan tata letak tempat bit-bit ini pergi.

Alokasi bit
ParameterSedikit
Pitch pitch6
Modulasi tinggi3
Korelasi ketinggian2
Energi7
VP Cepstrum Independen (40 ms)30
Diprediksi VQ Cepstrum (20 ms)13
Interpolasi cepstrum (10 ms)3
Total64

Pada 64 bit per paket 40 ms, pada 25 paket per detik, 1600 bps diperoleh.

Implementasi


Kode sumber LPCNet tersedia di bawah lisensi BSD. Ini termasuk perpustakaan yang menyederhanakan penggunaan codec. Harap perhatikan bahwa pengembangan belum selesai: baik format dan API terikat untuk berubah. Repositori juga memiliki aplikasi demo lpcnet_demo di mana mudah untuk menguji codec dari baris perintah. Lihat file README.md untuk instruksi lengkap.

Yang ingin menggali lebih dalam, ada pilihan untuk melatih model baru dan / atau menggunakan LPCNet sebagai blok bangunan untuk aplikasi lain, seperti sintesis ucapan (LPCNet hanya satu komponen synthesizer, tidak melakukan sintesis sendiri).

Performa


Sintesis ucapan saraf membutuhkan banyak sumber daya. Pada konferensi ICASSP tahun lalu, Bastian Klein dan rekan-rekannya dari Google / DeepMind menyajikan codec 2.400 bps berbasis WaveNet , menerima bitstream dari codec2. Meskipun kedengarannya luar biasa, kompleksitas komputasi ratusan gigaflops berarti bahwa itu tidak dapat diluncurkan secara real-time tanpa GPU yang mahal dan upaya yang serius.

Sebaliknya, codec 1600 bit / s kami hanya menghasilkan 3 gigaflops dan dirancang untuk bekerja secara real time pada peralatan yang jauh lebih terjangkau. Bahkan, ini dapat digunakan hari ini dalam aplikasi nyata. Diperlukan pengoptimalan menulis beberapa kode untuk set instruksi AVX2 / FMA dan Neon (hanya kode tertanam, tanpa assembler). Berkat ini, kita sekarang dapat menyandikan (dan terutama men-decode) ucapan secara real time tidak hanya pada PC, tetapi juga pada ponsel yang kurang lebih modern. Di bawah ini adalah kinerja prosesor x86 dan ARM.

Performa
CPUFrekuensi% dari satu intiKe waktu nyata
AMD 2990WX (Threadripper)3,0 GHz *14%7.0x
Intel Xeon E5-2640 v4 (Broadwell)2,4 GHz *20%5.0x
Snapdragon 855 (Cortex-A76 di Galaxy S10 )2,82 GHz31%3.2x
Snapdragon 845 (Cortex-A75 pada Pixel 3 )2,5 GHz68%1.47x
AMD A1100 (Cortex-A57)1,7 GHz102%0,98x
BCM2837 (Cortex-A53 pada Raspberry Pi 3)1,2 GHz310%0,32x
* mode turbo


Jumlahnya cukup menarik. Meskipun hanya Broadwell dan Threadripper yang ditampilkan, pada platform x86, prosesor Haswell dan Skylake memiliki kinerja yang sama (dengan mempertimbangkan frekuensi clock). Namun, prosesor ARM terasa berbeda satu sama lain. Bahkan dengan mempertimbangkan perbedaan frekuensi A76 adalah lima hingga enam kali lebih cepat daripada A53: itu cukup diharapkan, karena A53 terutama digunakan untuk efisiensi energi (misalnya, dalam sistem big.LITTLE). Namun demikian, LPCNet dapat bekerja secara real time pada telepon modern, hanya menggunakan satu inti. Meskipun akan menyenangkan untuk menjalankannya secara real time di Raspberry Pi 3. Sekarang ini jauh, tetapi tidak ada yang mustahil.

Pada x86, alasan pembatasan kinerja adalah lima kali maksimum teoretis. Seperti yang Anda ketahui, operasi penggandaan matriks-vektor kurang efisien daripada operasi matriks-matriks karena ada lebih banyak unduhan per operasi - khususnya, satu unduhan matriks untuk setiap operasi FMA. Di satu sisi, kinerja terkait dengan cache L2, yang hanya menyediakan 16 bit per siklus. Di sisi lain, Intel mengklaim bahwa L2 dapat memberikan hingga 32 bit per siklus di Broadwell dan 64 bit per siklus di Skylake.

Hasil


Kami melakukan tes audio gaya MUSHRA untuk membandingkan kualitas pengkodean. Kondisi pengujian:

  • Contoh : asli (jika Anda mendapatkan hasil yang lebih baik dari aslinya, jelas ada yang salah dengan tes Anda)
  • 1600 bps LPCNet : demo kami
  • LPNet Terkompresi : β€œLPNet dengan 122 Unit Setara” dari artikel pertama
  • Wideband Opus 9000 bps : bitrate terendah di mana Opus 1.3 mengkodekan audio broadband
  • MELP pada 2400 bps : vocoder terkenal dengan bit rate rendah (kualitasnya mirip dengan codec2)
  • Speex 4000 bps : vocoder broadband ini tidak boleh digunakan, tetapi ini adalah referensi yang bagus untuk bagian bawah

Dalam tes pertama (set 1), kami memiliki delapan fragmen pidato dari dua pria dan dua wanita. File di set pertama milik database yang sama (mis., Kondisi rekaman yang sama) yang digunakan untuk pelatihan, tetapi orang-orang tertentu ini dikecualikan dari set pelatihan. Dalam tes kedua (set 2), kami menggunakan beberapa file dari tes Opus (tidak dikompresi), merekam suara dalam kondisi yang berbeda, untuk memastikan bahwa LPCNet pergi ke beberapa generalisasi. Di kedua tes, masing-masing 100 peserta, sehingga kesalahannya cukup kecil. Lihat hasil di bawah ini.


Kualitas Subyektif (MUSHRA) dalam Dua Tes

Secara umum, LPCNet pada 1600 bps terlihat bagus - jauh lebih baik daripada MELP pada 2400 bps, dan tidak jauh di belakang Opus pada 9000 bps. Pada saat yang sama, kualitas LPCNet yang tidak terkompresi sedikit lebih baik daripada Opus pada 9000 bps. Ini berarti bahwa adalah mungkin untuk memberikan kualitas yang lebih baik daripada Opus dengan laju bit dalam kisaran 2000-6000 bps.

Dengarkan dirimu sendiri


Berikut adalah contoh dari tes audio:

Wanita (set 1)


Man (set 1)


Campur (set 2)



Di mana ini bisa digunakan?


Kami percaya bahwa ini adalah teknologi yang keren, tetapi juga memiliki aplikasi praktis. Berikut ini beberapa opsi.

VoIP di negara-negara yang terhubung dengan buruk


Tidak semua orang selalu memiliki koneksi berkecepatan tinggi. Di beberapa negara, komunikasi sangat lambat dan tidak dapat diandalkan. Codec pidato 1600-bit bekerja secara normal dalam kondisi seperti itu, bahkan mengirimkan paket beberapa kali untuk keandalan. Tentu saja, karena overhead header paket (40 byte untuk IP + UDP + RTP), lebih baik membuat paket yang lebih besar: 40, 80, atau 120 ms.

Radio Amatir / HF


Selama sepuluh tahun sekarang, David Rowe telah bekerja pada coding pidato untuk komunikasi radio. Ia mengembangkan Codec2 , yang mentransmisikan suara dengan kecepatan 700 hingga 3200 bps. Selama setahun terakhir, David dan saya membahas cara meningkatkan Codec2 menggunakan sintesis saraf, dan sekarang kami akhirnya melakukannya. Dalam blognya, David menulis tentang implementasi codec berbasis LPCNet untuk integrasi dengan FreeDV .

Peningkatan Keandalan dalam Paket Hilang


Kemampuan untuk menyandikan bitstream kualitas yang layak dalam sejumlah kecil bit berguna untuk menyediakan redundansi pada saluran yang tidak dapat diandalkan. Opus memiliki mekanisme koreksi kesalahan maju (FEC) yang dikenal sebagai LBRR, yang mengkodekan frame sebelumnya dengan bitrate lebih rendah dan mengirimkannya dalam frame saat ini. Ini bekerja dengan baik, tetapi menambahkan overhead yang signifikan. Duplikasi aliran 1600 bit / s jauh lebih efisien.

Paket


Ada banyak kemungkinan untuk menggunakan LPCNet. Misalnya, meningkatkan codec yang ada (Opus yang sama). Seperti pada codec lain, kualitas Opus menurun cukup cepat pada bitrate sangat rendah (di bawah 8000 bps), karena codec gelombang tidak memiliki bit yang cocok dengan aslinya. Tetapi informasi prediksi linear yang ditransmisikan cukup untuk LPCNet untuk mensintesis pidato yang terdengar layak - lebih baik daripada yang dapat dilakukan oleh Opus pada bitrate ini. Selain itu, sisa informasi yang dikirimkan oleh Opus (perkiraan residu) membantu LPCNet mensintesis hasil yang lebih baik. Dalam arti tertentu, LPCNet dapat digunakan sebagai post-filter mewah untuk meningkatkan kualitas Opus (atau codec lainnya) tanpa mengubah bitstream (mis., Sambil mempertahankan kompatibilitas penuh).

Sumber Daya Tambahan


  1. J.-M. Valin, J. Skoglund, 1,6 kbps wideband neural vocoder menggunakan LPCNet , Dikirim ke Interspeech 2019 , arXiv: 1903.12087 .
  2. J.-M. Valin, J. Skoglund, LPCNet: Sintesis Neural Speech Lanjutan Melalui Prediksi Linier , Proc. ICASSP, 2019 , arXiv: 1810.11846 .
  3. A. van den Oord, S. Dileman, H. Zen, K. Simonyan, O. Vinyals, A. Graves, N. Kalkhbrenner, E. Senor, K. Kavukuglu, WaveNet: model generatif untuk suara yang tidak diproses , 2016.
  4. N. Karlhbrenner, E. Elsen, C. Simonyan, S. Nouri, N. Casagrande, E. Lockhart, F. Stimberg, A. van den Oord, S. Dileman, K. Kavukuglu, Sintesis suara saraf yang efektif , 2018.
  5. V.B.Klein, F.S.K. Lim, A.Lyubs, J.Skoglund, F. Stimberg, K. Wang, T.S. Walters, pengkodean ucapan bitrate rendah berdasarkan Wavenet , 2018
  6. Kode sumber LPCNet.
  7. Codec untuk FreeDV berdasarkan LPCNet oleh David Rowe.
  8. Bergabunglah dengan diskusi tentang pengembangan di #opus di irc.freenode.net (β†’ antarmuka web )

Source: https://habr.com/ru/post/id446656/


All Articles