Bản chép lời

Gemini API chuyển đổi lời nói trong tệp âm thanh thành văn bản bằng mô hình Gemini 3.5 Transcribe (gemini-3.5-transcribe). Dựa trên khả năng hiểu âm thanh của Gemini, API này cung cấp bản chép lời chính xác với tính năng tự động nhận dạng ngôn ngữ, phân biệt người nói, dấu thời gian ở cấp từ và gợi ý từ vựng tuỳ chỉnh. Ứng dụng này cũng cung cấp chế độ chuyển lời nói thành văn bản thông minh, có tính năng loại bỏ lỗi diễn đạt và định dạng thông minh.

Để chép lời một tệp âm thanh, hãy tải tệp âm thanh đó lên và truyền đến gemini-3.5-transcribe:

Python

from google import genai

client = genai.Client()

audio_file = client.files.upload(file="path/to/sample.mp3")

interaction = client.interactions.create(
    model="gemini-3.5-transcribe",
    input=[
        {
            "type": "audio",
            "uri": audio_file.uri,
            "mime_type": audio_file.mime_type,
        }
    ],
)

print(interaction.output_text)

JavaScript

import { GoogleGenAI } from "@google/genai";

const client = new GoogleGenAI({});

const audioFile = await client.files.upload({
  file: "path/to/sample.mp3",
  config: { mime_type: "audio/mp3" },
});

const interaction = await client.interactions.create({
  model: "gemini-3.5-transcribe",
  input: [
    {
      type: "audio",
      uri: audioFile.uri,
      mime_type: audioFile.mimeType,
    },
  ],
});

console.log(interaction.output_text);

REST

# First upload the file via the Files API, then pass its URI:
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.5-transcribe",
    "input": [
      {
        "type": "audio",
        "uri": "YOUR_FILE_URI",
        "mime_type": "audio/mp3"
      }
    ]
  }'

Tổng quan

Gemini 3.5 Transcribe được tối ưu hoá cho các nhiệm vụ chuyển lời nói thành văn bản. Tính năng này có thể xử lý nhiều giọng nói, tạp âm và cuộc trò chuyện bằng nhiều ngôn ngữ.

Các chức năng chính bao gồm:

  • Nhận dạng lời nói tự động (ASR): Tự động phát hiện ngôn ngữ ở hơn 85 địa điểm. Xử lý việc chuyển đổi ngôn ngữ trong câu và giữa các câu mà không cần định cấu hình theo cách thủ công.
  • Từ vựng tuỳ chỉnh: Hỗ trợ nhận dạng các thuật ngữ, từ viết tắt và tên riêng theo từng miền bằng cách truyền tối đa 1.000 cụm từ.
  • Phân biệt người nói: Phân biệt nhiều người nói và gán các đoạn lời nói cho các nhãn riêng biệt.
  • Dấu thời gian ở cấp từ: Tạo độ lệch chính xác về thời gian bắt đầu và thời gian kết thúc cho từng từ được nhận dạng.
  • Bản chép lời thông minh: Loại bỏ các lỗi diễn đạt, từ đệm, từ lặp và áp dụng định dạng có cấu trúc.
  • Định dạng và chuẩn hoá: Áp dụng cách viết hoa, dấu câu và chuẩn hoá văn bản nghịch đảo, chẳng hạn như chuyển đổi "hai mươi sáu triệu đô la" thành "26 triệu USD".

Để đưa ra suy luận chung về âm thanh hoặc trả lời câu hỏi về nội dung âm thanh, hãy sử dụng Tính năng hiểu âm thanh. Để tổng hợp âm thanh bằng tính năng chuyển văn bản sang lời nói, hãy sử dụng Chuyển văn bản sang lời nói.

Phát hiện ngôn ngữ và gợi ý

Theo mặc định, mô hình này sẽ tự động phát hiện ngôn ngữ được nói. Tính năng này sẽ chuyển đổi giữa các ngôn ngữ một cách linh hoạt khi người nói chuyển đổi ngôn ngữ.

