
Tổng quan dự án
Quy trình này dùng để tạo giọng nói thân mật song ngữ Trung-Anh tự nhiên, liền mạch. Nguyên tắc cốt lõi không phải là yêu cầu mô hình chuyển văn bản thành giọng nói mô phỏng mọi âm thanh, mà là chia sản phẩm hoàn chỉnh thành các track có chức năng khác nhau: ElevenLabs phụ trách lời thoại và biểu hiện hơi thở,素材 thực tế phụ trách tiếng hôn và âm thanh môi trường, ffmpeg phụ trách cắt, thay đổi tốc độ, trộn và ghép, còn Whisper đóng vai trò công cụ kiểm tra chất lượng.
Kết luận quan trọng nhất: Mô hình giọng nói chỉ phụ trách “lời nói” và hơi thở hòa vào nhịp nói. Các hiệu ứng phi ngôn ngữ như tiếng hôn, âm thanh ướt nên được tạo riêng, sau đó trộn với giọng nói.
Quy trình trong README được thực hiện trên Mac mini, nhưng phương pháp này không phụ thuộc vào một mẫu Mac cụ thể. Chỉ cần hệ thống có thể gọi ElevenLabs API, chạy ffmpeg và sử dụng Whisper để phiên âm là có thể tái hiện các bước chính.
Công cụ cốt lõi và chức năng
- ElevenLabs: Tạo chất giọng bằng Voice Design và dùng mô hình chuyển văn bản thành giọng nói để tạo lời thoại.
- ffmpeg: Chuẩn hóa tần số lấy mẫu, làm chậm tốc độ nói, cắt素材, thêm hiệu ứng fade in/fade out, trộn và ghép âm thanh.
- Whisper: Kiểm tra xem素材 phi ngôn ngữ có bị mô hình đọc thành các từ có thể nhận diện hay không.
- Bản ghi âm thực tế được cấp phép hợp pháp: Cung cấp âm thanh môi trường riêng biệt. Quy trình gốc chỉ sử dụng素材 CC0 thuộc phạm vi công cộng và ghi lại nguồn.
Cài đặt và chuẩn bị trước khi bắt đầu
1. Chuẩn bị ElevenLabs
Đăng ký ElevenLabs và lấy thông tin xác thực có thể gọi các API Voice Design và chuyển văn bản thành giọng nói. Các API thực tế cần dùng gồm POST /v1/text-to-voice/design và POST /v1/text-to-voice.
Trước tiên, gửi voice_description cùng văn bản thử giọng để nhận nhiều bản xem trước ứng viên; sau khi chọn được ứng viên, dùng generated_voice_id của ứng viên đó để lưu chất giọng chính thức. Sau khi lưu thành công, ghi lại voice_id; mọi bước tổng hợp sau đó đều sử dụng ID này.
2. Cài đặt ffmpeg
Đảm bảo terminal có thể thực thi trực tiếp ffmpeg. Trên macOS, có thể cài đặt thông qua trình quản lý gói phổ biến. Sau khi cài đặt, chạy lệnh sau để kiểm tra:
ffmpeg -version
3. Chuẩn bị Whisper
Trong quy trình này, Whisper không dùng để tạo âm thanh mà đóng vai trò “đầu dò kiểm tra giọng”. Công cụ sẽ kiểm tra các đoạn tiếng hôn hoặc phi ngôn ngữ ứng viên: nếu có thể phiên âm ổn định thành từ ngữ, điều đó thường cho thấy mô hình thực chất đang đọc các từ tượng thanh chứ không tạo ra âm thanh phi ngôn ngữ thực sự.
4. Thiết lập thư mục素材
Nên phân loại tệp theo chức năng từ trước, ít nhất gồm đầu ra giọng nói, ứng viên tiếng hôn,素材 tiếng hôn đã qua sàng lọc, âm thanh môi trường gốc, các đoạn cửa sổ môi trường đã cắt và tệp trộn cuối cùng. Cách này giúp tránh đưa素材 ứng viên chưa được kiểm duyệt trực tiếp vào sản phẩm hoàn chỉnh.
Bước 1: Thiết kế chất giọng song ngữ Trung-Anh
Dùng mô tả bằng văn bản thay vì chỉ chọn trong thư viện giọng
Theo các thử nghiệm trong README, một số giọng tiếng Trung có sẵn có thể mang âm accent khi nói tiếng Anh, trong khi việc mô tả rõ nền tảng song ngữ thông qua Voice Design dễ tạo ra kết quả tự nhiên hơn ở cả tiếng Trung và tiếng Anh. Mô tả nên nêu rõ bốn loại thông tin: năng lực ngôn ngữ mẹ đẻ, độ tuổi, mối quan hệ hoặc khí chất nhân vật và cảm xúc mục tiêu.
Dưới đây là mô tả được dùng trong quy trình gốc, có thể điều chỉnh theo yêu cầu nhân vật:
Native bilingual speaker of Mandarin Chinese (standard putonghua) and American English,
both at native level, with no cross-language accent in either. Male, 35–40. Studio quality.
Persona: mature, dominant, doting. Emotion: composed, doting, low-burning.
Rich, chesty, slightly gravelly low voice; unhurried, even pacing with weight on key words
and a breathy softness at the ends of sentences.
Đừng dùng nội dung quảng cáo làm văn bản thử giọng. Nên chọn những câu nhân vật thực sự sẽ nói trong đời thường và tạo nhiều ứng viên từ cùng một mô tả. Khi nghe thử, hãy ưu tiên đánh giá xem giọng đó có giống nhân vật mục tiêu đang nói tự nhiên hay không, thay vì chỉ so sánh độ trầm hoặc độ dễ nghe của giọng.
Chọn mô hình phù hợp
- Hội thoại thông thường: README khuyến nghị v3, phù hợp để thể hiện cảm xúc đời thường từ nội dung văn bản.
- Cuộc gọi thời gian thực hoặc bối cảnh thân mật: Khuyến nghị v4. Mô hình này phù hợp hơn khi xử lý tiếng Trung, tiếng Anh và văn bản xen kẽ Trung-Anh trong cùng một chất giọng, đồng thời dễ nhận biết các thẻ hướng dẫn giọng nhẹ.
- Đoạn dài hoàn toàn bằng tiếng Anh: Nếu không dùng v4, có thể chọn
eleven_turbo_v2_5và đặt rõlanguage_code=enđể giảm accent tiếng Trung trong tiếng Anh.
Điều chỉnh tham số giọng
Điểm khởi đầu được thử nghiệm trong README như sau:
stability=0.35: Mức biến đổi và tính kịch tính rõ hơn.stability=0.5: Gần với cách nói đời thường hơn, có thể giảm cảm giác “diễn quá mức”.similarity_boost=0.8: Dùng để duy trì tính nhất quán của chất giọng mục tiêu.style=0.3: Ghi chú gốc cho biết v3 không nhận diện tham số này, vì vậy không nên dựa vào nó để điều khiển v3.
Khi gỡ lỗi, mỗi lần chỉ thay đổi một biến. Hãy giữ lại một tệp âm thanh chuẩn đã được đánh giá tốt, sau đó chỉ điều chỉnh độ ổn định hoặc một thẻ duy nhất để có thể xác định chính xác nguyên nhân của thay đổi.
Bước 2: Hòa hơi thở vào nhịp nói
Chỉ thêm thẻ khi thay đổi cách thể hiện
Đừng thêm thẻ vào mọi câu. Với mỗi nhóm từ sáu đến mười câu, thường chỉ cần hai hoặc ba thẻ nhẹ; các câu sau có thể tiếp tục cách thể hiện trước đó. Những từ thường dùng trong quy trình gốc gồm low, close, quiet, soft và unhurried.
[low and close to her ear, unhurried]
……过来。别躲。
……靠近一点。对。
[quiet laugh under the breath]
……急什么。
Các từ mạnh như intense, heavy, growl, strained và rough không hoàn toàn không thể dùng, nhưng trong các thử nghiệm ban đầu chúng dễ khiến giọng trở nên cường điệu. Chiến lược đáng tin cậy hơn là hạ thấp, đưa giọng lại gần và nói chậm, thay vì yêu cầu mô hình diễn quá mạnh.
Dùng dấu câu để định hình hơi thở
Thay vì lặp đi lặp lại heavy breathing, thêm vừa phải dấu “……” ở đầu, cuối hoặc giữa câu thường dễ tạo ra khoảng dừng tự nhiên hơn. Mỗi nhóm chỉ nên bố trí hai hoặc ba nhịp thở rõ ràng và thay đổi cách thể hiện, chẳng hạn thở ra nhẹ, dừng giữa câu, nín thở trong chốc lát, thở ra kèm tiếng cười hoặc ngắt nửa âm.
Việc lặp lại cùng một kiểu thở sẽ làm lộ cảm giác trùng lặp. Sau khi tạo, cần nghe toàn bộ đoạn thay vì chỉ kiểm tra từng câu.
Cố gắng tạo cả đoạn cùng lúc
Khi tạo một đoạn hoàn chỉnh trong một lần, hơi thở, cảm xúc và cao độ dễ duy trì tính liên tục hơn. Nếu tổng hợp riêng tám câu rồi ghép lại, mỗi khối sẽ giống như bắt đầu lại từ đầu. Nếu cuộc gọi thời gian thực không thể tạo cả đoạn, có thể chia thành các khối hai câu hoặc khoảng bốn mươi chữ Hán, tránh chia một câu thành một khối.
Truyền ngữ cảnh
v4 hỗ trợ previous_text và next_text. Khi tạo từng khối, truyền văn bản trước và sau cho mô hình có thể giảm cảm giác đọc máy móc. README đặc biệt lưu ý v3 không hỗ trợ hai trường này; truyền chúng cho v3 có thể gây lỗi, vì vậy cần xây dựng yêu cầu riêng cho từng mô hình.
Tránh định tuyến ngôn ngữ sai
Nếu chương trình quyết định mô hình hoặc ngôn ngữ dựa trên tỷ lệ chữ Hán, phải loại bỏ các thẻ tiếng Anh trong ngoặc vuông trước. Nếu không, một câu tiếng Trung rất ngắn có thể bị nhận nhầm là tiếng Anh vì chứa nhiều thẻ tiếng Anh. Khi dùng v4, có thể giữ nguyên một mô hình để giảm việc chuyển đổi giữa tiếng Trung và tiếng Anh.
Bước 3: Kiểm soát tốc độ nói
Trong các thử nghiệm ban đầu, tham số speed của v4 không tạo ra hiệu quả như mong đợi. Để làm v4 chậm hơn, trước tiên hãy thêm các khoảng dừng tự nhiên vào văn bản, sau đó dùng ffmpeg để làm chậm mà vẫn giữ cao độ:
ffmpeg -i input.mp3 -filter:a "atempo=0.9" output.mp3
Khi dùng mô hình turbo cho tiếng Anh thuần túy, điểm khởi đầu được ghi nhận trong README là speed=0.84, đồng thời có thể thêm khoảng dừng giữa các câu:
<break time="0.4s"/>
Đừng chồng quá nhiều thẻ dừng trong một đoạn. Thử nghiệm gốc khuyến nghị tối đa khoảng sáu thẻ; quá nhiều có thể khiến đầu ra không ổn định.
Bước 4: Xây dựng thư viện素材 tiếng hôn có thể tái sử dụng
Vì sao không viết trực tiếp từ tượng thanh
Khi yêu cầu mô hình chuyển văn bản thành giọng nói đọc các từ tượng thanh của tiếng hôn, kết quả thường là âm tiết hoặc âm thanh có cảm giác như chữ cái có thể nhận diện, chứ không phải âm thanh phi ngôn ngữ tự nhiên. Chỉ viết thẻ hành động cũng có thể biến thành tiếng ngân bình thường. Vì vậy, dự án gốc áp dụng phương án thư viện素材: “tạo hàng loạt trước, sau đó cắt và sàng lọc”.
Các bước thực hiện
- Dùng cùng một chất giọng và cùng một đoạn văn có hành động hôn để tạo đầy đủ năm đến sáu lần. Quy trình gốc dùng v4 và
stability=0.35. - Dùng tính năng phát hiện khoảng lặng hoặc công cụ chỉnh sửa âm thanh để cắt các đoạn phi ngôn ngữ ứng viên trong mỗi đầu ra.
- Dùng Whisper để phiên âm từng đoạn. Loại trực tiếp các đoạn có thể phiên âm thành ký tự hoặc từ rõ ràng.
- Kiểm tra tỷ lệ giữa năng lượng sai phân và năng lượng gốc. Trong thử nghiệm ban đầu, các đoạn đáng tin cậy thường cao hơn 0.2; các đoạn bị đọc thành từ khoảng 0.12 đến 0.16; tiếng ngân thông thường thường thấp hơn 0.1. Những con số này xuất phát từ素材 cụ thể và chỉ phù hợp làm tham chiếu ban đầu.
- Nghe thủ công các素材 đã vượt qua kiểm tra, sau đó phân loại theo hôn nhẹ, hôn sâu hơn và thay đổi vị trí.
- Khi gọi, chọn ngẫu nhiên các đoạn chưa được dùng gần đây, đồng thời chỉ thay đổi nhẹ cao độ và tốc độ không quá khoảng 3%. Quy trình gốc chỉ cho phép làm chậm, không tăng tốc.
Sàng lọc tự động không thể thay thế việc nghe thủ công. README từng ghi nhận một đoạn có tiếng rít kéo dài; Whisper đã phiên âm thành kết quả tương tự Sssss, nhưng do sơ suất kiểm tra nên đoạn này vẫn được đưa vào sản phẩm. Quy trình đúng phải đồng thời kiểm tra văn bản phiên âm, chỉ số dạng sóng và cảm nhận khi nghe thực tế.
Bước 5: Hoàn thiện bản trộn hai track bằng âm thanh môi trường thực tế
Chọn素材
Quy trình gốc đã so sánh ba phương án: để mô hình giọng nói mô phỏng, sử dụng công cụ tạo hiệu ứng âm thanh bằng AI và dùng bản ghi âm thực tế. Cuối cùng, phương án được chọn là素材 thực tế CC0 không có giọng người và có giấy phép rõ ràng. Trước khi sử dụng bất kỳ bản ghi bên ngoài nào, cần kiểm tra giấy phép và lưu lại thông tin nguồn.
Không nhân âm lượng theo một hệ số cố định
Độ lớn trung bình và đỉnh của các bản ghi môi trường có thể chênh lệch đáng kể, đồng thời có thể chứa những khoảng im lặng dài. Áp dụng trực tiếp một hệ số âm lượng cố định dễ khiến âm thanh hoàn toàn không nghe thấy hoặc lấn át giọng nói. Cách ổn định hơn là:
- Cắt ngẫu nhiên hai cửa sổ có độ dài gần bằng giọng nói từ素材 gốc.
- Đo đỉnh âm lượng của hai cửa sổ và chọn cửa sổ có nhiều âm thanh hữu ích hơn.
- Tính gain để đỉnh âm lượng của âm thanh môi trường xấp xỉ đỉnh của giọng nói hiện tại trừ 12 dB.
- Thêm fade in 0,5 giây cho âm thanh môi trường.
- Giữ lại khoảng 1 giây âm cuối sau khi giọng nói kết thúc và dùng fade out khoảng 1,4 giây.
- Nếu bản thân素材 tiếng hôn đã có chất âm tương ứng, không chồng thêm âm thanh môi trường.
Ví dụ trộn bằng ffmpeg
Giả sử giọng nói là v.mp3, cửa sổ âm thanh môi trường đã cắt là w.wav, GAIN là gain tính được sau khi căn chỉnh đỉnh và END là vị trí bắt đầu fade out:
ffmpeg -i v.mp3 -i w.wav -filter_complex \
"[1:a]volume=GAIN,afade=t=in:st=0:d=0.5,afade=t=out:st=END-1.4:d=1.4[w];\
[0:a]apad=pad_dur=1.0[v];[v][w]amix=inputs=2:duration=first:normalize=0[a]" \
-map "[a]" -c:a libmp3lame -q:a 2 out.mp3
normalize=0 rất quan trọng. Theo thử nghiệm trong README, nếu bỏ qua tham số này, amix có thể làm giọng nói nhỏ đi rõ rệt.
Tách thẻ trộn khỏi thẻ đọc
Có thể dùng các thẻ như [low, close, wet] trong giai đoạn viết, đồng thời coi wet là thẻ trộn hậu kỳ. Trước khi gửi yêu cầu đến mô hình giọng nói, chương trình phải xóa từ này để tránh mô hình cố thể hiện hiệu ứng âm thanh; sau khi giọng nói trả về, mới chồng素材 thực tế tương ứng theo thẻ. Khi thẻ tiếp theo không còn chứa thẻ đó, âm thanh môi trường cũng nên fade out.
Bước 6: Tạo track giọng nói hoàn chỉnh
Chia kịch bản thành ba loại khối: khối lời thoại thông thường gửi vào bộ chuyển văn bản thành giọng nói; khối phi ngôn ngữ thuần túy chọn từ thư viện素材; khối có thẻ âm thanh môi trường trước tiên tạo giọng nói, sau đó thực hiện trộn hai track.
Các tệp âm thanh từ những nguồn khác nhau có thể có tần số lấy mẫu khác nhau. Trước khi ghép, nên chuẩn hóa chúng, chẳng hạn chuyển đổi về 44100 Hz:
ffmpeg -i input.wav -ar 44100 output.wav
Sau khi đã chuẩn hóa tần số lấy mẫu, dùng bộ lọc concat của ffmpeg để ghép thành một tệp theo thứ tự trong kịch bản. Sau khi ghép xong, nên nghe thử từ đầu đến cuối, đặc biệt kiểm tra xem âm sắc, tiếng nền, âm lượng và nhịp thở giữa các đoạn có thay đổi đột ngột hay không.
Bước 7: Dùng cho cuộc gọi thời gian thực
Điểm cốt lõi của chế độ thời gian thực là giảm thời gian chờ nhưng vẫn giữ được ngữ cảnh. Có thể chia thành các đoạn dựa trên những nhãn nằm trên từng dòng riêng, để các câu tiếp theo không có nhãn mới kế thừa giọng hiện tại. Gửi yêu cầu tạo giọng sau khi tích lũy được hai câu hoặc khoảng bốn mươi chữ Hán.
- Trong khi phát đoạn hiện tại, tạo trước đoạn tiếp theo ở chế độ nền.
- Truyền cho v4 câu trước và câu sau của đoạn hiện tại.
- Với các đoạn hoàn toàn không có lời, lấy trực tiếp từ hộp tư liệu, không yêu cầu chuyển văn bản thành giọng nói nữa.
- Chỉ bật micro sau khi phát xong câu cuối, tránh để các âm thanh chồng lên nhau.
- Nếu tổng hợp thất bại, chỉ hiển thị văn bản hoặc tạm thời giữ im lặng, không chuyển tạm sang một giọng khác.
Việc đổi giọng giữa chừng gây đứt gãy nhân vật thường dễ nhận thấy hơn khoảng dừng khoảng một giây. Vì vậy, nên ưu tiên duy trì giọng nhân vật nhất quán.
Kỹ thuật gỡ lỗi nâng cao
Thiết lập mẫu đối chiếu cố định
Lưu một tệp âm thanh chuẩn đã được xác nhận là tự nhiên. Mỗi lần chỉ thay đổi một yếu tố trong số độ ổn định, nhãn, dấu câu, mô hình hoặc tốc độ hậu kỳ, rồi nghe mù và so sánh với phiên bản chuẩn.
Phân tách nhãn tạo giọng và nhãn hậu kỳ
Mô hình giọng nói chỉ nhận các nhãn về giọng mà nó cần thể hiện; âm thanh môi trường, loại tư liệu và cường độ trộn thuộc về siêu dữ liệu hậu kỳ, phải được loại bỏ trước khi gửi yêu cầu. Nhờ đó, mô hình sẽ không đọc thành tiếng chỉ thị sản xuất hoặc cố bắt chước hiệu ứng âm thanh.
Lưu lịch sử sử dụng gần đây
Duy trì một hàng đợi sử dụng gần đây cho hộp tư liệu, chẳng hạn tránh mười đoạn đã dùng gần nhất. Cách này giúp giảm cảm giác lặp lại và ổn định hơn so với việc chọn hoàn toàn ngẫu nhiên mỗi lần.
Tự động hóa ngưỡng chất lượng
Có thể thêm các bước kiểm tra sau vào quy trình xuất:
- Whisper có nhận dạng ra những từ không nên xuất hiện hay không.
- Chênh lệch đỉnh âm lượng giữa giọng người và âm thanh môi trường có gần với giá trị mục tiêu hay không.
- Tần số lấy mẫu đã được thống nhất hay chưa.
- Phần kết đầu ra có giữ lại âm ngân tự nhiên hay không.
- Mô hình dùng cho yêu cầu có hỗ trợ các tham số được truyền vào hay không.
- Đã xóa các nhãn tiếng Anh trước khi phát hiện ngôn ngữ hay chưa.
Chi phí, cấp phép và giới hạn nội dung
README ghi nhận việc sử dụng gói Creator, có giá 22 đô la mỗi tháng và hạn mức khoảng 120.000 chữ; lần đầu thiết kế giọng tiêu tốn khoảng 3.000 chữ, còn mức sử dụng hằng ngày dao động từ vài trăm đến 2.000 chữ. README cũng đề cập rằng v4 khi đó có ưu đãi trong thời gian giới hạn, vì vậy giá, hạn mức và cách tính phí thực tế cần được đối chiếu với trang chính thức tại thời điểm sử dụng.
Mọi nội dung chỉ được đề cập đến những người trưởng thành rõ ràng. Không sử dụng thiết lập nhân vật có thể bị hiểu là người chưa thành niên hoặc cách diễn đạt tuổi mơ hồ. Nền tảng sẽ kiểm duyệt dựa trên văn bản; nội dung vi phạm có thể khiến tài khoản bị vô hiệu hóa.
Khi sử dụng bản ghi âm của người khác, phải xác nhận quyền được cấp phép. Dù tư liệu có thể được tải xuống miễn phí, điều đó không có nghĩa là được phép phân phối lại hoặc sử dụng cho mục đích thương mại. Quy trình ban đầu chỉ sử dụng tư liệu CC0 và ghi lại nguồn của từng tệp.
Kết luận
Giọng thân mật tự nhiên không thể đạt được chỉ bằng cách chồng thêm các nhãn mạnh. Phương pháp đáng tin cậy hơn là để mô hình giọng nói tập trung vào lời thoại, cảm xúc nhẹ và nhịp thở, tách âm thanh không lời thành các tư liệu đã được sàng lọc qua chuyển lời và nghe thử thủ công, rồi dùng ffmpeg để khớp đỉnh âm lượng, xử lý tăng giảm âm lượng và ghép nối.
Hãy bắt đầu từ phiên bản tối thiểu: trước tiên tạo một cặp giọng song ngữ ổn định, sau đó xác minh việc tạo toàn bộ đoạn và truyền ngữ cảnh, rồi mới thêm hộp tư liệu và âm thanh môi trường. Ở mỗi bước, giữ lại mẫu chuẩn và chỉ điều chỉnh một biến; cách này thường dễ tạo ra kết quả tự nhiên, nhất quán và có thể tái sử dụng hơn việc liên tục thêm nhãn.
