GenAI Speech Recognition API

ภายใน GenAI Speech Recognition API ของ ML Kit คุณสามารถถอดเสียงเนื้อหาเสียงเป็นข้อความได้ API นี้รองรับโหมดต่อไปนี้

  • ขั้นสูง: Speech Recognition API ใช้โมเดล GenAI ซึ่งครอบคลุมภาษาได้กว้างขึ้นและมีคุณภาพโดยรวมดีขึ้น คุณไม่จำเป็นต้องดาวน์โหลดแพ็กภาษาแยกต่างหากสำหรับแต่ละภาษา ซึ่งจะช่วยประหยัดพื้นที่เก็บข้อมูล
  • พื้นฐาน: Speech Recognition API ใช้โมเดลการจดจำเสียงพูดในอุปกรณ์แบบดั้งเดิม ซึ่งคล้ายกับ SpeechRecognizer API

Speech Recognition API จะถอดเสียงเนื้อหาเสียงเป็นข้อความในภาษาเดียวกัน หากต้องการถอดเสียงเป็นข้อความในภาษาอื่น ให้ใช้ Speech Translation API

ความสามารถหลัก

  • บันทึกอินพุตสตรีมมิงจากไมโครโฟนหรือไฟล์เสียง
  • ถอดเสียงไฟล์ที่บันทึกไว้ล่วงหน้าทั้งไฟล์ด้วยเมธอด AudioSource.fromFile() หรือ AudioSource.fromUri() โปรดดูรายละเอียดที่หัวข้อข้อกำหนดเกี่ยวกับอินพุตเสียง
  • สำหรับอินพุตสตรีมมิง จะระบุเวลาเริ่มต้นที่แน่นอนของคำที่ระบบจดจำได้แต่ละคำเพื่อช่วยคุณซิงค์ภาพเคลื่อนไหวของ UI, สร้างคำบรรยาย หรือไฮไลต์คำขณะที่พูด เวลาเริ่มต้น (เป็นมิลลิวินาที) ของคำที่ระบบจดจำได้แต่ละคำคือออฟเซ็ตจากจุดเริ่มต้นของเหตุการณ์ ซึ่งก็คือการประทับเวลา 0
  • ข้อความที่ถอดเสียงจะแสดงเป็นสตรีมต่อเนื่อง ซึ่งในตอนแรกอาจเป็นข้อความบางส่วน (และอาจมีการเปลี่ยนแปลง) ก่อนที่จะกลายเป็นข้อความที่ระบบจดจำได้ในขั้นสุดท้าย

ตัวอย่างผลการแข่ง

เสียง โหมด ภาษา การถอดเสียงเป็นคำ
audio_2 ขั้นสูง es-ES "Este es un mensaje corto."
audio_1 พื้นฐาน en-US "นี่คือข้อความสั้นๆ"

การเปรียบเทียบกับ Speech Recognition API ของแพลตฟอร์ม

Speech Recognition API ของ ML Kit ครอบคลุมฟังก์ชันการทำงานพื้นฐานของ API SpeechRecognizer ของแพลตฟอร์มเมื่อใช้โหมดพื้นฐาน ข้อดีที่สำคัญของ ML Kit คือ ไม่ได้ผูกกับเวอร์ชันแพลตฟอร์มที่เฉพาะเจาะจง

นอกจากนี้ Speech Recognition API ของ ML Kit ยังรองรับการจดจำเสียงพูดโดยใช้โมเดล Gemini ในอุปกรณ์เมื่อใช้โหมดขั้นสูง ซึ่งจะช่วยให้ครอบคลุมภาษาได้มากขึ้น

เริ่มต้นใช้งาน

เพิ่ม API การจดจำเสียงพูดของ ML Kit เป็นทรัพยากร Dependency ในการกำหนดค่า build.gradle ดังนี้

implementation("com.google.mlkit:genai-speech-recognition:1.0.0-alpha1")

หากต้องการผสานรวม Speech Recognition API เข้ากับแอป ให้สร้างไคลเอ็นต์ SpeechRecognizer ตรวจสอบสถานะของฟีเจอร์โมเดลในอุปกรณ์ที่จำเป็น และดาวน์โหลดโมเดลหากยังไม่มีในอุปกรณ์ หลังจากเตรียมอินพุตเสียงใน SpeechRecognizerRequest แล้ว ให้เรียกใช้การอนุมานโดยใช้ไคลเอ็นต์เพื่อรับเอาต์พุตสตรีมมิงจาก Kotlin flow สุดท้าย อย่าลืมปิดไคลเอ็นต์เพื่อปล่อยทรัพยากร

// 1. Create a SpeechRecognizer with desired options.
val options: SpeechRecognizerOptions =
    speechRecognizerOptions {
        locale = Locale.US
        preferredMode = SpeechRecognizerOptions.Mode.MODE_ADVANCED
    }