Để sử dụng tính năng phát hiện tự động, hãy bỏ qua language_codes hoặc cung cấp một danh sách trống:

Python

interaction = client.interactions.create(
    model="gemini-3.5-transcribe",
    input=[
        {
            "type": "audio",
            "uri": audio_file.uri,
            "mime_type": audio_file.mime_type,
        }
    ],
    generation_config={
        "transcription_config": {
            "language_codes": [],
        }
    },
)

JavaScript

const interaction = await client.interactions.create({
  model: "gemini-3.5-transcribe",
  input: [
    {
      type: "audio",
      uri: audioFile.uri,
      mime_type: audioFile.mimeType,
    },
  ],
  generation_config: {
    transcription_config: {
      language_codes: [],
    },
  },
});

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.5-transcribe",
    "input": [
      {
        "type": "audio",
        "uri": "YOUR_FILE_URI",
        "mime_type": "audio/mp3"
      }
    ],
    "generation_config": {
      "transcription_config": {
        "language_codes": []
      }
    }
  }'

Nếu biết trước ngôn ngữ, hãy chỉ định mã ngôn ngữ BCP-47 trong language_codes để cải thiện độ chính xác của bản chép lời (xem Các ngôn ngữ được hỗ trợ):

Python

generation_config = {
    "transcription_config": {
        "language_codes": ["es-ES"],
    }
}

JavaScript

const generationConfig = {
  transcription_config: {
    language_codes: ["es-ES"],
  },
};

REST

{
  "generation_config": {
    "transcription_config": {
      "language_codes": ["es-ES"]
    }
  }
}

Từ vựng tuỳ chỉnh

Bạn có thể hướng mô hình lời nói đến những từ không thông dụng, biệt ngữ kỹ thuật, tên thương hiệu hoặc danh từ riêng. Cung cấp tối đa 1.000 cụm từ trong mảng custom_vocabulary (thường đạt được kết quả tốt nhất với tối đa 100 cụm từ):

Python

interaction = client.interactions.create(
    model="gemini-3.5-transcribe",
    input=[
        {
            "type": "audio",
            "uri": audio_file.uri,
            "mime_type": audio_file.mime_type,
        }
    ],
    generation_config={
        "transcription_config": {
            "custom_vocabulary": ["Gemini", "Kubernetes", "BigQuery"],
        }
    },
)

JavaScript

const interaction = await client.interactions.create({
  model: "gemini-3.5-transcribe",
  input: [
    {
      type: "audio",
      uri: audioFile.uri,
      mime_type: audioFile.mimeType,
    },
  ],
  generation_config: {
    transcription_config: {
      custom_vocabulary: ["Gemini", "Kubernetes", "BigQuery"],
    },
  },
});

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.5-transcribe",
    "input": [
      {
        "type": "audio",
        "uri": "YOUR_FILE_URI",
        "mime_type": "audio/mp3"
      }
    ],
    "generation_config": {
      "transcription_config": {
        "custom_vocabulary": ["Gemini", "Kubernetes", "BigQuery"]
      }
    }
  }'

Phân tách người nói

Tính năng phân đoạn theo người nói xác định các giọng nói khác nhau trong bản ghi và gắn thẻ cho từng đoạn bằng một giá trị nhận dạng người nói, chẳng hạn như spk_1 hoặc spk_2. Hỗ trợ tối đa 8 người nói (thuộc tính cho 3 người nói trở lên đang trong giai đoạn thử nghiệm).

Bật tính năng phân tách người nói bằng cách định cấu hình diarization_mode trong mode:

Python

interaction = client.interactions.create(
    model="gemini-3.5-transcribe",
    input=[
        {
            "type": "audio",
            "uri": audio_file.uri,
            "mime_type": audio_file.mime_type,
        }
    ],
    generation_config={
        "transcription_config": {
            "mode": {
                "type": "verbatim",
                "diarization_mode": "speaker",
            },
        }
    },
)

JavaScript

