Xưởng giọng cho AI agent · tiếng Việt

Giọng đọc đã được kiểm,
sắc thái do kịch bản điều khiển

Clone một giọng thì dễ. Có được một giọng đọc đúng văn bản của mình, đổi sắc thái khi ý nghĩa đổi, và lặp lại y hệt khi chạy lại — đó mới là phần khó. Repo này là quy trình cho phần khó đó, chạy hoàn toàn trên máy bạn.

  • 19 lệnh
  • 6 cổng kiểm
  • 7 tài liệu skill
  • CI Windows + macOS
  • phiên bản v0.4.0
  • 0 file audio trong repo
kịch bản điều khiển sắc tháiscript.txt
[giangiai]Mô hình đọc đúng chỗ ngắt vì lời mẫu đã được chấm câu theo khoảng lặng thật.
[thuyetphuc]Và đây là chỗ đáng để bạn dừng lại một nhịp — nó quyết định cả bài đọc.
[kechuyen]Chuyện bắt đầu từ một bản ghi dài bốn tiếng, chưa ai cắt.
một tên profile · nhiều clip mẫu voice-studio speak --profile … mã thoát 0
Nó là gì

Một quy trình, không phải một engine

Repo này điều phối các engine mà bạn tự cài; nó không đóng gói dòng code nào của họ, và không chứa một file audio nào — có chủ đích.

Không phải engine

Phần tổng hợp giọng nằm ở OmniVoice, phần khử tạp ở ClearerVoice-Studio, phần tách giọng ở python-audio-separator. Bạn cài chúng; repo này biết gọi chúng theo đúng thứ tự và biết khi nào phải dừng.

Không phải dịch vụ

Không có máy chủ, không có tài khoản, không có khoá API. Mọi thứ chạy tại máy bạn; trạm giọng là thư mục của bạn và không bao giờ đi vào git.

Không phải một mảnh của bộ nào

Cài nó khi bạn cần một giọng đọc, và chỉ khi đó. Không có thứ tự cài bắt buộc, không có "bộ ba". Xem mục liên hệ với hai repo kia.

Làm được gì

Bốn việc, mỗi việc một lệnh thật

Mỗi thẻ dưới đây ghi kèm lệnh hoặc tài liệu tương ứng trong repo — không có dòng nào là lời hứa suông.

Đào sắc thái có sẵn

Không ai chỉ có một cách nói: người ta giảng giải, thuyết phục, kể chuyện, hướng dẫn. Việc đào tách những kiểu nói đó ra khỏi bản ghi dài bằng ngôn điệu đo được, chứ không bằng phỏng đoán.

voice-studio lab mine
mining-protocol.md

Sáu cổng kiểm thay tai người

Clip mẫu không phải một đầu vào bình thường — nó chính là giọng, và mọi thứ sinh ra sau đều thừa hưởng lỗi của nó. Mỗi ứng viên bị máy chấm, gồm cả một vòng đi–về qua nhận dạng tiếng nói.

voice-studio verify
verify-gates.md

Sắc thái từ trong kịch bản

Marker trong text quyết định clip mẫu nào đọc đoạn nào. Người gọi chỉ chọn một tên profile; phần diễn do câu chữ quyết định — nên sửa bài là đổi được cách đọc, không phải dựng lại giọng.

voice-studio speak --profile
profile-and-markers.md

Luật phát âm tiếng Việt đã đo

Mọi luật đều dựng bằng cách tổng hợp rồi cho nhận dạng nghe lại rồi so. Số đo nằm nguyên trong bảng — kể cả số đo đã lật đổ một niềm tin cũ.

voice-studio reftext
vietnamese-tts-script.md

Và những việc phụ mà thiếu thì tắc

Làm sạch clip mẫu

Tách giọng khỏi nhạc nền rồi khử tạp âm, trước khi một clip được đưa qua cổng kiểm.

voice-studio clean

Lồng tiếng cho video câm

Video câm + lời dẫn → một MP4 có giọng và nhạc nền tuỳ chọn. Thư viện nhạc nền có lệnh riêng để liệt kê và chọn theo phong cách.

voice-studio narrate · voice-studio bgm

Chuyển máy, sao lưu

Đóng gói giọng cá nhân thành một file zip rồi bung ở máy khác; hoặc sao lưu cả trạm. Gói cá nhân không mang theo venv, cache hay output.