val speechRecognizer: SpeechRecognizer = SpeechRecognition.getClient(options)

// 2. Check if the recognition model is available or needs downloading.
launch {
    val status: Int = speechRecognizer.checkStatus()
    if (status == FeatureStatus.DOWNLOADABLE) {
        // 3. If needed, download the model and monitor progress.
        speechRecognizer.download.collect { downloadStatus ->
            when (downloadStatus) {
                is DownloadStatus.DownloadCompleted -> {
                    // Model is ready, start recognition.
                    startMyRecognition(speechRecognizer)
                }
                is DownloadStatus.DownloadFailed -> {
                    // Handle download failure (e.g., inform the user).
                }
                is DownloadStatus.DownloadProgress -> {
                    // Handle download progress (e.g., update a progress bar).
                }
            }
        }
    } else if (status == FeatureStatus.AVAILABLE) {
        // Model is already ready, start recognition immediately.
        startMyRecognition(speechRecognizer)
    } else {
        // Handle other statuses (e.g., DOWNLOADING, UNAVAILABLE).
    }
}

// 4. Define your recognition logic using a suspend function.
suspend fun startMyRecognition(recognizer: SpeechRecognizer) {
    // Create a request (e.g., specifying audio source).
    val request: SpeechRecognizerRequest
        = speechRecognizerRequest { audioSource = AudioSource.fromMic() }
    // Start recognition and process the continuous stream of responses.
    recognizer.startRecognition(request).collect {
        // Process the SpeechRecognitionResponse data here.
    }
}

// 5. Stop recognition and clean up resources when the session is complete.
launch {
    recognizer.stopRecognition()
    recognizer.close()
}

ข้อกำหนดด้านอินพุตเสียง

GenAI Speech Recognition API รองรับอินพุตจากไมโครโฟนหรือแหล่งที่มาที่กำหนดเองผ่านตัวบอกไฟล์

หากคุณใช้ AudioSource.fromPfd(parcelFileDescriptor) เสียงที่ป้อนต้องเป็นไปตามข้อกำหนดที่เข้มงวดต่อไปนี้

  • รูปแบบ: PCM 16 บิตแบบข้อมูลดิบและไม่มีส่วนหัว
  • ช่องสัญญาณ: โมโน (ช่องสัญญาณเดียว)
  • อัตราการสุ่มตัวอย่าง: 16 kHz

สำหรับ Use Case ส่วนใหญ่ เราขอแนะนำให้ใช้ AudioSource.fromMic() เนื่องจากจะจัดการข้อจำกัดเหล่านี้โดยอัตโนมัติ

รูปแบบอินพุตเสียงที่รองรับ

Speech Recognition API รองรับรูปแบบอินพุตเสียงต่อไปนี้

  • ระบบจะถอดรหัสไฟล์ MP3, WAV, FLAC, M4A และ OGG โดยอัตโนมัติในอุปกรณ์
  • เสียงดิบที่ไม่มีส่วนหัว (.raw หรือ .pcm) ต้องอยู่ในรูปแบบ PCM 16 บิต, 16 kHz, โมโน

หากรูปแบบไม่ถูกต้องหรือไม่รองรับ ระบบจะแสดงผลค่า ErrorResponse เมื่อเริ่มการจดจำ

ใช้ Speech Recognition API

ต่อไปนี้เป็นวิธีใช้ Speech Recognition API เพื่อถอดเสียงและใช้การจับเวลาคำ

ถอดเสียง

Speech Recognition API รองรับอินพุตเสียงจากไมโครโฟนของอุปกรณ์ ไฟล์ที่บันทึกไว้ล่วงหน้า หรือไปป์ไลน์ที่กำหนดเองโดยใช้ออบเจ็กต์ ParcelFileDescriptor

หากต้องการเตรียมข้อมูลเสียง ให้สร้างออบเจ็กต์ AudioSource โดยใช้วิธีการสร้างวิธีใดวิธีหนึ่งที่แสดงในตารางต่อไปนี้

วิธีการ โหมดเสียง กรณีการใช้งานที่แนะนำ
AudioSource.fromMic() STREAMING บันทึกเสียงพูดสดจากผู้ใช้

ต้องมีสิทธิ์ RECORD_AUDIO
AudioSource.fromFile(file)

AudioSource.fromUri(context, uri)
ONE_SHOT ถอดเสียงไฟล์เสียงที่บันทึกไว้ล่วงหน้า ถอดรหัสรูปแบบไฟล์มาตรฐานโดยอัตโนมัติในอุปกรณ์โดยตรง
AudioSource.fromPfd(pfd, mode)

