1. Sơ lược về Text-to-Speech
Text to Speech ( TTS ), hay speech synthesis – tổng hợp tiếng nói là những chiêu thức quy đổi từ văn bản ( text ) sang giọng nói – dạng như giọng nói của google translate vậy. Chủ đề này đã được điều tra và nghiên cứu và sử dụng từ những năm 60 của thế kỉ trước. Những ngày đầu, những mạng lưới hệ thống speech synthesis thường được kiến thiết xây dựng theo cách sau :
- Thu âm từng âm tiết và lưu vào trong database thành 1 tập các audio
- Tiền xử lí văn bản -> tách từ, âm vị -> xác định và tìm các đoạn audio chứa âm tương ứng trong database
- Ghép các audio, hậu xử lí, tạo ra 1 đoạn tiếng nói hoàn chỉnh
Với cách xây dựng này, giọng nói được tạo ra có chất lượng kém, mang tính “máy móc”, đều đều và không có ngữ điệu giống như người. Hơn nữa, hệ thống kiểu này phụ thuộc quá nhiều vào việc chuẩn bị dữ liệu ghi âm.
Gần đây, deep learning đã đạt được rất nhiều thành tựu trong nhiều nghành, trong đó có nghành nghề dịch vụ tổng hợp lời nói. Với sự sinh ra của một loạt những quy mô, thuật toán như Deep Voice, Nuance TTS, WaveNet, Tacotron, Tacotron2 … giọng nói sinh ra đạt được chất lượng rất tốt, có ngôn từ và xúc cảm, người nghe khó phân biệt giọng nói đó có phải người thật hay không .Trong bài viết thời điểm ngày hôm nay, mình sẽ viết về Tacotron2 – một phiên bản nâng cấp cải tiến, đơn giản hóa của Tacotron. Tacotron và tacotron2 đều do Google public cho hội đồng, là SOTA trong nghành nghề dịch vụ tổng hợp lời nói .
2. Kiến trúc tacotron 2
2.1 Mel spectrogram
Trước khi đi vào cụ thể kiến trúc tacotron / tacotron2, bạn cần đọc một chút ít về mel spectrogram. Trong nghành xử lí âm thanh và lời nói, thay vì xử lí trực tiếp data ở dạng sóng theo miền thời hạn ( 1 chuỗi rất dài ), ta sẽ chuyển âm thanh về miền tần số dạng như Spectrogram, Mel spectrogram, Mel Cepstrum, MFCC … Để hiểu rõ hơn, hãy đọc lại một chút ít kỹ năng và kiến thức trong phần 2 Speech p2 – Feature extraction MFCC. Dưới đây là một minh họa về Spectrogram của một đoạn âm thanh :
Về cơ bản, quá trình biến hóa âm thanh từ time-domain sang frequency-domain theo những bước sau :
- Chia sóng âm dạng waveform thành 1 tập các đoạn ngắn (~25ms)
- Trên mỗi đoạn âm thanh đó, biến đổi DCT / FFT để tính ra 1 dãy N magnitude (cường độ) tương ứng với N tần số. (ngoài ra 1 dãy N phase (pha) nhưng phần này thường không dùng tới). Hai bước này được gọi là STFT – Short time furier transform.
- Như vậy, ta thu được data ở dạng spectrogram có dimension = 2. Chiều ngang là trục thời gian, chiều dọc là tần số, giá trị từng điểm được biểu thị bằng màu sắc – là cường độ tần số tương ứng.
- Do độ cảm nhận của tai người là non-linear (phi tuyến tính), người ta dùng các bộ lọc mel filter bank để biến đổi từ spectrogram sang mel-spectrogram.
Về cơ bản, data âm thanh ở dạng spectrogram, MFCC … khá tựa như ảnh. Trong nhiều bài toán deep learning, ta có dùng những Convolution layer để trích xuất đặc trưng tựa như khi vận dụng với tài liệu ảnh .
2.2 Kiến trúc
Về cơ bản, tacotron và tacotron2 khá giống nhau, đều chia kiến trúc thành 2 phần riêng không liên quan gì đến nhau :
- Phần 1: Spectrogram Prediction Network – được dùng để chuyển đổi chuỗi kí tự (text) sang dạng mel-spectrogram ở frequency-domain
- Phần 2: Vocoder – Biến đổi âm thanh từ mel-spectrogram (frequency-domain) sang waveform (time-domain)
Nếu bạn vướng mắc tại sao phải chia làm 2 phần như vậy, câu vấn đáp rất đơn thuần : 1 s âm thanh ở time-domain là 1 chuỗi 16000 số. Nếu Model muốn inference trực tiếp ra 1 s âm thanh thì Mã Sản Phẩm cần 16000 step cho LSTM / GRU … Trong khi đó, trước khi tacotron sinh ra, người ta đã tìm ra giải pháp đổi khác từ spectrogram sang waveform với chất lượng tốt rồi .
2.2.1 Spectrogram Prediction Network
Kiến trúc của Spectrogram Prediction Network khá đơn thuần, theo kiến trúc Encoder-Decoder. Encoder và Decoder được liên kết với nhau bằng Location Sensitive Attention .Encoder :
- Input đầu vào được tách và mã hóa (onehot encode) ở mức kí tự
- Thêm 1 layer Character Embedding dạng Lookup table đơn giản
- Thêm 3 layer Convolution
- Thêm Bi-directional LSTM (LSTM 2 chiều).
Decoder:
- Pre-Net – bản chất là 2 fully-connected layer được dùng để lọc thông tin từ step ngay trước đó.
- 2LSTM – lấy thông tin từ Encoder thông qua Attention, kết hợp với thông tin từ step ngay trước thông qua Pre-Net.
- Linear projection – một linear layer dùng để predict ra mel spectrogram
- Post Net: 5 convolution layer được thêm vào với mục đích lọc nhiễu trên mel spectrogram
Như vậy, output của Linear Projection và PostNet được phối hợp để tạo ra target mel spectrogram .Loss function được dùng trong paper là MSE
2.2.2 Vocoder – WaveNet
Vocoder – hiểu đơn thuần là bộ phát âm, được dùng để biến hóa tài liệu từ định dạng Mel-spectrogram sang waveform ( miền thời hạn ) mà con người hoàn toàn có thể nghe được .Như mình đã nói, âm thanh dạng waveform sau khi đổi khác STFT ( Short time furier transform ), ta tách thành 2 loại thông tin : magnitude và phase ( cường độ và pha ). Spectrogram chỉ là thông tin về magnitude. Điều đó đồng nghĩa tương quan với việc cần cả magnitude và phase mới hoàn toàn có thể Phục hồi lại âm thanh bắt đầu. Như vậy, spectrogram mà Mã Sản Phẩm trả ra chưa đủ để phục dựng lại âm thanh dạng waveform .
Trước đây, tacotron sử dụng thuật toán Griffin-Lim để ước lượng ra phase dựa vào spectrogram. Sau đó khôi phục lại âm thanh dựa vào spectrogram (magnitude) và phase. Tuy nhiên cách này cho chất lượng âm thanh chưa hoàn hảo, âm thanh không trong, đôi khi xuất hiện nhiều nhiễu.
Trong tacotron2, nhóm tác giả đã tận dụng WaveNet – mô hình sinh âm thanh được nghiên cứu và điều tra trước đó vài năm ( và tất yếu vẫn là của Google ). WaveNet hoạt động giải trí dựa trên những dilation convolution. Nhìn vào hình minh họa, bạn hoàn toàn có thể thấy rằng 1 điểm tài liệu được sinh ra dựa trên những điểm tài liệu trong quá khứ. Và với dilation convolution, khoanh vùng phạm vi bao trùm được trải rộng ra hơn rất nhiều so với convolution thường thì. Để tránh dông dài và lạc đề, nếu bạn muốn đọc về WaveNet, hãy đọc tại deepmind.com/wavenet .
WaveNet nguyên bản là loại non-conditional network, tức không nhận input nào mà chỉ sinh ngẫu nhiên các đoạn âm thanh vô nghĩa. Tuy nhiên trong Tacotron2, nhóm tác giả sử dụng a modified version of WaveNet
which generates time-domain waveform samples conditioned on the
mel spectrogram. Tức WaveNet được thiết kế để nhận input là dạng mel spectrogram, output ra waveform tương ứng.
Sau này, khi implement thuật toán, nhiều người đã thay thế sửa chữa wavenet bằng những Model tương tự như. VD phiên bản của NVIDIA sử dụng WaveGlow – một phiên bản nâng cấp cải tiến được nhìn nhận tốt và nhanh hơn WaveNet
3. Một vài thông tin hữu ích
Trong bài viết này mình không hướng dẫn implement thuật toán ( vì thực tiễn tốn rất nhiều công sức của con người ). Tuy nhiên, bạn hoàn toàn có thể đọc bài viết ung-dung-deep-learning-sinh-ra-audio-truyen-ma-khong-lo của anh Phạm Văn Toàn. Bài viết có hướng dẫn bạn ứng dụng open source code của NVIDIACó nhiều phiên bản implement của Tacotron2, trong đó bản NVIDIA / tacotron2 và Rayhane-mamah / Tacotron-2 được nhìn nhận cao và sử dụng thoáng rộng .Sau tacotron2, có khá nhiều bản nâng cấp cải tiến, sửa đổi, vận dụng một vài kĩ thuật mới … Tính tới thời gian hiện tại, hoàn toàn có thể tacotron2 không còn là thuật toán tốt nhất nữa. Tuy nhiên tacotron và tacotron2 vẫn là nền tảng chính của những thuật toán SOTA lúc bấy giờ .
4. Tham khảo
https://arxiv.org/pdf/1712.05884.pdf
https://deepmind.com/blog/article/wavenet-generative-model-raw-audiohttps://medium.com/spoontech/tacotron2-voice-synthesis-model-explanation-experiments-21851442a63cCảm ơn bạn đã đón đọc, hẹn gặp lại ở những bài tới !
Source: https://wincat88.com
Category: BLOG