voice-studio export --personal · import · backup

Kiểm máy trước khi trách engine

Thiếu gì thì chỉ đúng bước cài còn thiếu, thay vì để lỗi nổ ra giữa một lượt chạy dài.

voice-studio doctor

Nghe thử tại máy

Một giao diện web cục bộ để nghe thử nhanh, và một lệnh đọc một câu ra file.

voice-studio ui · voice-studio tts

Nối vào agent

Chạy như MCP server qua stdio cho agent gọi; hoặc cài như plugin để agent đọc skill voice-routing và chỉ nạp đúng tài liệu của bước đang làm.

voice-studio mcp · skills/voice-routing
Quy trình

Đào và dựng làm một lần. Viết và đọc thì làm mỗi lần.

Hai bước đầu tốn công và chỉ chạy một lần cho mỗi giọng; hai bước sau là việc hằng ngày.

1

Đào

Quét cả thư mục bản ghi, tách các cụm có ngôn điệu khác nhau thành các ứng viên clip mẫu.

lab mine --dir … --name …
2

Chấm & dựng

Mỗi ứng viên đi qua sáu cổng. Trượt bất kỳ cổng nào là bị loại và ứng viên kế tiếp được thử.

lab build --name … --mode new
3

Viết

Viết kịch bản, đặt marker ở chỗ muốn đổi sắc thái. Không phải cấu hình gì thêm.

script.txt · marker
4

Đọc

Một lệnh, một tên profile. Có --json thì dòng cuối stdout là một object JSON cho pipeline khác đọc.

speak --file … --out …
Sáu cổng

Vì sao phải đo thay vì nghe

Thường không có ai ngồi nghe, và nghe bằng tai cũng không mở rộng được cho hàng chục ứng viên. Cổng 1–4 rẻ nên chạy trước, trượt rồi thì bỏ qua phần việc GPU.

#CổngLoại khiBắt được
1Clippingpeak ≥ −0,5 dBbản ghi bị méo
2Quá nhỏRMS < −34 dBtỉ lệ tín hiệu/nhiễu không dùng được
3Bám cao độ> 35 % frame thất bạicòn sót nhạc nền, hoặc hai người nói chồng lên nhau
4Đuôi lặng250 ms cuối không thấp hơn RMS của clip ít nhất 18 dBclip kết thúc giữa chừng một từ
5Round triptổng hợp 2 câu thăm dò, cho nhận dạng đọc ngược lại, CER > 0,25clip sinh ra lời nói bị méo
6Leak probeâm tiết đầu của output trùng âm tiết cuối của clip mẫuđúng lỗi mà cổng 4 ngăn, bắt trực tiếp

Cổng 4 thay cho một phép kiểm tưởng hiển nhiên. Bản đầu tiên kiểm xem transcript có kết thúc bằng dấu câu không — và nó loại sạch ba trên ba ứng viên, làm dừng cả quá trình dựng. Nguyên nhân: nhận dạng tiếng Việt thường xuyên bỏ dấu chấm cuối câu. Toàn bộ số đo và lý do đổi nằm ở skills/voice-routing/references/verify-gates.md.

Cài đặt

Hai chế độ, và lệnh init trình bảng trước khi làm

Không có câu hỏi trống. init đưa ra bảng hai lựa chọn rồi chờ bạn chọn; không có ai trả lời (CI, lịch chạy) thì nó in bảng đó ra và thoát mã 2 mà chưa ghi byte nào.

Nhờ AI agent cài. Trang /install/ có một prompt copy-dán (tiếng Việt và tiếng Anh) cho Claude Code, Codex hoặc Antigravity, trên Windows hoặc macOS: agent hỏi trước khi cài phần mềm, tải engine hay chọn chỗ đặt trạm.

clone → cài → dựng trạm
git clone https://github.com/ducnguyen221/agent-voice-studio
# tạo venv, cài torch theo hệ điều hành + omnivoice==0.2.1 — xem docs/INSTALL.md
pip install -e .          # trong venv engine — có lệnh voice-studio; xưởng Windows chạy lịch có trạm riêng: bản sao, docs/INSTALL.md mục 3
voice-studio init         # trình bảng embedded | separate rồi chờ bạn chọn
voice-studio doctor       # thiếu gì thì chỉ bước cài tiếp
Chế độTrạm nằm ở đâuChọn khi
embedded
mặc định · khuyến nghị
<repo>/workspaces/, cấu hình ở <repo>/.env Bấm Enter là xong, không phải đặt biến môi trường nào. init dựng sẵn cây trạm và chép .env.example thành .env cho bạn điền. Cả workspaces/ lẫn .env bị .gitignore chặn và hook pre-commit chặn lần nữa.
separate một thư mục ngoài repo, chỉ bằng --station DIR Bạn dùng nhiều máy, rành kỹ thuật, hoặc repo này là bản public của chính bạn — tức là trạm phải sống lâu hơn bản clone.