const interaction = await client.interactions.create({
  model: "gemini-3.5-transcribe",
  input: [
    {
      type: "audio",
      uri: audioFile.uri,
      mime_type: audioFile.mimeType,
    },
  ],
  generation_config: {
    transcription_config: {
      mode: {
        type: "verbatim",
        diarization_mode: "speaker",
      },
    },
  },
});

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.5-transcribe",
    "input": [
      {
        "type": "audio",
        "uri": "YOUR_FILE_URI",
        "mime_type": "audio/mp3"
      }
    ],
    "generation_config": {
      "transcription_config": {
        "mode": {
          "type": "verbatim",
          "diarization_mode": "speaker"
        }
      }
    }
  }'

Dấu thời gian ở cấp độ từ

Dấu thời gian ở cấp từ cung cấp độ lệch chính xác về thời gian bắt đầu và kết thúc cho từng từ được nhận dạng trong luồng âm thanh.

Bật dấu thời gian bằng cách định cấu hình timestamp_granularities trong mode:

Python

interaction = client.interactions.create(
    model="gemini-3.5-transcribe",
    input=[
        {
            "type": "audio",
            "uri": audio_file.uri,
            "mime_type": audio_file.mime_type,
        }
    ],
    generation_config={
        "transcription_config": {
            "mode": {
                "type": "verbatim",
                "timestamp_granularities": ["word"],
            },
        }
    },
)

JavaScript

const interaction = await client.interactions.create({
  model: "gemini-3.5-transcribe",
  input: [
    {
      type: "audio",
      uri: audioFile.uri,
      mime_type: audioFile.mimeType,
    },
  ],
  generation_config: {
    transcription_config: {
      mode: {
        type: "verbatim",
        timestamp_granularities: ["word"],
      },
    },
  },
});

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.5-transcribe",
    "input": [
      {
        "type": "audio",
        "uri": "YOUR_FILE_URI",
        "mime_type": "audio/mp3"
      }
    ],
    "generation_config": {
      "transcription_config": {
        "mode": {
          "type": "verbatim",
          "timestamp_granularities": ["word"]
        }
      }
    }
  }'

Bạn có thể kết hợp diarization_modetimestamp_granularities trong mode để nhận cả nhãn người nói và dấu thời gian của từ:

Python

generation_config = {
    "transcription_config": {
        "custom_vocabulary": ["Gemini"],
        "mode": {
            "type": "verbatim",
            "diarization_mode": "speaker",
            "timestamp_granularities": ["word"],
        },
    }
}

JavaScript

const generationConfig = {
  transcription_config: {
    custom_vocabulary: ["Gemini"],
    mode: {
      type: "verbatim",
      diarization_mode: "speaker",
      timestamp_granularities: ["word"],
    },
  },
};

REST

{
  "generation_config": {
    "transcription_config": {
      "custom_vocabulary": ["Gemini"],
      "mode": {
        "type": "verbatim",
        "diarization_mode": "speaker",
        "timestamp_granularities": ["word"]
      }
    }
  }
}

Chế độ chép lời

Gemini 3.5 Transcribe hỗ trợ 2 chế độ chép lời thông qua tham số mode:

  • verbatim (mặc định): Trả về bản chép lời chính xác từng từ của mọi nội dung được nói, giữ nguyên các từ đệm thô ("ừm", "ờ", "như", "bạn biết đấy"), nội dung lặp lại, khoảng dừng và câu bắt đầu sai. Dấu thời gian và tính năng phân tách người nói được định cấu hình trong chế độ này ({"type": "verbatim", ...}).
  • smart (Chép lời thông minh): Tối ưu hoá bản chép lời để dễ đọc bằng cách áp dụng quy trình xử lý hậu kỳ thông minh:
    • Loại bỏ lỗi trong lời nói: Loại bỏ từ đệm, lỗi nói lắp và lỗi bắt đầu trong cuộc trò chuyện.
    • Tự sửa lỗi ngay trong câu: Giải quyết trực tiếp các lỗi khi nói (ví dụ: "Let's meet on Tuesday, actually no, Wednesday at two" (Hãy gặp nhau vào thứ Ba, à không, thứ Tư lúc 2 giờ) sẽ trở thành "Let's meet on Wednesday at 2:00 PM" (Hãy gặp nhau vào thứ Tư lúc 2 giờ chiều)).
    • Định dạng có cấu trúc tự động: Tự động sắp xếp các ý tưởng được nói thành đoạn văn, danh sách có đánh số, dấu đầu dòng, ngày, đơn vị tiền tệ và số được định dạng.
    • Dọn dẹp ngữ pháp: Áp dụng dấu câu, cách viết hoa đầu câu và cách diễn đạt tự nhiên.