AudioSource.fromPfd(pfd, mode, audioFormat)
STREAMING หรือ ONE_SHOT ไปป์ไลน์เสียงที่กำหนดเอง (เช่น ข้อมูลเสียงที่ประมวลผลที่อื่นในแอป)

ค่าคงที่ AudioSource.Mode จะควบคุมวิธีที่ API ประมวลผลเสียงที่เข้ามา

  • ค่าคงที่ AudioSource.Mode.STREAMING จะกำหนดค่าเครื่องมือจดจำให้แสดงผลลัพธ์การถอดเสียงเป็นคำบางส่วนและผลลัพธ์สุดท้ายอย่างต่อเนื่องเมื่อได้รับข้อมูลเสียง เมื่อระบุออบเจ็กต์ ParcelFileDescriptor ที่กำหนดเอง คุณต้องเขียนข้อมูลลงในสตรีมแบบเรียลไทม์ (ประมาณ 32,000 ไบต์ต่อวินาทีสำหรับเสียง PCM แบบโมโน 16 kHz, 16 บิตมาตรฐาน) การเขียนข้อมูลเร็วเกินไปอาจทำให้บัฟเฟอร์ล้น
  • ค่าคงที่ AudioSource.Mode.ONE_SHOT จะกำหนดค่าเครื่องมือจดจำให้รอให้แหล่งที่มาของเสียงทั้งหมดโอนก่อนที่จะทำการอนุมานและส่งการถอดเสียงขั้นสุดท้าย คุณสามารถเขียนข้อมูลเสียงให้เร็วที่สุดเท่าที่จะเป็นไปได้ แต่คุณต้องปิดส่วนท้ายของการเขียนตัวบอกไฟล์เพื่อส่งสัญญาณการสิ้นสุดไฟล์ ระบบจะไม่ส่งผลลัพธ์การถอดเสียงขั้นสุดท้ายจนกว่าจะได้รับสัญญาณสิ้นสุดไฟล์นี้

ตัวอย่างต่อไปนี้จะถอดเสียงไฟล์เสียงที่บันทึกไว้ล่วงหน้า

suspend fun recognizeFromFile(recognizer: SpeechRecognizer, audioFile: File) {
    val audioSource = AudioSource.fromFile(audioFile)
    val request = speechRecognizerRequest { this.audioSource = audioSource }
    try {
        recognizer.startRecognition(request).collect { response ->
            when (response) {
                is SpeechRecognizerResponse.FinalTextResponse -> {
                    // Process the transcription of the whole file.
                }
                is SpeechRecognizerResponse.ErrorResponse -> {
                    // Handle the error, for example an unsupported audio format.
                }
                else -> {}
            }
        }
    } finally {
        audioSource.close()
    }
}

ใช้การจับเวลาคำ

คุณสามารถขอเวลาเริ่มต้นของคำที่ระบบจดจำได้แต่ละคำโดยตั้งค่าพารามิเตอร์ enableWordTiming เป็น true ในบล็อกการกำหนดค่า recognitionOptions ของคำขอ

เมื่อเปิดใช้การจับเวลาคำ ออบเจ็กต์ SpeechRecognizerResponse.FinalTextResponse แต่ละรายการจะมีพร็อพเพอร์ตี้ wordTimings ซึ่งมีรายการออบเจ็กต์ SpeechRecognizerResponse.WordTiming แต่ละออบเจ็กต์จะแสดงสตริงคำที่ระบบจดจำได้ (text) และออฟเซ็ตเป็นมิลลิวินาที (timestampMs) โดยเริ่มตั้งแต่จุดเริ่มต้นของเซสชันการจดจำคำพูด เมื่อปิดใช้การจับเวลาคำ (การตั้งค่าเริ่มต้น) ระบบจะแสดงรายการ wordTimings ที่ว่างเปล่า

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีกำหนดค่าและเปิดใช้การจับเวลาคำ

suspend fun recognizeWithWordTiming(recognizer: SpeechRecognizer) {
    val request = speechRecognizerRequest {
        audioSource = AudioSource.fromMic()
        recognitionOptions { enableWordTiming = true }
    }
    recognizer.startRecognition(request).collect { response ->
        if (response is SpeechRecognizerResponse.FinalTextResponse) {
            for (wordTiming in response.wordTimings) {
                val word: String = wordTiming.text
                val timestamp: Long = wordTiming.timestampMs
            }
        }
    }
}

ภาษาที่รองรับ

