API Chuyển văn bản sang lời nói (AI tạo sinh)

Với API Chuyển văn bản sang lời nói GenAI của Bộ công cụ học máy, bạn có thể tổng hợp nội dung văn bản thành âm thanh lời nói. API Chuyển văn bản sang lời nói sử dụng mô hình AI tạo sinh để cung cấp khả năng tổng hợp lời nói chất lượng cao.

Bạn nên sử dụng API Chuyển văn bản sang lời nói của Bộ công cụ học máy khi có thể vì API này cung cấp giọng nói rất giống con người. Tuy nhiên, nếu không có API này, bạn có thể sử dụng API TextToSpeech của nền tảng Android.

Các chức năng chính

  • Các lựa chọn tải xuống và suy luận hợp nhất trong một SDK duy nhất.
  • API ưu tiên Kotlin sử dụng coroutine và Flow để truyền trực tuyến trạng thái phát và âm thanh.

Điều kiện tiên quyết

Để sử dụng API chuyển văn bản sang lời nói, bạn phải đáp ứng các yêu cầu sau:

  • Bạn có một trong các thiết bị được hỗ trợ sau đây:
    • Google: Pixel 8, Pixel 9, Pixel 10, Pixel 11
    • Samsung: Galaxy S25, Galaxy S26, Galaxy Z Fold8, Galaxy Z Fold8 Ultra, Galaxy Z Flip8
  • Bạn đang dùng phiên bản mới nhất của ứng dụng Nhận dạng và tổng hợp lời nói (com.google.android.tts) trên Google Play. Nếu ứng dụng bị thiếu hoặc đã lỗi thời, thì khi triển khai tính năng chuyển văn bản sang lời nói, phương thức checkStatus() sẽ trả về FeatureStatus.UNAVAILABLE.
  • Dự án của bạn sử dụng phiên bản SDK tối thiểu (minSdk) là 26 trở lên.

Bắt đầu

Để bắt đầu, hãy thêm phần phụ thuộc Chuyển văn bản sang lời nói của Bộ công cụ học máy vào tệp build.gradle.kts (hoặc build.gradle) cấp mô-đun:

Kotlin

dependencies {
    // ML Kit GenAI TTS SDK
    implementation("com.google.mlkit:genai-text-to-speech:1.0.0-alpha1")
}

Groovy

dependencies {
    // ML Kit GenAI TTS SDK
    implementation 'com.google.mlkit:genai-text-to-speech:1.0.0-alpha1'
}

Tích hợp API chuyển văn bản sang lời nói

Để sử dụng Text to Speech API, hãy làm theo các bước sau:

  1. Khởi chạy ứng dụng: Tạo một thực thể ứng dụng SpeechSynthesizer bằng cách truyền một đối tượng cấu hình SpeechSynthesizerOptions. Bạn chỉ cần một phiên bản ứng dụng khách duy nhất để hỗ trợ tất cả ngôn ngữ. Ngôn ngữ được chỉ định trong đối tượng tuỳ chọn chỉ xác định danh sách ngôn ngữ mặc định do phương thức getSupportedVoices() trả về.
  2. Tải mô hình xuống: Kiểm tra xem giọng nói mục tiêu của bạn có sẵn hay không. Nếu trạng thái là FeatureStatus.DOWNLOADABLE, hãy gọi phương thức download() để tải mô hình giọng nói xuống thiết bị.
  3. Tổng hợp nội dung: Tạo một đối tượng SpeechSynthesizerRequest chứa văn bản đầu vào và giọng nói mục tiêu. Gọi phương thức synthesize() để tạo âm thanh, đồng thời thu thập thông tin cập nhật về trạng thái phát và các đoạn âm thanh.
// Initialize the `SpeechSynthesizer` client.
// One client serves every language. `Locale.US` is only the default list locale.
val options = speechSynthesizerOptions(Locale.US)
val client = SpeechSynthesis.getClient(options)

// Query voices for multiple languages using the same client instance.
val englishVoice = client.getSupportedVoices().first() // Uses the default `Locale.US`
val frenchVoice = client.getSupportedVoices(Locale.FRANCE).first()