Âm thanh lời nói verbatim đầu ra smart Đầu ra (Bản chép lời thông minh)
"Ừm, về cuộc họp này, tôi nghĩ chúng ta nên mời Alice và, khoan đã, không phải, là Bob và Carol." "Um so for the meeting I think we should uh invite Alice and wait no Bob and Carol." "Tôi nghĩ chúng ta nên mời Bob và Carol tham dự cuộc họp."
"First item review budget second item finalize timeline third item send recap" "first item review budget second item finalize timeline third item send recap" (mục đầu tiên xem xét ngân sách, mục thứ hai hoàn tất tiến trình, mục thứ ba gửi bản tóm tắt) "1. Xem lại ngân sách
2. Hoàn thiện dòng thời gian
3. Gửi thông tin tóm tắt"

Python

interaction = client.interactions.create(
    model="gemini-3.5-transcribe",
    input=[
        {
            "type": "audio",
            "uri": audio_file.uri,
            "mime_type": audio_file.mime_type,
        }
    ],
    generation_config={
        "transcription_config": {
            "mode": "smart",
        }
    },
)
print(interaction.output_text)

JavaScript

const interaction = await client.interactions.create({
  model: "gemini-3.5-transcribe",
  input: [
    {
      type: "audio",
      uri: audioFile.uri,
      mime_type: audioFile.mimeType,
    },
  ],
  generation_config: {
    transcription_config: {
      mode: "smart",
    },
  },
});
console.log(interaction.output_text);

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.5-transcribe",
    "input": [
      {
        "type": "audio",
        "uri": "YOUR_FILE_URI",
        "mime_type": "audio/mp3"
      }
    ],
    "generation_config": {
      "transcription_config": {
        "mode": "smart"
      }
    }
  }'

Phân tích cú pháp đầu ra của bản chép lời

Toàn bộ văn bản chép lời sẽ được trả về trong interaction.output_text.

Khi timestamp_granularities hoặc diarization_mode được bật, API cũng trả về chú thích chi tiết ở cấp từ được đính kèm vào nội dung tương tác.

Sau đây là cách trích xuất và lặp lại dấu thời gian của từ và lượt lời của người nói:

Python

def extract_word_annotations(interaction):
    words = []
    for step in getattr(interaction, "steps", []) or []:
        for content in getattr(step, "content", []) or []:
            for annotation in getattr(content, "annotations", []) or []:
                if getattr(annotation, "type", None) == "word_info":
                    words.append(annotation)
    return words

words = extract_word_annotations(interaction)

for w in words:
    speaker = f"[{w.speaker}] " if getattr(w, "speaker", None) else ""
    start = getattr(w, "start_offset", "")
    end = getattr(w, "end_offset", "")
    timing = f"({start} -> {end}) " if start and end else ""
    print(f"{speaker}{timing}{w.text}")

JavaScript

function extractWordAnnotations(interaction) {
  const words = [];
  for (const step of interaction.steps ?? []) {
    for (const content of step.content ?? []) {
      for (const annotation of content.annotations ?? []) {
        if (annotation.type === "word_info") {
          words.push(annotation);
        }
      }
    }
  }
  return words;
}

const words = extractWordAnnotations(interaction);

for (const w of words) {
  const speaker = w.speaker ? `[${w.speaker}] ` : "";
  const timing = (w.start_offset && w.end_offset) ? `(${w.start_offset} -> ${w.end_offset}) ` : "";
  console.log(`${speaker}${timing}${w.text}`);
}

REST

