Chuyển đến nội dung
Chandler Nguyen
AI12 phút đọc

Tôi đã thử thay ElevenLabs bằng một ứng dụng giọng nói local trên Mac 16 GB

VoiceStudio từng lên GitHub Trending với tư cách một giải pháp thay ElevenLabs chạy hoàn toàn local. Tôi cài nó trên chiếc Mac 16 GB, gặp những lỗi chẳng ai demo, rồi dùng pipeline còn trụ lại để tạo các phiên bản tiếng Trung và tiếng Hàn cho khóa học của mình.

Tháng 9, VoiceStudio từng đứng #1 trên GitHub Trending. Điều khiến tôi chú ý là phần mô tả: giải pháp open source thay ElevenLabs, chạy hoàn toàn local — clone giọng nói, lồng tiếng, danh mục 646 ngôn ngữ, không cần tài khoản, không cần API key, không phải trả tiền theo ký tự.

Tôi đã trả ElevenLabs gần $200 cho phần narration tiếng Anh và tiếng Nhật. Vì vậy, đây không phải câu hỏi suông. Một chiếc Mac 16 GB có chạy nổi thứ này không? Cài đặt có khó không? Giọng có đủ tốt để dùng cho khách hàng trả phí không? Và nếu câu trả lời là có, chính xác thì ElevenLabs đang bán thứ gì mà một app local không thể có?

Lịch sử git của thử nghiệm này chạy từ 17 tháng 10 năm 2026 (commit spec TTS local đầu tiên) đến 26 tháng 10 (cả hai bản localized đã hoàn thành). Tổng cộng chín ngày, không phải một quý. Bộ audio tiếng Trung và tiếng Hàn đều đã hoàn tất: mỗi bộ 258 cặp, thời lượng narration là 3 giờ 06 phút và 3 giờ 25 phút.

VoiceStudio thực chất là gì

VoiceStudio là một app desktop, không phải script Python mà bạn phải trông coi. Nó bọc một API local và đưa danh mục 16 engine TTS cùng 11 engine nhận dạng lời nói vào một giao diện. App chạy trên macOS, Windows, Linux và Docker. App dùng giấy phép AGPL-3.0 (kho mã nguồn, truy cập ngày 25 tháng 10 năm 2026).

Đến ngày 25 tháng 10, repository có khoảng 85,000 star, khoảng sáu tháng sau khi được tạo ngày 9 tháng 4 năm 2026. Nó từng là repository đứng đầu GitHub Trending trong ít nhất hai ngày của tháng 9. Giấy phép là điều bất ngờ đầu tiên. App là open source; còn weights của model không mặc nhiên dùng cùng giấy phép. Engine mặc định OmniVoice có điều khoản riêng, và các weights pretrained của nó có giấy phép phi thương mại (trang model, truy cập ngày 25 tháng 10 năm 2026). CosyVoice 3 — engine cuối cùng tôi chọn dùng — dùng Apache-2.0. VoxCPM2 cũng dùng Apache-2.0.

Đó là bài học thực sự đầu tiên. "Giải pháp open source thay ElevenLabs" là mô tả về ứng dụng. Nó không mô tả weights, giọng nói hay output. Nếu bạn dùng thứ này cho công việc có thu phí, bạn phải tự điều tra giấy phép của từng engine.

Một chiếc Mac 16 GB có chạy được không?

Có. Nhưng không phải lúc nào cũng tốt, và không phải engine nào bạn muốn cũng chạy được.

Phần cài đặt không khó. Cài app, mở lên, chọn engine, để nó tải weights. Phần khó là tìm một engine có thể chạy xong batch 258 slide trên chiếc máy này mà không sập.

Tôi thử VoxCPM2 trước. Nó chạy trên MPS của Apple và nghe tốt. Nhưng khi chạy dưới tải trên chiếc Mac Apple Silicon 16 GB, bộ nhớ trống tụt xuống còn khoảng 8%, swap vượt 9 GB và các request bị timeout. Một lần chạy thử module 1 chỉ tạo được 1 trong 36 slide trước khi tôi dừng. Model không tạo ra giọng tệ; nó không thể hoàn tất một batch dài khi bộ nhớ chịu áp lực.

Tôi chuyển sang CosyVoice 3 chạy trên CPU. Nó hoàn tất khối lượng công việc. Clip tham chiếu phải dài 30 giây hoặc ngắn hơn, một giới hạn thật sự khi bạn clone giọng nói. Mẫu 30 giây tôi dùng là audio mono 24 kHz.

Rồi batch vẫn hỏng — vì một lý do chẳng liên quan gì đến model.

Lỗi tưởng như do model