โหมด ภาษา
ขั้นสูง ar-SA (เบต้า), cmn-Hans-CN, cmn-Hant-TW, da-DK (เบต้า), de-DE, en-US, es-ES, fr-FR, hi-IN (เบต้า), id-ID (เบต้า), it-IT, ja-JP, ko-KR, nl-NL (เบต้า), pl-PL (เบต้า), pt-PT, ru-RU, sv-SE (เบต้า), th-TH, tr-TR (เบต้า), vi-VN (เบต้า)
พื้นฐาน cmn-Hans-CN (เบต้า), cmn-Hant-TW (เบต้า), de-DE (เบต้า), en-US, es-ES (เบต้า), fr-FR (เบต้า), hi-IN (เบต้า), it-IT (เบต้า), ja-JP (เบต้า), ko-KR (เบต้า), pl-PL (เบต้า), pt-BR (เบต้า), ru-RU (เบต้า), tr-TR (เบต้า), vi-VN (เบต้า)

อุปกรณ์ที่รองรับ

โหมด อุปกรณ์ที่รองรับ
พื้นฐาน อุปกรณ์ Android ที่ใช้ระดับ API 31 ขึ้นไป
ขั้นสูง

Pixel 10 และ Pixel 11 Series รวมถึงอุปกรณ์ที่มี Gemini Nano ในชิปเซ็ตต่อไปนี้ (รวมถึง Samsung Galaxy S26, Z Flip8 และ Z Fold8 Series และอื่นๆ)

  • Qualcomm Snapdragon: SM8750, SM8845, SM8850, SM8950, SM8975
  • MediaTek Dimensity: MT6991, MT6993, MT6995
  • Samsung Exynos: Exynos 2600

ปัญหาการตั้งค่าที่พบบ่อย

GenAI API ของ ML Kit อาศัยแอป Android AICore เพื่อเข้าถึง Gemini Nano เมื่อเพิ่งตั้งค่าอุปกรณ์ (รวมถึงรีเซ็ต) หรือเพิ่งรีเซ็ตแอป AICore (เช่น ล้างข้อมูล ถอนการติดตั้งแล้วติดตั้งอีกครั้ง) แอป AICore อาจมีเวลาไม่เพียงพอในการเริ่มต้นระบบให้เสร็จสมบูรณ์ (รวมถึงการดาวน์โหลดการกำหนดค่าล่าสุดจากเซิร์ฟเวอร์) ด้วยเหตุนี้ GenAI API ของ ML Kit จึงอาจไม่ทำงานตามที่คาดไว้ ข้อความแสดงข้อผิดพลาดในการตั้งค่าที่พบบ่อยซึ่งคุณอาจเห็นและวิธีจัดการมีดังนี้

ตัวอย่างข้อความแสดงข้อผิดพลาด วิธีรับมือ
AICore ไม่สำเร็จโดยมีข้อผิดพลาดประเภท 4-CONNECTION_ERROR และรหัสข้อผิดพลาด 601-BINDING_FAILURE: บริการ AICore เชื่อมโยงไม่สำเร็จ กรณีนี้อาจเกิดขึ้นเมื่อคุณติดตั้งแอปโดยใช้ GenAI API ของ ML Kit ทันทีหลังจากตั้งค่าอุปกรณ์ หรือเมื่อถอนการติดตั้ง AICore หลังจากติดตั้งแอปแล้ว การอัปเดตแอป AICore แล้วติดตั้งแอปอีกครั้งน่าจะช่วยแก้ปัญหาได้
AICore ไม่สำเร็จโดยมีข้อผิดพลาดประเภท 3-PREPARATION_ERROR และรหัสข้อผิดพลาด 606-FEATURE_NOT_FOUND: ฟีเจอร์ ... ไม่พร้อมใช้งาน กรณีนี้อาจเกิดขึ้นเมื่อ AICore ยังดาวน์โหลดการกำหนดค่าล่าสุดไม่เสร็จ เมื่ออุปกรณ์เชื่อมต่ออินเทอร์เน็ต โดยปกติแล้วจะใช้เวลาอัปเดต 2-3 นาทีถึง 2-3 ชั่วโมง การรีสตาร์ทอุปกรณ์จะช่วยให้การอัปเดตเร็วขึ้น

โปรดทราบว่าหาก Bootloader ของอุปกรณ์ปลดล็อกอยู่ คุณจะเห็นข้อผิดพลาดนี้ด้วย เนื่องจาก API นี้ไม่รองรับอุปกรณ์ที่มี Bootloader ที่ปลดล็อกแล้ว
AICore ไม่สำเร็จโดยมีประเภทข้อผิดพลาด 1-DOWNLOAD_ERROR และรหัสข้อผิดพลาด 0-UNKNOWN: ฟีเจอร์ ... ไม่สำเร็จโดยมีสถานะความล้มเหลว 0 และข้อผิดพลาด esz: UNAVAILABLE: ไม่สามารถแปลงโฮสต์ ... เชื่อมต่อเครือข่ายไว้ รอสักครู่ แล้วลองอีกครั้ง

โค้ดตัวอย่าง

  • ดูตัวอย่างโค้ด API การจดจำเสียงพูดของ ML Kit ใน GitHub