{
  "id": "interactions/abc123xyz",
  "status": "completed",
  "steps": [
    {
      "id": "step_001",
      "type": "model_output",
      "content": [
        {
          "type": "text",
          "text": "Hello world",
          "annotations": [
            {
              "type": "word_info",
              "text": "Hello",
              "speaker": "spk_1",
              "start_offset": "0.100s",
              "end_offset": "0.450s"
            },
            {
              "type": "word_info",
              "text": "world",
              "speaker": "spk_1",
              "start_offset": "0.500s",
              "end_offset": "0.850s"
            }
          ]
        }
      ]
    }
  ]
}

Ngôn ngữ được hỗ trợ

Gemini 3.5 Transcribe hỗ trợ các ngôn ngữ và mã ngôn ngữ BCP-47 sau đây:

Ngôn ngữ Mã BCP-47 Ngôn ngữ Mã BCP-47
Tiếng Hà Lan ở Nam Phi af-ZA Tiếng Nhật ja-JP
Tiếng Amhara am-ET Tiếng Java jv-ID
Tiếng Ả Rập (Ai Cập) ar-EG Kabuverdianu kea-CV
Tiếng Armenia hy-AM Tiếng Kannada kn-IN
Tiếng Assam as-IN Tiếng Kazakh kk-KZ
Tiếng Azerbaijan az-AZ Tiếng Hàn ko-KR
Tiếng Belarus be-BY Tiếng Kyrgyz ky-KG
Tiếng Bengali (Bangladesh) bn-BD Tiếng Latvia lv-LV
Tiếng Bengal (Ấn Độ) bn-IN Tiếng Lingala ln-CD
Tiếng Bosnia bs-BA Tiếng Lithuania lt-LT
Tiếng Bungary bg-BG Tiếng Macedonia mk-MK
Tiếng Bungary (tiếng Aromania) rup-BG Tiếng Malay ms-MY
Tiếng Miến Điện my-MM Tiếng Malayalam ml-IN
Tiếng Quảng Đông (Phồn thể) yue-Hant-HK Tiếng Malta mt-MT
Tiếng Catalan ca-ES Tiếng Trung phổ thông (Giản thể) cmn-Hans-CN
Tiếng Cebuano ceb Tiếng Marathi mr-IN
Tiếng Khmer km-KH Tiếng Mông Cổ mn-MN
Tiếng Croatia hr-HR Tiếng Nepal ne-NP
Tiếng Séc cs-CZ Tiếng Na Uy nb-NO
Tiếng Đan Mạch da-DK Tiếng Oriya or-IN
Tiếng Hà Lan nl-NL Tiếng Ba Lan pl-PL
Tiếng Anh (Anh) en-GB Tiếng Bồ Đào Nha (Brazil) pt-BR
Tiếng Anh (Ấn Độ) en-IN Tiếng Bồ Đào Nha (Bồ Đào Nha) pt-PT
Tiếng Anh (Mỹ) en-US Tiếng Punjab pa-IN
Tiếng Estonia et-EE Tiếng Punjab (chữ Gurmukhi) pa-Guru-IN
Tiếng Farsi fa-IR Tiếng Rumani ro-RO
Tiếng Philippines fil-PH Tiếng Nga ru-RU
Tiếng Phần Lan fi-FI Tiếng Serbia sr-RS
Tiếng Pháp fr-FR Tiếng Sindhi (chữ Ả Rập) sd-Arab-IN
Tiếng Galicia gl-ES Tiếng Slovak sk-SK
Tiếng Gruzia ka-GE Tiếng Slovenia sl-SI
Tiếng Đức de-DE Tiếng Tây Ban Nha (Mỹ La Tinh) es-419
Tiếng Hy Lạp el-GR Tiếng Tây Ban Nha (Mỹ) es-US
Tiếng Gujarat gu-IN Tiếng Swahili (Kenya) sw-KE
Tiếng Hausa ha-NG Tiếng Thuỵ Điển sv-SE
Tiếng Do Thái he-IL Tiếng Tajik tg-TJ
Tiếng Hindi hi-IN Tiếng Telugu te-IN
Tiếng Hungary hu-HU Tiếng Thái th-TH
Tiếng Iceland is-IS Tiếng Thổ Nhĩ Kỳ tr-TR
Tiếng Anh Ấn Độ en-IN Tiếng Ukraina uk-UA
Tiếng Indonesia id-ID Tiếng Uzbek uz-UZ
Tiếng Ý it-IT Tiếng Việt vi-VN