Sau một giờ, tôi mới có 4 trên 258 cặp audio. Log cho thấy các lần retry, rồi lỗi 429 từ worker pool local, rồi các job mồ côi. Kết luận hiển nhiên là engine local không xử lý nổi tiếng Trung.

Thực ra xử lý được. Vấn đề nằm ở fetch của Node. Timeout mặc định cho headers của nó là năm phút. Một số slide tiếng Trung cần năm đến bảy phút để tổng hợp. Client bỏ request trong khi worker vẫn đang tạo, rồi retry và đưa job thứ hai cho cùng slide vào hàng đợi. Hàng đợi đầy những việc chẳng còn ai chờ.

Retry không phải cách sửa lỗi nếu server vẫn đang xử lý request mà bạn đã bỏ.

Khi phần tổng hợp giọng nói chuyển sang transport http/https của Node với timeout dài hơn, module 1 hoàn thành 36/36. Checkpoint tiếng Trung hoàn chỉnh đầu tiên đạt 258/258 cặp và 3 h 05 m 57 s narration. Từ file đầu đến file cuối mất 28 h 12 m 41 s thời gian theo đồng hồ — con số này gồm cả lỗi, tạm dừng, hardening và retry, không phải một benchmark tổng hợp sạch. Slide tệ nhất mất 37 phút qua ba lần thử.

Đó là bức tranh thật của inference local. Model không phải chiếc hộp thần biến text thành audio với tốc độ như demo. Nó là một job batch có đuôi rất dài, và phần engineering nằm chính ở cái đuôi đó.

Chiếc máy quyết định kiến trúc

Mac 16 GB không phải server TTS. Slide bình thường xong trong 2–6 phút; những slide bệnh lý mất 13–23. Slide tệ nhất mất 37m 09s qua ba lần thử. Mọi cải tiến nghiêm túc trong pipeline đều nhằm sống sót qua chiếc máy chậm này, chứ không phải để thắng dịch vụ hosted về tốc độ.

Những cơ chế còn trụ lại:

  • Một điểm tách TtsEngine, để có thể chọn rõ narration local hoặc hosted thay vì hardcode. Điểm tách này được thêm ngày 19 tháng 10; phần chọn local xuất hiện ngày 21 tháng 10.
  • Một timeout transport thật sự, vì mặc định năm phút ngắn hơn cả thời gian xử lý.
  • Các lock single-run và worker, dừng khi lỗi, drain worker trước khi retry, vì retry vào một engine đang bận không phải là retry.
  • Các chunk câu có thể resume, vì chạy lại từ đầu một slide 30 phút sẽ lãng phí tài nguyên khan hiếm duy nhất của máy.
  • Thay thế an toàn, vì một bản thu mới bị lỗi không được phá bản thu cũ còn tốt.
  • Reset worker theo từng module, để phòng memory drift trong một lần chạy dài.
  • Chuẩn hóa sample rate, vì một lần ghép đã tạo track audio dài 63 phút do nối các đoạn 24 kHz và 44.1 kHz. File trông có vẻ ổn cho đến khi tôi kiểm tra thời lượng.
  • caffeinate -i, được ghi lại vào 24 tháng 10 — ngày thứ tám. Tôi đã chạy các batch nhiều giờ trên một chiếc Mac hoàn toàn có thể chợp mắt. Đây là dòng ít tinh vi nhất trong pipeline và có lẽ cũng quan trọng nhất. Tôi thấy mình quá noob. Và đúng là noob thật.

Điểm mấu chốt không phải pipeline này ấn tượng. Mà là pipeline chính là sản phẩm. Tám ngày được dùng để khiến một engine local chậm chạp vận hành như hạ tầng: dừng khi lỗi, chạy tiếp từ chỗ gãy, không bao giờ thay một bản thu tốt bằng bản chưa kiểm chứng, và giữ cho máy không ngủ.

Vì sao thiếu tiếng Quảng Đông

Ngày 21 tháng 10, tôi bỏ tiếng Quảng Đông khỏi kế hoạch. Lý do nằm ở bằng chứng, không phải ý thức hệ: chưa có đường chạy local cho tiếng Quảng Đông nào được kiểm chứng cho khóa học này. VoxCPM2 không hỗ trợ yue. CosyVoice có liệt kê yue, nhưng tôi chưa kiểm chứng nó cho khóa học này. Tôi có thể đã phát hành một phiên bản dựa trên phỏng đoán, hoặc dùng một giọng mà chưa ai từng nghe bằng ngôn ngữ đó. Một phiên bản tiếng Quảng Đông sai còn tệ hơn không có phiên bản nào. Site vẫn có locale zh-HK cho bài viết; khóa học dùng tiếng Trung giản thể, không phải tiếng Trung phồn thể hay tiếng Quảng Đông.