// Check and download a voice model (for example, the French voice model).
if (client.checkStatus(frenchVoice) == FeatureStatus.DOWNLOADABLE) {
    client.download(frenchVoice).collect { status -> println("Download status: $status") }
}

// Construct the request.
// The `VoiceInfo` instance, `frenchVoice` here, determines the spoken language.
val request = SpeechSynthesizerRequest(
    input = SpeechSynthesizerRequest.Input.Text("Bonjour tout le monde", frenchVoice),
    audioAttributes = AudioAttributes.Builder()
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
        .build()
)

// Speak and collect streaming audio or status.
client.synthesize(request).collect { response ->
    when (response) {
        is SpeechSynthesizerResponse.StatusUpdate -> println("Playback status: ${response.status}")
        is SpeechSynthesizerResponse.AudioAvailable -> println("Audio chunk: ${response.audio.size} bytes")
        is SpeechSynthesizerResponse.Error -> println("Error: ${response.errorCode}")
    }
}

// Release resources when done.
client.close()

Giọng nói được hỗ trợ

API Chuyển văn bản sang lời nói của Bộ công cụ học máy hỗ trợ các giọng nói sau. Chọn giọng nói theo tên bằng thuộc tính VoiceInfo.name.

  • star02: nữ, giọng trung
  • star04: nam, giọng trung cao
  • star05: nam, giọng trầm
  • star08: nữ, giọng trầm
  • star11: nam, giọng trung, nghe trẻ trung
  • star12: nữ, giọng trung cao
  • star13: nam, giọng trung
  • star16: nữ, giọng trung trầm

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

API Chuyển văn bản sang lời nói của Bộ công cụ học máy hỗ trợ các ngôn ngữ sau:

  • Tiếng Ả Rập (ar-XA)
  • Tiếng Đan Mạch (da-DK)
  • Tiếng Đức (de-DE)
  • Tiếng Anh (en-GB)
  • Tiếng Anh (en-US)
  • Tiếng Tây Ban Nha (es-ES)
  • Tiếng Tây Ban Nha (es-US)
  • Tiếng Pháp (fr-CA)
  • Tiếng Pháp (fr-FR)
  • Tiếng Hindi (hi-IN)
  • Tiếng Indonesia (id-ID)
  • Tiếng Italy (it-IT)
  • Tiếng Nhật (ja-JP)
  • Tiếng Hàn (ko-KR)
  • Tiếng Na Uy (nb-NO)
  • Tiếng Hà Lan (nl-NL)
  • Tiếng Ba Lan (pl-PL)
  • Tiếng Bồ Đào Nha (pt-BR)
  • Tiếng Nga (ru-RU)
  • Tiếng Thuỵ Điển (sv-SE)
  • Tiếng Thổ Nhĩ Kỳ (tr-TR)

Các vấn đề thường gặp khi thiết lập

Sau đây là một số vấn đề thường gặp và mẹo khắc phục sự cố:

Vấn đề Nguyên nhân có thể xảy ra Cách khắc phục được đề xuất
Danh sách giọng nói (từ phương thức getSupportedVoices()) đang trống. Thiết bị không được hỗ trợ hoặc ứng dụng Nhận dạng và tổng hợp lời nói bị thiếu hoặc đã lỗi thời. Kiểm tra để đảm bảo thiết bị của bạn được hỗ trợ và cập nhật ứng dụng Nhận dạng và tổng hợp lời nói.
Phương thức checkStatus() trả về FeatureStatus.UNAVAILABLE. Thiết bị không được hỗ trợ hoặc ứng dụng Nhận dạng và tổng hợp lời nói bị thiếu hoặc đã lỗi thời. Kiểm tra để đảm bảo thiết bị của bạn được hỗ trợ và cập nhật ứng dụng Nhận dạng và tổng hợp lời nói.
Phương thức checkStatus() trả về FeatureStatus.DOWNLOADABLE. Giọng nói chưa được tải xuống thiết bị. Gọi phương thức download() và đợi phương thức này hoàn tất trước khi gọi phương thức synthesize().
Quá trình tải xuống không thành công hoặc không tiến triển. Không có kết nối mạng. Hãy thử lại khi thiết bị có kết nối mạng.