.env giữ đường dẫn và cấu hình, không bao giờ giữ token. Một cổng trong bộ test đối chiếu .env.example với những biến mà mã thật sự đọc: khai thiếu là đỏ, khai thừa mà không nói rõ vì sao cũng đỏ.

Cài như plugin cho agent. Claude Code và Codex đều nhận repo này làm marketplace; cài xong, agent đọc skills/voice-routing/SKILL.md và chỉ nạp đúng tài liệu tham chiếu của bước đang làm thay vì nuốt cả bộ.

Nền tảng: cái gì đã chạy thật, cái gì chưa

Nền tảngBộ khung (CLI, trạm, test)Tổng hợp giọng thật
Windowsđã chạy thậtđã chạy thật
macOS (Apple Silicon)CI chạy mỗi lần đẩy mã: cài gói, --help, init cả hai chế độ, toàn bộ test đã chạy thật 30/09/2026 trên một máy M1 16 GB (MPS, fp16): doctor 16 PASS, speak mã 0, RTF 1,65 với --instruct, 2,7–4,8 với profile clone (chậm hơn thời gian thực). Test trên CI vẫn dùng module engine giả
LinuxCI chạy cổng kiểm repochưa kiểm

Nói thẳng ra: cái đã được chứng minh trên mọi nền tảng là bộ khung — lệnh chạy, trạm dựng đúng, hợp đồng gọi giữ nguyên. Phần tổng hợp giọng có số đo thật trên Windows và trên một máy Mac Apple Silicon (M1, 30/09/2026). Đừng đọc bảng này rộng hơn thứ nó nói.

Bảng lệnh

Toàn bộ lệnh của bản v0.4.0

Chính là bảng mà voice-studio --help in ra — một cổng trong bộ test giữ cho hai bên không trôi khỏi nhau.

LệnhLàm gì
speaktext → file audio (hợp đồng ổn định, --json, mã 0/1/2/3)
narratevideo câm + lời dẫn → MP4 có giọng (+ nhạc nền)
make-profiletạo profile giọng từ bản ghi / video / instruct
clonedựng profile từ media dài hoặc URL — cần --consent
verifysoi một clip mẫu qua 6 cổng kiểm
reftextthêm dấu ngắt vào lời mẫu theo khoảng lặng thật
cleantách giọng + khử tạp âm cho clip mẫu
bgmthư viện nhạc nền: list | pick <style>
ttsđọc nhanh một câu ra file
uigiao diện web cục bộ để nghe thử
doctorkiểm trạm giọng, chỉ bước cài còn thiếu
mcpchạy MCP server (stdio) cho agent
labbộ dựng profile đa sắc thái: mine | build | split | organize
initdựng trạm (embedded | separate) + station.json
exportđóng gói giọng cá nhân để chuyển máy (--personal)
importnhập gói giọng cá nhân
backupzip cả trạm (không venv/cache/out)
migratechuyển trạm embedded ra ngoài repo
updatecập nhật repo (git pull --ff-only)
uninstallgỡ package + hook, giữ trạm và giọng (--dry-run xem trước)

Hợp đồng cho pipeline khác. speak và narrate là hợp đồng ổn định: có --json thì dòng cuối stdout là đúng một object JSON, log người đọc đi stderr. Mã thoát: 0 ok · 1 lỗi engine · 2 gọi/cấu hình sai · 3 trạm/engine chưa cài.

Quy tắc

Bốn luật vận hành

Đây không phải lời khuyên. Ba luật đầu là lý do quy trình này tồn tại; luật thứ tư là điều kiện để được dùng nó.

LUẬT 1

Đừng tin tai — hãy đo

Tổng hợp, cho nhận dạng nghe lại, so. "Nghe hay hơn" không phải một kết quả, và không ai kiểm lại được nó ở phiên sau.

LUẬT 2