Pipeline có thể tạo file bằng một ngôn ngữ mà model chưa được kiểm chứng. Cổng chặn phải là một con người nói không.

258/258 không đồng nghĩa với đúng

Checkpoint tiếng Trung hoàn chỉnh đầu tiên có 16 slide thiếu ít nhất một câu. Số lượng slide thì đúng. Các cặp audio đều tồn tại. Nhưng narration vẫn sai ở mười sáu slide. Chúng được phát hiện bằng cách kiểm tra mức độ bao phủ text so với script, rồi sửa từng slide một.

Điều đó làm tiêu chuẩn kiểm tra thay đổi. "Tất cả file đều tồn tại" trở thành "tất cả file đều tồn tại, narration bao phủ script, và một mẫu của mỗi module đã được nghe". Điều kiện đạt là phải khớp hoàn toàn; một batch báo xanh không phải sản phẩm.

Chất lượng đã đủ tốt chưa?

Những mẫu đã sửa mà tôi nghe đủ tốt cho khóa học này; còn nghiệm thu toàn bộ là một cổng kiểm tra riêng. Đây là quyết định của tôi với tư cách chủ sản phẩm, không phải một chứng nhận.

Tôi đã dùng ASR local để transcribe audio rồi so với script. Điểm trung bình của các lần spot-check đầu tiên là 0.903. Điểm trung bình của checkpoint tiếng Trung hoàn chỉnh là 0.908. Đây là điểm tương đồng text đã chuẩn hóa, không phải thước đo độ tự nhiên hay mức giống giọng người nói. Slide tệ nhất — module 4, slide 8 — được 0.776; ASR nghe nhầm tên một thương hiệu. Một slide code-switch ở module 6 tạo ra nội dung vô nghĩa, rồi lặp một đoạn, rồi bị cắt cụt; chia chunk theo câu đã sửa nó, đạt 0.909.

Giọng này rõ, nhất quán và vẫn nhận ra là giọng tôi — theo tai tôi. Nó không có độ mượt của ElevenLabs. Các bản tiếng Trung và tiếng Hàn chưa được người bản ngữ chỉnh sửa từng câu; tôi review chúng bằng một trình biên tập AI và tự nghe các mẫu. Giới hạn này cần nằm trên trang khóa học, không chỉ trong một bài blog.

Nếu tiêu chuẩn của bạn là "nghe như voice-over phòng thu", hãy thuê người. Nếu tiêu chuẩn là "rõ, nhất quán, là giọng mình và đủ tốt để giảng dạy", local giờ đã là lựa chọn khả thi.

Chi phí là bao nhiêu

ElevenLabs: gần $200 cho narration tiếng Anh và tiếng Nhật, gồm cả voice clone.

Local: một chiếc Mac, không phát sinh hóa đơn TTS theo ký tự cho các lần chạy này, không tốn tiền TTS hay ASR cloud. Checkpoint tiếng Trung đầu tiên tốn 28 giờ đồng hồ để có 3 giờ audio, cộng thêm thời gian engineering và QA trong bảng phía trên. Điện năng tiêu thụ không được đo.

$200 đó mua một giọng nói, một workflow và uptime do người khác lo. Còn đường local mang lại ít phụ thuộc hơn vào một API narration hosted, việc xử lý giọng nói ở local và một hóa đơn không tăng sau mỗi lần render lại — với cái giá là nhiều ngày engineering cho một timeout vốn không nằm trong model. Phần nháp bản dịch vẫn dùng Claude trên cloud; chỉ narration và ASR chạy trên Mac.

Vậy ElevenLabs phòng thủ được đến đâu?

Ở đây tôi phải cẩn thận, vì một khóa học trên một chiếc Mac không phải một thị trường.

Thứ thay đổi đối với khối lượng công việc này là phần chi phí narration tăng thêm. Nếu bạn được phép clone giọng, công việc chạy theo batch, bạn kiểm chứng được output và chấp nhận được đuôi chậm, inference local loại bỏ chi phí theo ký tự của một lượt chạy thêm hoặc một ngôn ngữ khác. Đây là một cân nhắc thật sự cho developer đang chọn API cho pipeline batch.

Những gì dịch vụ hosted vẫn mang lại thì khó thay thế hơn:

  • Một trần chất lượng. Giọng local tôi thử không phải giọng hosted hay nhất tôi từng nghe.
  • Độ trễ. Một batch local mất vài phút cho mỗi slide. Một sản phẩm trả lời real-time là bài toán kỹ thuật khác.
  • Độ tin cậy vận hành. Tôi đã phải debug timeout năm phút, trần bộ nhớ, việc drain worker và vấn đề giấy phép.
  • Quyền đối với giọng nói và tuân thủ. Clone giọng là một vấn đề pháp lý, không phải tính năng. Việc dùng API hosted không chuyển giao trách nhiệm của khách hàng trong việc bảo đảm họ có quyền và sự đồng thuận.
  • Độ bao phủ. CosyVoice liệt kê hỗ trợ bốn ngôn ngữ launch của tôi; tôi đã kiểm chứng tiếng Trung, còn tiếng Hàn đang được kiểm chứng. Một sản phẩm toàn cầu cần nhiều hơn thế.

