Cách tạo NeuTTS-air tạo ra hơn 200 giây âm thanh trong một giây
Mô tả ngắn gọn
- 6 min read
Cách để NeuTTS-air tạo hơn 200 giây âm thanh chỉ trong một giây
NeuTTS-air là một mô hình chuyển văn bản thành giọng nói (TTS) chất lượng cao với 0.5 tỷ tham số, có khả năng tạo ra giọng nói dựa trên văn bản nhập vào. Mô hình này có thể tạo ra giọng nói chân thực, biểu cảm và sao chép giọng nói. Tuy nhiên, với các GPU hiện có, nó tương đối chậm.
Vì vậy, tôi đã thử nghiệm tối ưu hóa đáng kể mô hình này để nó có thể tạo ra hàng phút âm thanh chỉ trong vài giây. Tất cả các bài kiểm tra hiệu năng đều được thực hiện trên một GPU 4070 Ti Super duy nhất.
Tối ưu hóa LLM (Mô hình ngôn ngữ lớn)
LLM trong NeuTTS-air chỉ có 0.5 tỷ tham số và là một mô hình Qwen2LM tiêu chuẩn, do đó có nhiều thư viện để tối ưu hóa nó. Đây thực sự là một phần “dễ dàng”. Tôi đã sử dụng thư viện LMdeploy đã được tối ưu hóa cực kỳ tốt để chạy LLM 0.5 tỷ tham số.
Có nhiều lý do tôi chọn LMdeploy thay vì các thư viện nhanh khác như vllm, sglang, v.v.:
- Cài đặt đơn giản: vllm/sglang/tensorrt_llm thường gây ra các vấn đề phụ thuộc nếu không có môi trường ảo (venv) hoàn toàn sạch sẽ.
- Windows: LMdeploy hoạt động trên Windows mà không cần cài đặt tùy chỉnh hoặc làm giảm tốc độ.
- Cực kỳ nhanh: Nhanh hơn vllm và luôn sánh ngang với sglang/tensorrt_llm, nếu không muốn nói là nhanh hơn trong cả các lô đơn lẻ và lô lớn hơn.
- Độ trễ thấp: Lmdeploy có độ trễ cực kỳ thấp, dưới 50ms.
Do đó, LMdeploy rõ ràng là lựa chọn tốt nhất.
Phát hiện trong quá trình tối ưu hóa LLM
Để cải thiện tốc độ hơn nữa, tôi cũng đã sử dụng các kỹ thuật nâng cao trong lmdeploy như bộ nhớ đệm tiền tố (prefix caching) và bộ nhớ đệm kv INT8. Nhìn chung, chúng có vẻ tốt, nhưng một số thông tin tôi tìm hiểu được về chúng là:
- Bộ nhớ đệm tiền tố cải thiện đáng kể tốc độ xử lý theo lô với chi phí độ trễ. Vì vậy, kho lưu trữ có tùy chọn tắt bộ nhớ đệm tiền tố, đây là một ý tưởng tốt cho việc truyền phát dữ liệu.
- Bộ nhớ đệm KV INT8 cũng giúp ích cho việc xử lý theo lô vì nó lưu trữ ngữ cảnh ở định dạng INT8 thay vì BF16 mặc định, giúp tiết kiệm VRAM. Chất lượng có giảm nhẹ nhưng không đáng kể.
Một điểm quan trọng khác tôi nhận thấy là NeuTTS-air không hoạt động với kiểu dữ liệu float16 mà chỉ hoạt động với kiểu dữ liệu bfloat16 hoặc float32. Do đó, thật không may, bất kỳ GPU nào cũ hơn Ampere như T4/20xx sẽ không hoạt động với LMdeploy. Vllm hỗ trợ kiểu dữ liệu float32, hoạt động trên các GPU cũ hơn nhưng chậm hơn nhiều so với LMdeploy. Vì vậy, thay vì sử dụng 2 thư viện riêng biệt và tạo ra nhiều mã phức tạp, tôi tin rằng bước đi tốt nhất là chỉ sử dụng LMdeploy.
Bộ giải mã thần kinh (Neural codec)
NeuTTS-air có thể sử dụng hai bộ giải mã riêng biệt. Nó có thể sử dụng bộ giải mã neucodec cơ bản, rất giống với kiến trúc của xcodec2.
Tóm tắt kiến trúc:
- Bộ mã hóa ngữ nghĩa wav2vec2, mã hóa “ý nghĩa” của âm thanh.
- Bộ mã hóa âm thanh bigcodec, mã hóa thông tin “âm thanh” của âm thanh.
- Bộ giải mã vocos để giải mã các token trở lại thành âm thanh.
Tuy nhiên, một điểm khác biệt quan trọng là trong khi xcodec2 giải mã các token thành âm thanh 16kHz, thì neucodec giải mã các token thành âm thanh 24kHz.
NeuTTS-air còn có một bộ giải mã khác tên là neucodec-distill, có bộ giải mã giống hệt nhưng bộ mã hóa nhanh hơn nhiều. Nó thực hiện hai sửa đổi đơn giản:
- Bộ mã hóa âm thanh BigCodec –> Bộ mã hóa âm thanh SQCodec (nhanh hơn nhiều).
- Bộ mã hóa ngữ nghĩa Wav2Vec2 –> Bộ mã hóa ngữ nghĩa DistillHubert (nhỏ hơn nhiều).
Do đó, tôi đã sử dụng distill-neucodec để cải thiện đáng kể tốc độ mã hóa.
Kiến trúc Distill NeuCodec:
Tối ưu hóa bộ giải mã thêm nữa
Sử dụng distill neucodec hoạt động tốt cho các đoạn âm thanh vài giây, nhưng ngay khi tôi bắt đầu tạo ra các đoạn âm thanh dài hàng phút, neucodec nhanh chóng trở thành nút thắt cổ chai thay vì LLM.
Vì vậy, tôi đã tối ưu hóa thêm bằng cách chia tất cả các token được tạo bởi LLM thành các nhóm 50. Sau đó, xử lý giải mã âm thanh theo lô, điều này cải thiện đáng kể tốc độ so với giải mã âm thanh tuần tự. Bản thân neucodec đã nhanh hơn 400 lần so với thời gian thực, lên tới 800 lần so với thời gian thực, đây là một cải tiến lớn về tốc độ đầu cuối.
Điều này dẫn đến tốc độ đầu cuối cuối cùng là 211 lần nhanh hơn thời gian thực khi sử dụng tệp test.txt làm đầu vào trong kho lưu trữ!
Kiến trúc đầy đủ:
Các bước tiếp theo
Vẫn còn nhiều điều mới cần triển khai, nhưng rõ ràng là tôi không thể triển khai mọi thứ cùng một lúc. Tuy nhiên, một số tính năng trong tương lai tôi sẽ bổ sung là:
- Mô hình đa ngôn ngữ: Đã có nhiều mô hình neutts được tải lên cho tiếng Hindi, tiếng Pháp, tiếng Hà Lan, tiếng Tây Ban Nha.
- Mô hình đa giọng nói: Tạo giọng nói ở các định dạng podcast sẽ hữu ích cho nhiều người.
- Suy luận trực tuyến: Tạo giọng nói với độ trễ 100ms và hỗ trợ nhiều người dùng đồng thời.
Cảm ơn bạn đã đọc bài viết này. Sẽ rất tuyệt nếu bạn ủng hộ kho lưu trữ bằng cách nhấn vào biểu tượng ngôi sao và tôi sẽ sẵn lòng giúp sửa lỗi hoặc triển khai các tính năng mới.
Liên kết kho lưu trữ: https://github.com/ysharma3501/FastNeuTTS
Mô hình NeuTTS gốc: https://huggingface.co/neuphonic/neutts-air
Link bài viết gốc
- Tags:
- Ai
- 2 Days Ago
- Huggingface.co