Ghim seed

Engine không tái lập nếu không ghim. Một phép so không ghim seed là đang đo nhiễu lấy mẫu, không phải đo thứ bạn vừa đổi.

LUẬT 3

Clip mẫu hỏng thì hỏng mọi thứ sinh ra từ nó

Đừng bao giờ cho một clip qua cổng lấy lệ. Chi phí sửa về sau không nằm ở clip đó, mà ở toàn bộ bài đã đọc bằng nó.

LUẬT 4 · BẮT BUỘC

Chỉ clone giọng của chính mình, hoặc người đã đồng ý bằng văn bản

Hai lệnh clone và make-profile chỉ dành cho giọng đã được đồng ý; clone đòi cờ --consent tường minh để không ai lỡ tay. Xin phép trước khi clone giọng người khác là điều kiện dùng repo này, không phải một bước có thể bỏ khi vội.

Giấy phép của code khác giấy phép của model

Weights đi đường riêng. Giấy phép của model weights không theo giấy phép của code nạp chúng, và một số biến thể model tách giọng là phi thương mại. Bản weights của engine tổng hợp là CC-BY-NC. Hãy kiểm giấy phép của từng checkpoint mình tải trước khi dùng sản phẩm vào mục đích thương mại — repo này không kiểm hộ bạn việc đó.

Repo không chứa giọng. Không một file audio nào được đưa vào đây, và bộ test có cổng chặn: tên profile thật, đường dẫn máy, tên người và file *.wav/*.mp3/*.pt đều bị bắt trước khi commit đi qua.

Liên hệ với hai repo kia

Năng lực thêm, không bắt buộc

Ba repo cùng họ nói chuyện với nhau qua một hợp đồng duy nhất: mã thoát cộng một dòng JSON cuối stdout. Không có thứ tự cài bắt buộc và không có bộ nào phải cài đủ.

agent-video-studio

Dựng video. Gọi repo này để lồng tiếng cho một video câm. Thiếu trạm giọng thì render câm vẫn chạy — chỉ là không lồng tiếng được, và nó nói rõ điều đó thay vì nổ giữa chừng.

agent-marketing-team

Quy trình sản xuất nội dung. Gọi được repo này khi nó có mặt; chưa cài thì pipeline vẫn chạy bình thường và nói rõ là đang thiếu năng lực giọng.

Dùng một mình

Cách dùng phổ biến nhất. Repo này đứng một mình: cài khi bạn cần một giọng đọc, và chỉ khi đó.

voice-studio speak
Ghi công & giấy phép

Repo này điều phối engine của người khác

Nó không đóng gói dòng code nào của họ. Ba dự án dưới đây được gọi tới lúc chạy và do bạn tự cài; giấy phép của chúng áp cho chính chúng.

Dự ánGiấy phépDùng để
OmniVoice (k2-fsa)Apache-2.0tổng hợp và clone giọng
ClearerVoice-Studio (modelscope)Apache-2.0khử tạp âm
python-audio-separator (nomadkaraoke)MITtách giọng khỏi nền
MIT
Giấy phép của mã trong repo này. Toàn văn ở file LICENSE; phần bên thứ ba ở NOTICE.
CC-BY-NC
Giấy phép của weights engine tổng hợp — khác giấy phép code, và ràng buộc mục đích thương mại.
Win + Mac
Bộ test chạy ở CI trên cả hai hệ điều hành, mọi nhánh, trên máy trần không cần engine: engine được thay bằng module giả trong test.
Thuật ngữ

Sáu từ đọc tài liệu sẽ gặp

trạm giọng
Thư mục dữ liệu của bạn: venv engine, giọng, nhạc nền, output. Không bao giờ đi vào git.
profile
Một giọng đã dựng: gồm nhiều clip mẫu ứng với các sắc thái khác nhau, gọi bằng một cái tên.
clip mẫu
Đoạn ghi âm ngắn quyết định giọng sẽ nghe ra sao. Nó chính là giọng, không phải một tham số.
marker
Nhãn đặt trong kịch bản để chọn clip mẫu nào đọc đoạn nào.
round trip
Tổng hợp rồi cho nhận dạng đọc ngược lại để đo bằng số, thay vì nghe bằng tai.
embedded / separate
Hai chỗ đặt trạm: trong repo (mặc định, clone là chạy) hoặc ngoài repo (sống lâu hơn bản clone).