Kết luận trung thực hẹp hơn câu "open source giết ElevenLabs". Inference local đã thay đổi phép tính cho khối lượng render lại theo batch của tôi. Nó không thay sản phẩm bạn tìm đến khi cần độ trễ trong tương tác, danh mục giọng đa dạng, hỗ trợ có hợp đồng hay một trần chất lượng cụ thể. Đó là những phán đoán của tôi từ một dự án, không phải dự báo thị trường.

Vì sao chuyện này trở thành câu chuyện về khóa học

Ban đầu, tôi không định viết về model giọng nói. Tôi định phát hành một khóa học bằng nhiều ngôn ngữ hơn mức tự mình có thể làm.

Chính mô hình vận hành được dạy trong khóa học đã tạo ra bản tiếng Trung và đang tạo bản tiếng Hàn: nghiên cứu, lập kế hoạch, xây pipeline, kiểm chứng output, giữ lại những phần con người phải chịu trách nhiệm. Một người làm vận hành quảng cáo, Claude để nháp bản dịch, một giọng open-weights local cho narration, không đơn vị bản địa hóa, không phòng lồng tiếng.

Đó là cách tôi áp dụng một số phần của mô hình vận hành vào sản phẩm của chính mình.

Nếu bạn làm quảng cáo và đang tự hỏi AI là mối đe dọa hay đòn bẩy, đây là phiên bản đòn bẩy. Bạn không cần một đội lớn. Bạn cần gu, một checklist và sự sẵn sàng debug chặng cuối.

Tôi sẽ nói gì với một developer khác

  • Hãy thử local khi bạn được phép clone giọng, công việc chạy theo batch, bạn kiểm chứng được output và chấp nhận được đuôi chậm.
  • Hãy trả tiền cho dịch vụ hosted khi bạn cần độ trễ real-time, danh mục giọng đa dạng, uptime theo hợp đồng hoặc một trần chất lượng cụ thể.
  • Kiểm tra giấy phép weights trước khi xây sản phẩm có thu phí dựa trên một app "open source". AGPL-3.0 cho phép dùng thương mại theo các điều kiện của nó; weights của model và quyền đối với giọng nói là hai vấn đề riêng.
  • Hãy test trường hợp xấu nhất, không phải demo. Trường hợp xấu nhất không phải prompt dài hơn. Đó là một slide dài có code-switch, timeout transport và hàng đợi retry cùng lúc.

FAQ

Một chiếc Mac 16 GB có chạy clone giọng nói local được không?

Có. CosyVoice 3 chạy trên CPU; VoxCPM2 cần dư địa bộ nhớ nhiều hơn chiếc máy này có khi chịu tải. Mỗi slide sẽ mất vài phút, không phải vài giây.

TTS open source có đủ tốt cho một khóa học trả phí không?

Các mẫu tiếng Trung đã sửa mà tôi nghe thì rõ và nhất quán, chứ không mượt như phòng thu. Đây là quyết định của tôi với tư cách chủ sản phẩm, không phải thẩm định của người bản ngữ.

VoiceStudio có miễn phí cho mục đích thương mại không?

App dùng AGPL-3.0, giấy phép cho phép sử dụng thương mại theo các điều kiện của nó. Weights của model có giấy phép riêng; weights pretrained của OmniVoice là phi thương mại. Kiểm tra từng engine trước khi phát hành.

Các phiên bản tiếng Trung và tiếng Hàn có được AI dịch không?

Có — bản nháp do Claude tạo, rồi được review bằng một trình biên tập AI chứ không phải người bản ngữ. Narration và ASR chạy local, lần lượt với CosyVoice 3 và model transcribe local; phần nháp bản dịch dùng cloud.

Một khóa học 258 slide mất bao lâu?

Checkpoint tiếng Trung: 28 giờ đồng hồ cho 3 h 06 m audio, gồm cả lỗi và retry, sau đó là lượt sửa 16 slide. Checkpoint tiếng Hàn: 31 giờ cho 3 h 25 m, gồm cả việc phải đi vòng vì worker bị kẹt và sửa hai slide.

Khóa học

Khóa học là AI-Native Media Operations — bảy module, mười sáu template và narration bằng tiếng Anh, tiếng Nhật, tiếng Trung giản thể và tiếng Hàn.