Tài liệu tham khảo về tham số

Định cấu hình tính năng chép lời bằng cách đặt các trường trong đối tượng transcription_config trong generation_config:

Trường Loại Mô tả
language_codes Mảng chuỗi Mã ngôn ngữ BCP-47 (ví dụ: ["en-US"]). Nếu bạn bỏ qua hoặc để trống ([]), mô hình sẽ tự động phát hiện ngôn ngữ và xử lý việc chuyển đổi mã.
custom_vocabulary Mảng chuỗi Tối đa 1.000 thuật ngữ, từ viết tắt hoặc tên riêng tuỳ chỉnh để hỗ trợ tính năng nhận dạng lời nói.
mode Đối tượng hoặc chuỗi Cấu hình chế độ chép lời. Chấp nhận "smart" hoặc một đối tượng chế độ nguyên văn ({"type": "verbatim", ...}). Mặc định là bản chép lời nguyên văn.
mode.type Chuỗi (Chỉ chế độ nguyên văn) Mã nhận dạng chế độ. Luôn đặt thành "verbatim".
mode.timestamp_granularities Mảng chuỗi (Chỉ chế độ nguyên văn) Mức độ chi tiết của dấu thời gian cần trả về. Truyền ["word"] để bật độ lệch đầu và cuối từ.
mode.diarization_mode Chuỗi (Chỉ ở chế độ nguyên văn) Chế độ phân đoạn lời thoại. Truyền "speaker" để xác định và gắn nhãn cho từng người nói riêng biệt.

Các phương pháp hay nhất

  • Cung cấp âm thanh rõ ràng: Đảm bảo bản ghi âm có giọng nói rõ ràng và tránh bị cắt xén nghiêm trọng.
  • Cung cấp gợi ý về ngôn ngữ khi biết: Nếu biết trước ngôn ngữ của âm thanh, hãy chỉ định language_codes để tối đa hoá độ chính xác.
  • Mục tiêu từ vựng tuỳ chỉnh: Chỉ thêm các thuật ngữ riêng biệt trong miền, tên thương hiệu hoặc danh từ riêng vào custom_vocabulary thay vì các từ thông thường hằng ngày.
  • Sử dụng Files API cho các bản ghi âm có kích thước lớn: Đối với các tệp dài hơn vài giây, hãy tải tệp lên bằng client.files.upload và truyền URI tệp được trả về cho mô hình.

Các điểm hạn chế

  • Thời lượng âm thanh: Các yêu cầu đơn phương tiêu chuẩn hỗ trợ tệp âm thanh có thời lượng tối đa 1 giờ. Thời gian xử lý âm thanh bị giới hạn ở 30 phút khi bạn bật các tính năng như phân loại người nói hoặc dấu thời gian ở cấp độ từ.
  • Dấu thời gian ở cấp từ: Việc bật dấu thời gian ở cấp từ có thể làm giảm độ chính xác tổng thể của bản chép lời.
  • Phân tách người nói: Tính năng phân tách người nói hỗ trợ tối đa 8 người nói. Tính năng phân bổ cho người nói đối với 3 người nói trở lên đang trong giai đoạn thử nghiệm.
  • Từ vựng tuỳ chỉnh: Bạn có thể cung cấp tối đa 1.000 thuật ngữ trong custom_vocabulary, nhưng kết quả tốt nhất thường đạt được khi có tối đa 100 thuật ngữ.
  • Khả năng tương thích với chế độ: Bạn không thể kết hợp tính năng chép lời thông minh ("smart") với timestamp_granularities hoặc diarization_mode.

Bước tiếp theo