Gemini API có thể chuyển đổi văn bản đầu vào thành âm thanh của một người nói hoặc nhiều người nói bằng cách sử dụng các khả năng tạo chuyển văn bản sang lời nói (TTS) của Gemini.
Quá trình chuyển văn bản sang lời nói có thể kiểm soát, tức là bạn có thể kết hợp siêu dữ liệu lượt có cấu trúc (speech_metadata) và thẻ thoại nội tuyến để hướng dẫn phong cách, giọng, tốc độ và giọng điệu của âm thanh.
Tính năng TTS khác với tính năng tạo lời nói được cung cấp thông qua Live API, được thiết kế cho âm thanh tương tác, không có cấu trúc, cũng như đầu vào và đầu ra đa phương thức. Mặc dù Live API vượt trội trong các bối cảnh trò chuyện linh hoạt, nhưng TTS thông qua Gemini API được thiết kế riêng cho các tình huống yêu cầu đọc chính xác văn bản với khả năng kiểm soát chi tiết về phong cách và âm thanh, chẳng hạn như tạo podcast hoặc sách nói.
Hướng dẫn này trình bày cách tạo âm thanh một người nói và nhiều người nói từ văn bản bằng Gemini 3.8 Flash TTS (gemini-3.8-flash-tts) và Gemini 3.8 Flash-Lite TTS (gemini-3.8-flash-lite-tts).
Trước khi bắt đầu
Đảm bảo bạn sử dụng một mô hình TTS Gemini có trong phần Các mô hình được hỗ trợ và nâng cấp lên Google GenAI SDK mới nhất (google-genai >= 2.25.0 cho Python hoặc @google/genai >= 2.24.0 cho JavaScript/TypeScript) hoặc sử dụng API REST.
Để có kết quả tối ưu, hãy xem phần Khi nào nên sử dụng mô hình nào để chọn mô hình phù hợp nhất cho khối lượng công việc của bạn.
Bạn có thể thấy việc thử nghiệm các mô hình TTS của Gemini trong AI Studio trước khi bắt đầu xây dựng là rất hữu ích.
TTS một người nói
Để chuyển văn bản thành âm thanh của một người nói bằng mô hình TTS Gemini 3.8, hãy truyền bản chép lời nguyên văn trong input, đính kèm kiểu ở cấp lượt bằng chú thích speech_metadata và định cấu hình giọng nói trong generation_config.speech_config. Bạn có thể chọn một giọng nói trong Các lựa chọn về giọng nói được tạo sẵn, Thư viện giọng nói mở rộng (GET /v1beta/voices), một Thiết kế giọng nói tuỳ chỉnh (voice_...) hoặc một Nhân bản giọng nói (voice_... hoặc voicekey_... không trạng thái không bắt buộc).
Ví dụ này lưu âm thanh đầu ra WAV mặc định (audio/wav) từ mô hình trực tiếp vào một tệp:
Python
import base64
from google import genai
client = genai.Client()
interaction = client.interactions.create(
model="gemini-3.8-flash-tts",
input=[{
"type": "user_input",
"content": [{
"type": "text",
"text": "Have a wonderful day!",
"annotations": [{
"type": "speech_metadata",
"style": "cheerful and friendly",
}],
}],
}],
response_format={"type": "audio"},
generation_config={
"speech_config": [
{"voice": "Kore"},
]
},
)
with open("out.wav", "wb") as f:
f.write(base64.b64decode(interaction.output_audio.data))
JavaScript
import * as fs from 'node:fs';
import {GoogleGenAI} from '@google/genai';
async function main() {
const client = new GoogleGenAI({});
const interaction = await client.interactions.create({
model: 'gemini-3.8-flash-tts',
input: [{
type: 'user_input',
content: [{
type: 'text',
text: 'Have a wonderful day!',
annotations: [{
type: 'speech_metadata',
style: 'cheerful and friendly',
}],
}],
}],
response_format: { type: 'audio' },
generation_config: {
speech_config: [
{ voice: 'Kore' },
],
},
});
const audioBuffer = Buffer.from(interaction.output_audio.data, 'base64');
fs.writeFileSync('out.wav', audioBuffer);
}
await main();
REST
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.8-flash-tts",
"input": [{
"type": "user_input",
"content": [{
"type": "text",
"text": "Have a wonderful day!",
"annotations": [{
"type": "speech_metadata",
"style": "cheerful and friendly"
}]
}]
}],
"response_format": {
"type": "audio"
},
"generation_config": {
"speech_config": [
{ "voice": "Kore" }
]
}
}' | jq -r '[.steps[] | select(.type=="model_output") | .content[] | select(.type=="audio")] | last | .data' | base64 --decode > out.wav
Trong SDK Python và JavaScript, bạn có thể truy xuất dữ liệu âm thanh đã tạo bằng cách sử dụng thuộc tính tiện lợi interaction.output_audio. Thuộc tính này trả về khối âm thanh được tạo gần đây nhất (trong các phản hồi JSON REST thô, âm thanh được mã hoá base64 sẽ được lưu trữ trong steps[].content[].data). Để biết thông tin chi tiết về các thuộc tính tiện lợi, hãy xem phần Tổng quan về các hoạt động tương tác.
TTS nhiều người nói
Đối với cuộc hội thoại có nhiều người nói, hãy định cấu hình hai người nói trong speech_config.speakers và truyền từng lượt dưới dạng một mục văn bản riêng biệt có chú thích speech_metadata chỉ định speaker và style cấp lượt (không bắt buộc). Lưu ý rằng speech_config chấp nhận một mảng ([{"voice": "..."}]) để tạo giọng nói cho một người nói và một đối tượng ({"speakers": [...]}) để tạo giọng nói cho nhiều người nói:
Python
import base64
from google import genai
client = genai.Client()
interaction = client.interactions.create(
model="gemini-3.8-flash-tts",
input=[{
"type": "user_input",
"content": [
{
"type": "text",
"text": "How's it going today Jane?",
"annotations": [{
"type": "speech_metadata",
"speaker": "Joe",
"style": "cheerful and friendly",
}],
},
{
"type": "text",
"text": "Not too bad, how about you? Ready to test these new voices?",
"annotations": [{
"type": "speech_metadata",
"speaker": "Jane",
"style": "calm and relaxed",
}],
},
],
}],
response_format={"type": "audio"},
generation_config={
"speech_config": {
"speakers": [
{"speaker": "Joe", "voice": "Puck"},
{"speaker": "Jane", "voice": "Kore"},
],
}
},
)
with open("out.wav", "wb") as f:
f.write(base64.b64decode(interaction.output_audio.data))
JavaScript
import * as fs from 'node:fs';
import {GoogleGenAI} from '@google/genai';
async function main() {
const client = new GoogleGenAI({});
const interaction = await client.interactions.create({
model: 'gemini-3.8-flash-tts',
input: [{
type: 'user_input',
content: [
{
type: 'text',
text: "How's it going today Jane?",
annotations: [{
type: 'speech_metadata',
speaker: 'Joe',
style: 'cheerful and friendly',
}],
},
{
type: 'text',
text: 'Not too bad, how about you? Ready to test these new voices?',
annotations: [{
type: 'speech_metadata',
speaker: 'Jane',
style: 'calm and relaxed',
}],
},
],
}],
response_format: { type: 'audio' },
generation_config: {
speech_config: {
speakers: [
{ speaker: 'Joe', voice: 'Puck' },
{ speaker: 'Jane', voice: 'Kore' },
],
},
},
});
const audioBuffer = Buffer.from(interaction.output_audio.data, 'base64');
fs.writeFileSync('out.wav', audioBuffer);
}
await main();
REST
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.8-flash-tts",
"input": [{
"type": "user_input",
"content": [
{
"type": "text",
"text": "How'\''s it going today Jane?",
"annotations": [{
"type": "speech_metadata",
"speaker": "Joe",
"style": "cheerful and friendly"
}]
},
{
"type": "text",
"text": "Not too bad, how about you? Ready to test these new voices?",
"annotations": [{
"type": "speech_metadata",
"speaker": "Jane",
"style": "calm and relaxed"
}]
}
]
}],
"response_format": {
"type": "audio"
},
"generation_config": {
"speech_config": {
"mode": "conversational",
"speakers": [
{ "speaker": "Joe", "voice": "Puck" },
{ "speaker": "Jane", "voice": "Kore" }
]
}
}
}'
Kiểm soát kiểu giọng nói bằng siêu dữ liệu và thẻ
Công nghệ TTS Gemini 3.8 coi trường text hoàn toàn là bản chép lời nguyên văn. Để kiểm soát việc truyền tải mà không cần đọc to chỉ dẫn sân khấu, hãy chia chỉ dẫn theo phạm vi:
- Phân phối theo lượt liên tục (
speech_metadata.style): Đặt cảm xúc, phong cách phân phối, ngữ điệu, tốc độ và âm lượng áp dụng cho toàn bộ lượt trong trườngstyle(ví dụ:"style": "whispered urgently","style": "out of breath"hoặc"style": "warm and enthusiastic"). - Sự kiện tại một thời điểm (thẻ nội tuyến): Đặt các đoạn âm thanh không phải lời nói hoặc khoảng dừng ngắn ngay trong bản chép lời bằng dấu ngoặc nhọn (ví dụ:
"Wait... <short pause> did you hear that? <sigh>"hoặc"Excuse me <cough> as I was saying...").
Hãy xem Hướng dẫn viết câu lệnh để biết các phương pháp hay nhất toàn diện.
Python
import base64
from google import genai
client = genai.Client()
interaction = client.interactions.create(
model="gemini-3.8-flash-tts",
input=[{
"type": "user_input",
"content": [
{
"type": "text",
"text": "Wait... <short pause> look under that fallen log! Is that a blue-spotted salamander?",
"annotations": [{
"type": "speech_metadata",
"speaker": "Dr. Anya",
"style": "whispered urgently",
}],
},
{
"type": "text",
"text": "<gasp> No way! <laugh> We've been searching for this species all season!",
"annotations": [{
"type": "speech_metadata",
"speaker": "Liam",
"style": "warm and enthusiastic",
}],
},
],
}],
response_format={"type": "audio"},
generation_config={
"speech_config": {
"speakers": [
{"speaker": "Dr. Anya", "voice": "Kore"},
{"speaker": "Liam", "voice": "Puck"},
],
}
},
)
with open("out.wav", "wb") as f:
f.write(base64.b64decode(interaction.output_audio.data))
JavaScript
import * as fs from 'node:fs';
import {GoogleGenAI} from '@google/genai';
async function main() {
const client = new GoogleGenAI({});
const interaction = await client.interactions.create({
model: 'gemini-3.8-flash-tts',
input: [{
type: 'user_input',
content: [
{
type: 'text',
text: 'Wait... <short pause> look under that fallen log! Is that a blue-spotted salamander?',
annotations: [{
type: 'speech_metadata',
speaker: 'Dr. Anya',
style: 'whispered urgently',
}],
},
{
type: 'text',
text: "<gasp> No way! <laugh> We've been searching for this species all season!",
annotations: [{
type: 'speech_metadata',
speaker: 'Liam',
style: 'warm and enthusiastic',
}],
},
],
}],
response_format: { type: 'audio' },
generation_config: {
speech_config: {
speakers: [
{ speaker: 'Dr. Anya', voice: 'Kore' },
{ speaker: 'Liam', voice: 'Puck' },
],
},
},
});
if (interaction.output_audio?.data) {
const audioBuffer = Buffer.from(interaction.output_audio.data, 'base64');
fs.writeFileSync('out.wav', audioBuffer);
}
}
await main();
REST
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.8-flash-tts",
"input": [{
"type": "user_input",
"content": [
{
"type": "text",
"text": "Wait... <short pause> look under that fallen log! Is that a blue-spotted salamander?",
"annotations": [{
"type": "speech_metadata",
"speaker": "Dr. Anya",
"style": "whispered urgently"
}]
},
{
"type": "text",
"text": "<gasp> No way! <laugh> We'\''ve been searching for this species all season!",
"annotations": [{
"type": "speech_metadata",
"speaker": "Liam",
"style": "warm and enthusiastic"
}]
}
]
}],
"response_format": {
"type": "audio"
},
"generation_config": {
"speech_config": {
"speakers": [
{ "speaker": "Dr. Anya", "voice": "Kore" },
{ "speaker": "Liam", "voice": "Puck" }
]
}
}
}'
Tạo lời nói phát trực tuyến
Bạn có thể phát trực tuyến âm thanh được tạo khi âm thanh đó đang được tổng hợp bằng cách đặt stream: true. Không giống như các yêu cầu đơn phương (trả về một tệp WAV hoàn chỉnh có tiêu đề RIFF), các yêu cầu truyền trực tuyến sẽ trả về các đoạn PCM tuyến tính 16 bit không có tiêu đề (audio/l16, 24 kHz, đơn âm) theo mặc định để các đoạn âm thanh có thể được phát hoặc nối liên tục mà không cần tiêu đề vùng chứa.
Python
import base64
from google import genai
client = genai.Client()
stream = client.interactions.create(
model="gemini-3.8-flash-tts",
input=[{
"type": "user_input",
"content": [{
"type": "text",
"text": "Have a wonderful day!",
"annotations": [{
"type": "speech_metadata",
"style": "cheerful and friendly",
}],
}],
}],
response_format={"type": "audio"},
generation_config={
"speech_config": [
{"voice": "Kore"},
]
},
stream=True,
)
for event in stream:
if event.event_type == "step.delta":
if event.delta.type == "audio":
audio_data = base64.b64decode(event.delta.data)
# Process the audio chunk (e.g. play it or write to a file)
JavaScript
import {GoogleGenAI} from '@google/genai';
async function main() {
const client = new GoogleGenAI({});
const stream = await client.interactions.create({
model: 'gemini-3.8-flash-tts',
input: [{
type: 'user_input',
content: [{
type: 'text',
text: 'Have a wonderful day!',
annotations: [{
type: 'speech_metadata',
style: 'cheerful and friendly',
}],
}],
}],
response_format: { type: 'audio' },
generation_config: {
speech_config: [
{ voice: 'Kore' },
],
},
stream: true,
});
for await (const event of stream) {
if (event.event_type === 'step.delta') {
if (event.delta.type === 'audio') {
const audioBuffer = Buffer.from(event.delta.data, 'base64');
// Process the audio buffer
}
}
}
}
await main();
REST
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H "Content-Type: application/json" \
--no-buffer \
-d '{
"model": "gemini-3.8-flash-tts",
"input": [{
"type": "user_input",
"content": [{
"type": "text",
"text": "Have a wonderful day!",
"annotations": [{
"type": "speech_metadata",
"style": "cheerful and friendly"
}]
}]
}],
"response_format": {
"type": "audio"
},
"generation_config": {
"speech_config": [
{ "voice": "Kore" }
]
},
"stream": true
}'
Định dạng đầu ra âm thanh
Các mô hình TTS của Gemini 3.8 sử dụng các định dạng âm thanh mặc định khác nhau tuỳ thuộc vào việc yêu cầu là đơn nhất hay truyền trực tuyến:
- Yêu cầu một ngôi (
stream=False): Trả về âm thanh WAV (audio/wav) hoàn chỉnh có tiêu đề RIFF chuẩn (24 kHz, đơn âm, PCM 16 bit có dấu little-endian). Bạn có thể lưu trực tiếp các byte âm thanh đã giải mã vào tệp.wavmà không cần thêm tiêu đề WAV theo cách thủ công. - Yêu cầu phát trực tuyến (
stream=True): Trả về các đoạn PCM tuyến tính thô không có tiêu đề (audio/l16) (24 kHz, đơn âm, PCM little-endian có dấu 16 bit) theo mặc định để các đoạn có thể được phát trực tuyến hoặc nối liên tục mà không có tiêu đề vùng chứa trên mỗi đoạn.
Để yêu cầu một phương thức mã hoá âm thanh hoặc tốc độ lấy mẫu khác, hãy định cấu hình mime_type và sample_rate (không bắt buộc) bên trong response_format:
| Định dạng | Giá trị mime_type |
Mô tả |
|---|---|---|
| WAV (mặc định một ngôi) | "audio/wav" |
Tệp WAV chưa nén có tiêu đề RIFF (PCM 16 bit có dấu little-endian, đơn âm, mặc định là 24 kHz). Mặc định cho các yêu cầu một ngôi. |
| PCM thô (L16) (mặc định cho chế độ phát trực tuyến) | "audio/l16" |
Âm thanh PCM tuyến tính 16 bit có dấu, không nén, không có tiêu đề, dạng little-endian (24 kHz, đơn âm). Mặc định cho các yêu cầu truyền trực tuyến. |
| Mu-law | "audio/mulaw" |
Âm thanh được mã hoá theo chuẩn mu-law G.711 8 bit (thường được dùng trong hệ thống điện thoại/IVR ở Bắc Mỹ và Nhật Bản). |
| A-law | "audio/alaw" |
Âm thanh được mã hoá theo luật G.711 A 8 bit (thường dùng trong các hệ thống điện thoại của Châu Âu và quốc tế). |
Bạn cũng có thể chỉ định sample_rate theo đơn vị Hertz (ví dụ: 24000, 16000 hoặc 8000).
Python
import base64
from google import genai
client = genai.Client()
interaction = client.interactions.create(
model="gemini-3.8-flash-tts",
input=[{
"type": "user_input",
"content": [{
"type": "text",
"text": "Have a wonderful day!",
"annotations": [{
"type": "speech_metadata",
"style": "cheerful and friendly",
}],
}],
}],
response_format={
"type": "audio",
"mime_type": "audio/l16", # "audio/wav" (default), "audio/l16", "audio/mulaw", or "audio/alaw"
"sample_rate": 24000,
},
generation_config={
"speech_config": [
{"voice": "Kore"},
]
},
)
with open("out.pcm", "wb") as f:
f.write(base64.b64decode(interaction.output_audio.data))
JavaScript
import * as fs from 'node:fs';
import {GoogleGenAI} from '@google/genai';
async function main() {
const client = new GoogleGenAI({});
const interaction = await client.interactions.create({
model: 'gemini-3.8-flash-tts',
input: [{
type: 'user_input',
content: [{
type: 'text',
text: 'Have a wonderful day!',
annotations: [{
type: 'speech_metadata',
style: 'cheerful and friendly',
}],
}],
}],
response_format: {
type: 'audio',
mime_type: 'audio/l16', // 'audio/wav' (default), 'audio/l16', 'audio/mulaw', or 'audio/alaw'
sample_rate: 24000,
},
generation_config: {
speech_config: [
{ voice: 'Kore' },
],
},
});
const audioBuffer = Buffer.from(interaction.output_audio.data, 'base64');
fs.writeFileSync('out.pcm', audioBuffer);
}
await main();
REST
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.8-flash-tts",
"input": [{
"type": "user_input",
"content": [{
"type": "text",
"text": "Have a wonderful day!",
"annotations": [{
"type": "speech_metadata",
"style": "cheerful and friendly"
}]
}]
}],
"response_format": {
"type": "audio",
"mime_type": "audio/l16",
"sample_rate": 24000
},
"generation_config": {
"speech_config": [
{ "voice": "Kore" }
]
}
}'
Tuỳ chọn giọng nói
Công nghệ TTS Gemini 3.8 hỗ trợ 4 cách chọn hoặc tạo giọng nói:
- Giọng đọc được tạo sẵn trong Studio: 30 giọng đọc được tuyển chọn trong bảng sau.
- Thư viện giọng nói mở rộng: Hàng trăm giọng nói bổ sung cho nhiều ngôn ngữ, giọng điệu và kiểu nhân vật mà bạn có thể sử dụng bằng
client.voices.list()(GET /v1beta/voices). - Thiết kế giọng nói: Tạo một nhân vật giọng nói tuỳ chỉnh từ nội dung mô tả bằng ngôn ngữ tự nhiên trong Google AI Studio hoặc sử dụng
POST /v1beta/voices(type="prompted", trả về một mã nhận dạngvoice_...liên tục và bản xem trướcsample_audioWAV trongCreateVoicevàGetVoice). - Nhân bản giọng nói: Nhân bản giọng nói của người nói từ âm thanh tham chiếu và âm thanh đồng ý trong Google AI Studio hoặc sử dụng
POST /v1beta/voices(type="replicated",store=Truecố định theo mặc định hoặcstore=Falsekhông có trạng thái tuỳ chọn).
Giới hạn và TTL của giọng nói tuỳ chỉnh
| Loại giọng nói | Chế độ lưu trữ | Hạn mức | Thời gian tồn tại (TTL) |
|---|---|---|---|
Giọng nói có trạng thái (voice_..., được nhắc hoặc sao chép) |
store=True |
200 giọng nói cho mỗi dự án (dùng chung cho cả giọng nói được nhắc và giọng nói được sao chép) | 1 năm kể từ lần sử dụng gần đây nhất* |
Khoá thoại không trạng thái (voicekey_..., được sao chép) |
store=False |
Do khách hàng quản lý | 7 ngày |
* Gia hạn TTL: Khoảng thời gian lưu giữ 1 năm sẽ được đặt lại mỗi khi giọng nói được sử dụng tích cực (bằng cách tổng hợp lời nói bằng giọng nói đó hoặc sử dụng giọng nói đó làm giọng nói cơ bản để phối lại). Những giọng nói không có hoạt động nào trong 1 năm sẽ tự động bị xoá.
Giọng nói tạo sẵn
| Zephyr – Bright | Puck – Rộn ràng | Charon – Cung cấp nhiều thông tin |
| Kore – Firm | Fenrir – Dễ bị kích động | Leda – Trẻ trung |
| Orus – Firm | Aoede – Breezy | Callirrhoe – Dễ chịu |
| Autonoe – Sáng | Enceladus – Breathy | Iapetus – Trong suốt |
| Umbriel – Dễ tính | Algieba – Smooth (Mượt mà) | Despina – Mượt mà |
| Erinome – Xoá | Algenib – Khàn | Rasalgethi – Cung cấp nhiều thông tin |
| Laomedeia – Rộn ràng | Achernar – Dịu êm | Alnilam – Firm |
| Schedar – Even | Gacrux – Trưởng thành | Pulcherrima – Lạc quan |
| Achird – Thân thiện | Zubenelgenubi – Thông thường | Vindemiatrix – Êm dịu |
| Sadachbia – Lively | Sadaltager – Hiểu biết | Sulafat – Ấm |
Thư viện giọng nói mở rộng và tính năng lọc
Ngoài 30 giọng nói của các hãng phim được giới thiệu trong bảng trước, Thư viện giọng nói mở rộng còn cung cấp hàng trăm giọng nói khác theo ngôn ngữ, giọng địa phương, nhân vật và lĩnh vực. Bạn có thể duyệt xem, lọc và dùng thử toàn bộ Thư viện giọng nói một cách tương tác trong Google AI Studio hoặc truy vấn theo phương thức lập trình bằng client.voices.list() (GET /v1beta/voices, sử dụng google-genai 2.25.0 trở lên / @google/genai 2.24.0 trở lên).
ListVoices sẽ trả về các giọng nói tuỳ chỉnh đã lưu (sắp xếp theo thứ tự mới nhất trước) rồi đến các giọng nói có sẵn trong danh mục khớp với tiêu chí lọc của bạn. Khi nhiều giá trị được truyền cho một bộ lọc danh sách, những giọng nói khớp với bất kỳ giá trị nào trong bộ lọc đó sẽ được trả về (OR), trong khi các tham số bộ lọc riêng biệt kết hợp với AND:
| Tham số | Loại | Mô tả |
|---|---|---|
language_code |
list[str] |
(Các) thẻ ngôn ngữ BCP-47 (ví dụ: ["en-US", "en-GB"]). Kiểu khớp chính xác không phân biệt chữ hoa chữ thường. |
region_code |
list[str] |
(Các) mã khu vực theo tiêu chuẩn ISO 3166-1 alpha-2 hoặc UN M.49 (ví dụ: ["US", "GB"]). |
accent |
list[str] |
(Các) từ mô tả giọng địa phương (ví dụ: ["American", "British"]). |
gender |
list[str] |
Giới tính được thể hiện ("female", "male" hoặc "neutral"). |
pitch |
list[str] |
Phân loại cao độ giọng hát ("low", "medium" hoặc "high"). |
persona |
list[str] |
Hình tượng giọng nói hoặc nguyên mẫu nhân vật (ví dụ: ["Warm, Friendly"], ["Narrator"]). |
contexts (context trong REST) |
list[str] |
Miền sử dụng tối ưu (ví dụ: ["Audiobook", "Conversational", "News"]). |
type (type_ trong Python) |
list[str] |
Lọc theo nguồn giọng nói: "prebuilt", "prompted" (Thiết kế giọng nói) hoặc "replicated" (Nhân bản giọng nói). |
search |
str |
Tìm kiếm chuỗi con dạng văn bản tự do không phân biệt chữ hoa chữ thường cho cả display_name và description. |
page_size |
int |
Số lượng giọng nói tối đa được trả về trên mỗi trang (mặc định là 50, tối đa là 1000). |
page_token |
str |
Mã thông báo từ response.next_page_token để tìm nạp trang kết quả tiếp theo. |
Python
from google import genai
client = genai.Client()
# Filter the Voice Library by language, gender, pitch, domain context, and keyword
response = client.voices.list(
language_code=["en-US", "en-GB"],
gender=["female"],
pitch=["medium", "low"],
contexts=["Audiobook", "Conversational"],
type_=["prebuilt"],
search="warm",
page_size=50,
)
for voice in response.voices or []:
print(
f"{voice.id} | {voice.display_name} ({voice.language_code},"
f" {voice.accent}, {voice.gender}, pitch={voice.pitch}):"
f" {voice.description}"
)
JavaScript
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI();
// Filter the Voice Library by language, gender, pitch, domain context, and keyword
const response = await ai.voices.list({
language_code: ["en-US", "en-GB"],
gender: ["female"],
pitch: ["medium", "low"],
contexts: ["Audiobook", "Conversational"],
type: ["prebuilt"],
search: "warm",
page_size: 50,
});
for (const voice of response.voices ?? []) {
console.log(
`${voice.id} | ${voice.display_name} (${voice.language_code}, ${voice.accent}, ${voice.gender}, pitch=${voice.pitch}): ${voice.description}`
);
}
REST
curl -G "https://generativelanguage.googleapis.com/v1beta/voices" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
--data-urlencode "language_code=en-US" \
--data-urlencode "language_code=en-GB" \
--data-urlencode "gender=female" \
--data-urlencode "pitch=medium" \
--data-urlencode "context=Audiobook" \
--data-urlencode "type=prebuilt" \
--data-urlencode "search=warm" \
--data-urlencode "page_size=50"
Ngôn ngữ được hỗ trợ
Các mô hình TTS tự động phát hiện ngôn ngữ nhập.
Gemini 3.8 Flash TTS
(gemini-3.8-flash-tts) hỗ trợ hơn 130 ngôn ngữ và
Gemini 3.8 Flash-Lite TTS
(gemini-3.8-flash-lite-tts) hỗ trợ hơn 100 ngôn ngữ:
| Ngôn ngữ | Gemini 3.8 Flash TTS | Gemini 3.8 Flash-Lite TTS |
|---|---|---|
| Tiếng Aceh (Chữ Ả Rập) | ✔️ | ✔️ |
| Tiếng Hà Lan ở Nam Phi | ✔️ | ✔️ |
| Tiếng Akan | ✔️ | ✔️ |
| Tiếng Amhara | ✔️ | ✔️ |
| Tiếng Armenia | ✔️ | ✔️ |
| Tiếng Assam | ✔️ | ✔️ |
| Tiếng Awadhi | ✔️ | ✔️ |
| Chữ Bali | ✔️ | ✔️ |
| Tiếng Bangla | ✔️ | ✔️ |
| Tiếng Banjar (chữ Ả Rập) | ✔️ | — |
| Tiếng Banjar (chữ Latinh) | ✔️ | ✔️ |
| Tiếng Bashkir | ✔️ | — |
| Tiếng Basque | ✔️ | ✔️ |
| Tiếng Belarus | ✔️ | ✔️ |
| Tiếng Bemba | ✔️ | — |
| Tiếng Bhojpuri | ✔️ | ✔️ |
| Tiếng Bosnia | ✔️ | ✔️ |
| Chữ Bugin | ✔️ | ✔️ |
| Tiếng Bungary | ✔️ | ✔️ |
| Tiếng Miến Điện | ✔️ | — |
| Tiếng Quảng Đông | ✔️ | ✔️ |
| Tiếng Catalan | ✔️ | ✔️ |
| Tiếng Cebuano | ✔️ | ✔️ |
| Tiếng Trung Kurd | ✔️ | ✔️ |
| Tiếng Chhattisgarhi | ✔️ | ✔️ |
| Tiếng Trung (chữ Hán) | ✔️ | ✔️ |
| Tiếng Trung (chữ Hán phồn thể) | ✔️ | ✔️ |
| Tiếng Tatar Krym | ✔️ | — |
| Tiếng Croatia | ✔️ | ✔️ |
| Tiếng Séc | ✔️ | ✔️ |
| Tiếng Đan Mạch | ✔️ | ✔️ |
| Tiếng Hà Lan | ✔️ | ✔️ |
| Dyula | ✔️ | — |
| Tiếng Dzongkha | ✔️ | — |
| Tiếng Ả Rập | ✔️ | ✔️ |
| Tiếng Anh | ✔️ | ✔️ |
| Tiếng Estonia | ✔️ | ✔️ |
| Tiếng Philippines | ✔️ | ✔️ |
| Tiếng Phần Lan | ✔️ | — |
| Tiếng Pháp | ✔️ | ✔️ |
| Tiếng Galicia | ✔️ | ✔️ |
| Tiếng Ganda | ✔️ | ✔️ |
| Tiếng Gruzia | ✔️ | ✔️ |
| Tiếng Đức | ✔️ | ✔️ |
| Tiếng Hy Lạp | ✔️ | ✔️ |
| Tiếng Guarani | ✔️ | — |
| Tiếng Gujarat | ✔️ | ✔️ |
| Tiếng Creole ở Haiti | ✔️ | ✔️ |
| Tiếng Halh Mông Cổ | ✔️ | ✔️ |
| Tiếng Hausa | ✔️ | ✔️ |
| Tiếng Do Thái | ✔️ | ✔️ |
| Tiếng Hindi | ✔️ | ✔️ |
| Tiếng Hungary | ✔️ | ✔️ |
| Tiếng Iceland | ✔️ | ✔️ |
| Tiếng Igbo | ✔️ | — |
| Tiếng Iloko | ✔️ | ✔️ |
| Tiếng Indonesia | ✔️ | ✔️ |
| Tiếng Ba Tư (Iran) | ✔️ | ✔️ |
| Tiếng Ý | ✔️ | ✔️ |
| Tiếng Nhật | ✔️ | ✔️ |
| Tiếng Java | ✔️ | ✔️ |
| Kabyle | ✔️ | — |
| Tiếng Kamba | ✔️ | ✔️ |
| Tiếng Kannada | ✔️ | ✔️ |
| Tiếng Kashmiri (chữ Ả Rập) | ✔️ | ✔️ |
| Tiếng Kashmiri (chữ Devanagari) | ✔️ | ✔️ |
| Tiếng Kazakh | ✔️ | ✔️ |
| Tiếng Khmer | ✔️ | ✔️ |
| Tiếng Kikuyu | ✔️ | ✔️ |
| Tiếng Kinyarwanda | ✔️ | ✔️ |
| Tiếng Kongo | ✔️ | ✔️ |
| Tiếng Hàn | ✔️ | ✔️ |
| Tiếng Kyrgyz | ✔️ | ✔️ |
| Tiếng Lào | ✔️ | ✔️ |
| Tiếng Latgale | ✔️ | — |
| Tiếng Lingala | ✔️ | ✔️ |
| Tiếng Lithuania | ✔️ | — |
| Tiếng Luxembourg | ✔️ | — |
| Tiếng Macedonia | ✔️ | ✔️ |
| Tiếng Magahi | ✔️ | ✔️ |
| Tiếng Maithili | ✔️ | ✔️ |
| Tiếng Malayalam | ✔️ | ✔️ |
| Tiếng Malta | ✔️ | ✔️ |
| Tiếng Manipur | ✔️ | ✔️ |
| Tiếng Marathi | ✔️ | ✔️ |
| Tiếng Minangkabau (Chữ Ả Rập) | ✔️ | ✔️ |
| Tiếng Minangkabau (chữ Latinh) | ✔️ | — |
| Tiếng Mizo | ✔️ | ✔️ |
| Tiếng Nepal (ngôn ngữ riêng lẻ) | ✔️ | ✔️ |
| Tiếng Fulfulde ở Nigeria | ✔️ | ✔️ |
| Tiếng Azerbaijan (Bắc) | ✔️ | ✔️ |
| Tiếng Bắc Sotho | ✔️ | ✔️ |
| Bắc Uzbekistan | ✔️ | ✔️ |
| Tiếng Bokmål ở Na Uy | ✔️ | ✔️ |
| Tiếng Na Uy Nynorsk | ✔️ | ✔️ |
| Tiếng Nyanja | ✔️ | ✔️ |
| Tiếng Occitan | ✔️ | — |
| Tiếng Odia (ngôn ngữ riêng lẻ) | ✔️ | ✔️ |
| Tiếng Pangasinan | ✔️ | — |
| Tiếng Ba Tư (Afghanistan) | ✔️ | ✔️ |
| Tiếng Ba Lan | ✔️ | ✔️ |
| Tiếng Bồ Đào Nha | ✔️ | ✔️ |
| Tiếng Punjab | ✔️ | ✔️ |
| Tiếng Rumani | ✔️ | ✔️ |
| Tiếng Nga | ✔️ | ✔️ |
| Tiếng Santali | ✔️ | ✔️ |
| Tiếng Serbia | ✔️ | ✔️ |
| Tiếng Sindh | ✔️ | — |
| Tiếng Sinhala | ✔️ | ✔️ |
| Tiếng Slovak | ✔️ | ✔️ |
| Tiếng Slovenia | ✔️ | — |
| Tiếng Somali | ✔️ | — |
| Tiếng Azerbaijan miền Nam | ✔️ | ✔️ |
| Tiếng Pashto miền Nam | ✔️ | ✔️ |
| Tiếng Nam Sotho | ✔️ | — |
| Tiếng Tây Ban Nha | ✔️ | ✔️ |
| Tiếng Ả Rập chuẩn (chữ Ả Rập) | ✔️ | ✔️ |
| Tiếng Ả Rập chuẩn (Ký tự Latinh) | ✔️ | ✔️ |
| Tiếng Latvia tiêu chuẩn | ✔️ | ✔️ |
| Tiếng Mã Lai chuẩn | ✔️ | ✔️ |
| Tiếng Swahili (ngôn ngữ riêng lẻ) | ✔️ | — |
| Tiếng Swati | ✔️ | — |
| Tiếng Thuỵ Điển | ✔️ | — |
| Tiếng Tajik | ✔️ | — |
| Tiếng Tamil | ✔️ | ✔️ |
| Tiếng Telugu | ✔️ | ✔️ |
| Tiếng Thái | ✔️ | — |
| Tiếng Tigrinya | ✔️ | — |
| Tiếng Albania ở vùng Tosk | ✔️ | — |
| Tiếng Thổ Nhĩ Kỳ | ✔️ | ✔️ |
| Tiếng Duy Ngô Nhĩ | ✔️ | — |
| Tiếng Việt | ✔️ | ✔️ |
Mô hình được hỗ trợ
| Mô hình | Loa đơn | Nhiều người nói | Thiết kế giọng nói | Nhân bản giọng nói |
|---|---|---|---|---|
Gemini 3.8 Flash TTS (gemini-3.8-flash-tts) |
✔️ | ✔️ | ✔️ | ✔️ |
Gemini 3.8 Flash-Lite TTS (gemini-3.8-flash-lite-tts) |
✔️ | ✔️ | ✔️ | ✔️ |
| Bản xem trước Gemini 3.1 Flash TTS | ✔️ | ✔️ | — | — |
| Gemini 2.5 Pro Preview TTS | ✔️ | ✔️ | — | — |
Trường hợp nên sử dụng mô hình nào
Cả hai mô hình TTS Gemini 3.8 đều có cùng một lược đồ API và định dạng câu lệnh, cho phép bạn chuyển đổi giữa hai mô hình này chỉ bằng một thay đổi về tham số:
- Sử dụng Gemini 3.8 Flash TTS
(
gemini-3.8-flash-tts) khi độ trung thực âm thanh tối đa, diễn xuất sắc thái, và khả năng kiểm soát biểu cảm là ưu tiên hàng đầu. Đây là lựa chọn lý tưởng cho các tác phẩm sáng tạo chất lượng phòng thu, cuộc trò chuyện phức tạp giữa nhiều người, các thẻ có giọng nói dồn dập, cách phát âm khó, phương ngữ vùng miền hoặc thiểu số và bản lồng tiếng dài đòi hỏi giọng nói và âm thanh phòng ổn định. - Sử dụng Gemini 3.8 Flash-Lite TTS
(
gemini-3.8-flash-lite-tts) làm giải pháp thay thế nhanh chóng, tiết kiệm chi phí chogemini-3.1-flash-tts-preview. Mô hình này được tối ưu hoá cho việc sản xuất hàng loạt với khối lượng lớn, chuỗi tác nhân giọng nói đàm thoại, tính năng đọc to, nhân bản giọng nói đáng tin cậy và lời nói hằng ngày của một người nói bằng các ngôn ngữ chính.
Hướng dẫn di chuyển
Nếu bạn đang di chuyển từ các mô hình TTS Gemini gemini-3.1-flash-tts-preview trở xuống sang Gemini 3.8 TTS:
- Di chuyển chỉ dẫn theo từng lượt vào
speech_metadata: Gemini 3.8 TTS coi văn bản đầu vào hoàn toàn là bản chép lời nguyên văn. Di chuyển hướng dẫn về việc phân phối liên tục (style, chẳng hạn như"whispering","out of breath"hoặc"speaking slowly") và nhãn người nói (speaker) vào chú thích có cấu trúcspeech_metadatathay vì nhúng chỉ dẫn sân khấu vào văn bản bản chép lời. - Chỉ sử dụng thẻ nội tuyến có dấu ngoặc nhọn cho các sự kiện âm thanh tại một thời điểm: Giữ nguyên các âm thanh không phải lời nói và khoảng dừng tạm thời trong bản chép lời bằng cách sử dụng dấu ngoặc nhọn (chẳng hạn như
<laugh>,<sigh>,<cough>,<breath>hoặc<short pause>). Tránh sử dụng thẻ hiệu ứng âm thanh (chẳng hạn như tiếng vỗ tay hoặc tiếng thình thịch) và đặt kiểu truyền tải trongspeech_metadata.style. - Chỉ định
speakercho mỗi lượt trong yêu cầu có nhiều người nói: Mỗi lượt trong yêu cầu có nhiều người nói phải bao gồm rõ ràngspeakerbên trongspeech_metadatakhớp với một trong những người nói đã định cấu hình. - Thiết kế các nhân vật giả định trước bằng tính năng Thiết kế giọng nói: Thay thế các khối
"Audio Profile"hoặc"Director's Notes"có nhiều đoạn bằng giọng nói tuỳ chỉnh được tạo trong Thiết kế giọng nói, sau đó truyền mã nhận dạngvoice_...đó qua các yêu cầu TTS của bạn với chuỗistyletối thiểu hoặc trống. - Tính đến kết quả đầu ra WAV (
audio/wav) mặc định cho các yêu cầu một ngôi: Không giống nhưgemini-3.1-flash-tts-previewvà các mô hình TTS cũ hơn (trả về PCM thô không có tiêu đềaudio/l16theo mặc định), Gemini 3.8 TTS trả về âm thanh WAV (audio/wav) có tiêu đề RIFF chuẩn theo mặc định cho các yêu cầu một ngôi.- Nếu trước đây mã của bạn gói các byte PCM thô trong tiêu đề WAV (ví dụ: sử dụng mô-đun
wavecủa Python hoặcffmpeg), hãy xoá trình bao bọc tiêu đề thủ công và ghi trực tiếp các byte được trả về vào tệp.wav. - Nếu quy trình của bạn yêu cầu âm thanh PCM thô, mu-law hoặc A-law không có tiêu đề, hãy đặt rõ ràng
response_format.mime_typethành"audio/l16","audio/mulaw"hoặc"audio/alaw"(ví dụ:{"response_format": {"type": "audio", "mime_type": "audio/l16"}}trong Interactions API hoặcAUDIO_L16tronggenerateContent). Xem phần Định dạng đầu ra âm thanh.
- Nếu trước đây mã của bạn gói các byte PCM thô trong tiêu đề WAV (ví dụ: sử dụng mô-đun
Hướng dẫn về câu lệnh
Các mô hình TTS Gemini 3.8 coi văn bản đầu vào hoàn toàn là một bản chép lời nguyên văn.
Không giống như các mô hình xem trước trước đây có chỉ dẫn sân khấu được nhúng trong văn bản thuần tuý, TTS Gemini 3.8 tách các chỉ dẫn duy trì ở cấp độ lượt (speech_metadata) khỏi các thẻ thoại nội tuyến tại một thời điểm.
Trường kiểu so với thẻ cùng dòng
Chia hướng dẫn về hiệu suất theo phạm vi:
- Mức độ chuyển đổi (
speech_metadata.style): Đặt các thuộc tính chuyển đổi duy trì (chẳng hạn như cảm xúc, ngữ điệu, tốc độ tổng thể hoặc phong cách chuyển đổi (như"whispering","out of breath","muttering"hoặc"sarcastic")) vào trườngstylecủaspeech_metadata. Để tạo một nhân vật và màn trình diễn ổn định qua các lượt, hãy thiết kế tính cách trước trong phần Thiết kế giọng nói và chỉ sử dụngstylecho các điều chỉnh không bắt buộc ở cấp lượt. - Sự kiện tại thời điểm cụ thể (thẻ nội tuyến): Đặt các âm thanh tạm thời không phải lời nói, tiếng thở hoặc khoảng dừng vào trong bản chép lời bằng dấu ngoặc nhọn (
<cough>,<breath>,<sigh>,<short pause>). Sử dụng dấu ngoặc nhọn (<...>) để có chất lượng âm thanh cao nhất và chỉ dùng cho âm thanh do con người phát ra thay vì hiệu ứng âm thanh không phải giọng nói.
| Phạm vi | Vị trí đặt | Ví dụ |
|---|---|---|
| Cấp độ lượt (duy trì trong suốt lượt) | speech_metadata.style |
"angry tone", "speaking rapidly", "out of breath", "whispers", "sarcastic" |
| Tại một thời điểm (xảy ra tại một từ cụ thể) | Nội tuyến trong text (<...>) |
"<cough> Thank you all for coming tonight! <throat-clearing> As I was saying..." |
Nhịp độ và khoảng nghỉ
Bạn có thể kiểm soát nhịp điệu và khoảng lặng ở ba mức độ chi tiết:
- Dấu câu và dấu ba chấm: Sử dụng dấu phẩy, dấu gạch ngang (
--) và dấu ba chấm (...) để thể hiện sự ngập ngừng tự nhiên trong cuộc trò chuyện. - Thẻ tạm dừng cùng dòng: Chèn
<short pause>hoặc<long pause>vào đúng vị trí trong kịch bản mà người nói nên tạm dừng:text Hold on, let me think... <short pause> Alright, I've got it. - Tốc độ ở cấp lượt: Đặt
"style": "speaking rapidly"hoặc"style": "speaking slowly"trongspeech_metadatađể kiểm soát tốc độ nói trong toàn bộ lượt.
Ngữ điệu và cao độ
Sử dụng speech_metadata.style để kiểm soát nhịp điệu, cao độ và ngữ điệu trong một lượt (ví dụ: "style": "high pitch, cheerful and excited inflection" hoặc "style": "monotone and flat"). Nếu cảm xúc hoặc nhịp điệu thay đổi giữa cuộc trò chuyện, hãy chia kịch bản thành các lượt riêng biệt với các giá trị style riêng biệt cho mỗi lượt.
Điểm nhấn
Viết hoa một số từ trong bản chép lời, kết hợp với dấu câu và thẻ thanh nhạc nội dòng để nhấn giọng tự nhiên vào các từ khoá:
This is a VERY important point!
It was a VERY long day <sigh> ... nobody listens anymore.
Tiếng bộc phát và âm thanh không phải lời nói
Đặt âm thanh không phải lời nói của con người cùng dòng bằng cách sử dụng dấu ngoặc nhọn (<...>) tại
vị trí chính xác mà âm thanh sẽ phát ra. Các thẻ giọng nói nên dùng bao gồm:
<argh> |
<breath> |
<heavy breath> |
<exhales> |
<cackle> |
<cheer> |
<chuckle>/<chuckles> |
<cough> |
<cry> |
<gasp> |
<giggle> |
<groan> |
<growl> |
<grunt> |
<grr> |
<hiss> |
<laugh>/<laughter> |
<moan> |
<pant> |
<pff>/<phew> |
<scream> |
<shout> |
<shriek> |
<sigh>/<sighs> |
<sneeze> |
<snicker> |
<snort> |
<sob> |
<throat-clearing> |
<tsk> |
<whimper> |
<whispers>/<whispering> |
<yawn> |
<short pause> |
<long pause> |
Kênh phụ và lời nói chồng chéo
Trong cuộc hội thoại có nhiều người nói, hãy đặt phản ứng của người nghe trong các ký tự gạch đứng (|reaction|) trong lượt nói của người nói để tạo ra các phản hồi tự nhiên hoặc lời nói chồng chéo mà không cần tách thành một lượt riêng cho mỗi phản ứng.
- Trao đổi ngắn gọn: Lồng ghép phản ứng ngắn gọn của người nghe (
|oh hmm|,|oh really?|,|absolutely|) vào lượt nói của người đang nói:- Lượt 1 (Người nói A):
"So the launch is Thursday |oh hmm| Are we actually ready?" - Lượt 2 (Người nói B):
"Ready enough |oh really?| The last blocker cleared this morning." - Lượt 3 (Người nói A):
"Then let's ship it |absolutely| and watch the dashboards."
- Lượt 1 (Người nói A):
- Lời nói chồng chéo và xen kẽ: Sử dụng nhiều đoạn có dấu gạch đứng để mô phỏng lời nói đồng thời hoặc xen kẽ giữa hai người nói (phù hợp nhất với
gemini-3.8-flash-tts):- Đếm ngược/điệp khúc đồng thời:
"Let's surprise him on three |ok| ready?"rồi đến"one. two. three. |happy| happy |birthday| birthday!" - Người nói trùng lặp hoàn toàn:
"Hello |oh| there |my| it |goodness| must |gracious| be |would| almost |you| time |look| for |at that| dinner"
- Đếm ngược/điệp khúc đồng thời:
Tính nhất quán giữa các thế hệ và những điều cần tránh
Hãy làm theo các nguyên tắc sau để giữ cho giọng nói nhất quán trong suốt các lượt:
- Thiết kế tính cách ngay từ đầu trong phần Thiết kế giọng nói thay vì các khối phong cách dài:
Các đoạn văn dài
"Audio Profile"và nhiều dấu đầu dòng"Director's Notes"được chuyển từ các mô hình trước đó là nguyên nhân phổ biến nhất gây ra tình trạng giọng nói bị lệch. Hãy sử dụng trực giác sáng tạo đó ngay từ đầu trong phần Thiết kế giọng nói để tạo một nhân vật tuỳ chỉnhvoice_...cố định, sau đó sử dụng mã nhận dạng giọng nói đó trong các lệnh gọi TTS. - Dựa vào giọng nói tham chiếu để đảm bảo độ ổn định (bỏ qua hướng dẫn meta):
Các mô hình TTS Gemini 3.8 được huấn luyện để ưu tiên giọng nói tham chiếu trước.
Không đưa ra hướng dẫn yêu cầu mô hình giữ giọng nói ổn định (chẳng hạn như
"do not switch speaker identity"hoặc"maintain identical timbre") – văn bản nhắc bổ sung sẽ làm tăng độ lệch. Loại bỏ các chỉ dẫn không cần thiết về phong cách và để mô hình thay đổi một cách tự nhiên xung quanh điểm ổn định do giọng nói tham khảo cung cấp. - Đừng cố gắng thay đổi các đặc điểm không thay đổi của người nói trong
style: Tránh đưa tuổi, giới tính, tên hoặc các thay đổi về giọng điệu vĩnh viễn vàospeech_metadata.style. Thay vào đó, hãy chọn một giọng nói theo khu vực trong Thư viện giọng nói mở rộng hoặc tạo một giọng nói bằng tính năng Thiết kế giọng nói.
Quy trình công việc được đề xuất
- Tạo nhân vật một lần: Tạo nhân vật trong phần Thiết kế giọng nói hoặc chọn một giọng nói theo khu vực trong Thư viện giọng nói mở rộng phù hợp với ngôn ngữ đích và nhân vật của bạn.
- Viết bản chép lời bằng ngôn ngữ nói tự nhiên, có cả những chỗ ngập ngừng: Để đảm bảo tính tự nhiên tối đa, hãy viết
textdưới dạng bản chép lời bằng ngôn ngữ nói thực tế, bao gồm cả những chỗ ngập ngừng và do dự tự nhiên trong cuộc trò chuyện (ví dụ:"Oh uh yeah I think... hm, so that's interesting"). - Trước tiên, hãy kiểm tra TTS thuần tuý: Tổng hợp bản chép lời của bạn bằng một trường
styletrống trước tiên – hầu hết các yêu cầu đều không cần hướng dẫnstyle. - Chỉ thêm câu lệnh ngắn
styleđể tinh chỉnh: Chỉ thêm một chuỗistylengắn gọn (chẳng hạn như"casual, friendly"hoặc"muttering, then reassuring") cho những lượt cần điều chỉnh cụ thể về cách phân phối và sử dụng lại chính xác chuỗi ngắn đó trong các lượt khi bạn muốn có một đường cơ sở nhất quán.
Tác nhân thoại và hội thoại nhiều lượt
Khi xây dựng tác nhân thoại trò chuyện theo thời gian thực hoặc ứng dụng nhiều lượt:
- Thực hiện một lệnh gọi TTS mỗi lượt khi các đoạn văn bản LLM đến.
- Cho phép
voiceđã định cấu hình (được tạo sẵn, được thiết kếvoice_...hoặc được sao chépvoice_.../voicekey_...) mang danh tính của người nói qua các lượt trò chuyện – không bao giờ gửi lại một nhân vật dài ở mỗi lượt. - Để trống trường
styletheo lượt hoặc gửi một chuỗi hằng số ngắn (chẳng hạn như"casual, friendly") cho toàn bộ cuộc trò chuyện. - Chia câu trả lời dài của nhân viên hỗ trợ thành các lượt ngắn hơn thay vì sử dụng câu lệnh có phong cách mạnh mẽ hơn.
Các điểm hạn chế
- Mô hình TTS chấp nhận dữ liệu đầu vào chỉ có văn bản và tạo ra dữ liệu đầu ra chỉ có âm thanh.
- Tính năng tạo nhiều người nói bằng một yêu cầu (
speech_config.speakers) hỗ trợ tối đa 2 người nói bằng giọng nói được tạo sẵn. Để kết hợp giọng nói được thiết kế tuỳ chỉnh (voice_...) hoặc giọng nói được sao chép (voice_.../voicekey_...) trong cuộc hội thoại có nhiều nhân vật, hãy tổng hợp riêng lượt nói của từng người nói. Vì các yêu cầu một ngôi trả vềaudio/wavcó tiêu đề RIFF 44 byte theo mặc định, nên hãy yêu cầu PCM thô ({"type": "audio", "mime_type": "audio/l16"}) hoặc xoá tiêu đề WAV khỏi mỗi lượt trước khi nối các khung âm thanh PCM 24kHz. - Giới hạn bộ nhớ và TTL của giọng nói tuỳ chỉnh:
- Giọng nói có trạng thái (
store=True, được nhắc hoặc sao chép): Tối đa 200 giọng nói cho mỗi dự án với TTL (thời gian tồn tại) là 1 năm. - Khoá thoại không trạng thái (
store=False,voicekey_...): TTL 7 ngày (thời gian tồn tại).
- Giọng nói có trạng thái (
- Xem phần Ngôn ngữ được hỗ trợ để biết phạm vi hỗ trợ ngôn ngữ.
Bước tiếp theo
- Tạo giọng nói tuỳ chỉnh từ ngôn ngữ tự nhiên bằng tính năng Thiết kế giọng nói.
- Nhân bản giọng nói của một người nói hiện có trong tính năng Nhân bản giọng nói.
- So sánh thông số kỹ thuật của mô hình trên các trang mô hình Gemini 3.8 Flash TTS và Gemini 3.8 Flash-Lite TTS.
- Khám phá âm thanh tương tác hai chiều bằng Live API.