ב-GenAI Speech Recognition API של ML Kit, אתם יכולים לתמלל תוכן אודיו לטקסט. ה-API הזה תומך במצבים הבאים:
- מתקדם: ה-API לזיהוי דיבור משתמש במודל GenAI, שמספק כיסוי שפה רחב יותר ואיכות כוללת טובה יותר. אתם לא צריכים להוריד חבילת שפה נפרדת לכל שפה, וכך אתם חוסכים מקום באחסון.
- בסיסי: ה-Speech Recognition API משתמש במודל המסורתי של זיהוי דיבור במכשיר, בדומה ל-SpeechRecognizer API.
Speech Recognition API מתמלל תוכן אודיו לטקסט באותה שפה. כדי לתמלל אודיו לטקסט בשפה אחרת, משתמשים ב-Speech Translation API.
יכולות עיקריות
- קולט קלט בסטרימינג מהמיקרופון או מקובץ אודיו.
- תמלול של קובץ שלם שהוקלט מראש באמצעות השיטות
AudioSource.fromFile()אוAudioSource.fromUri(). פרטים נוספים זמינים במאמר דרישות לקלט אודיו. - בקלט של סטרימינג, מספק את שעת ההתחלה המדויקת של כל מילה שזוהתה, כדי לעזור לכם לסנכרן אנימציות בממשק המשתמש, ליצור כתוביות או להדגיש מילים כשהן נאמרות. שעת ההתחלה (באלפיות השנייה) של כל מילה שזוהתה היא היסט מתחילת האירוע, שחותמת הזמן שלו היא 0.
- הטקסט המתומלל מסופק כזרם רציף, שעשוי להיות חלקי בהתחלה (וכפוף לשינויים) לפני שהוא הופך לטקסט המזוהה הסופי.
תוצאות לדוגמה
| אודיו | מצב | לוקאל | תמליל |
|---|---|---|---|
| audio_2 | הגדרות מתקדמות | es-ES | "Este es un mensaje corto." |
| audio_1 | בסיסי | en-US | "זו הודעה קצרה" |
השוואה ל-Speech Recognition API של הפלטפורמה
API זיהוי הדיבור של ML Kit כולל את הפונקציונליות הבסיסית של SpeechRecognizer API של הפלטפורמה כשמשתמשים במצב Basic. יתרון מרכזי של ML Kit הוא שהיא לא קשורה לגרסת פלטפורמה ספציפית.
בנוסף, כשמשתמשים במצב המתקדם, ה-API לזיהוי דיבור של ML Kit תומך בזיהוי דיבור באמצעות מודל Gemini במכשיר, ומספק כיסוי שפה מורחב.
שנתחיל?
מוסיפים את ה-API לזיהוי דיבור של ML Kit כתלות בהגדרות של build.gradle:
implementation("com.google.mlkit:genai-speech-recognition:1.0.0-alpha1")
כדי לשלב את Speech Recognition API באפליקציה, צריך ליצור לקוח SpeechRecognizer. בודקים את הסטטוס של התכונות הנדרשות במודל במכשיר, ומורידים את המודל אם הוא עדיין לא במכשיר. אחרי שמכינים את קלט האודיו ב-SpeechRecognizerRequest, מריצים את ההסקה באמצעות הלקוח כדי לקבל פלט סטרימינג מתהליך Kotlin. לסיום, אל תשכחו לסגור את הלקוח כדי לשחרר משאבים.
// 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 ביט, ללא כותרת.
- ערוצים: מונו (ערוץ יחיד).
- תדירות הדגימה: 16kHz.
ברוב תרחישי השימוש, מומלץ להשתמש ב-AudioSource.fromMic() כי הוא מטפל במגבלות האלה באופן אוטומטי.
פורמטים נתמכים של קלט אודיו
Speech Recognition API תומך בפורמטים הבאים של קלט אודיו:
- קבצים בפורמטים MP3, WAV, FLAC, M4A ו-OGG מפוענחים באופן אוטומטי במכשיר.
- אודיו גולמי ללא כותרת (
.rawאו.pcm) חייב להיות בפורמט PCM של 16 ביט, 16kHz, מונו.
אם הפורמט לא תקין או לא נתמך, מוחזר הערך 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 מונו סטנדרטי של 16kHz ו-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, ומכשירים עם Gemini Nano בערכות השבבים הבאות (כולל, בין היתר, מכשירים מסדרת Samsung Galaxy S26, Z Flip8 ו-Z Fold8):
|
בעיות נפוצות בהגדרה
ממשקי ה-API של ML Kit GenAI מסתמכים על אפליקציית Android AICore כדי לגשת ל-Gemini Nano. כשמגדירים מכשיר חדש (כולל איפוס) או מאפסים את אפליקציית AICore (למשל, מנקים את הנתונים, מסירים את האפליקציה ומתקינים אותה מחדש), יכול להיות שלאפליקציית AICore לא יהיה מספיק זמן לסיים את תהליך ההפעלה (כולל הורדת ההגדרות העדכניות מהשרת). כתוצאה מכך, יכול להיות שממשקי ה-API של ML Kit GenAI לא יפעלו כמו שצריך. ריכזנו כאן את הודעות השגיאה הנפוצות שמופיעות במהלך ההגדרה, והסברנו איך לטפל בהן:
| הודעת שגיאה לדוגמה | איך לטפל בבעיה |
| AICore נכשל עם סוג השגיאה 4-CONNECTION_ERROR וקוד השגיאה 601-BINDING_FAILURE: שירות AICore נכשל בקישור. | זה יכול לקרות כשמתקינים את האפליקציה באמצעות ממשקי ה-API של ML Kit GenAI מיד אחרי הגדרת המכשיר, או כשמסירים את AICore אחרי שהאפליקציה מותקנת. כדי לפתור את הבעיה, צריך לעדכן את אפליקציית AICore ואז להתקין מחדש את האפליקציה. |
| AICore נכשל עם סוג השגיאה 3-PREPARATION_ERROR וקוד השגיאה 606-FEATURE_NOT_FOUND: התכונה ... לא זמינה. |
זה יכול לקרות אם AICore לא סיים להוריד את ההגדרות העדכניות. כשהמכשיר מחובר לאינטרנט, בדרך כלל לוקח כמה דקות עד כמה שעות לעדכן אותו. הפעלה מחדש של המכשיר יכולה לזרז את העדכון.
חשוב לדעת שאם תוכנת האתחול של המכשיר לא נעולה, גם תופיע השגיאה הזו – ה-API הזה לא תומך במכשירים עם תוכנות אתחול לא נעולות. |
| AICore נכשל עם סוג השגיאה 1-DOWNLOAD_ERROR וקוד השגיאה 0-UNKNOWN: התכונה ... נכשלה עם סטטוס הכישלון 0 והשגיאה esz: UNAVAILABLE: לא ניתן לפתור את המארח ... | צריך להמתין כמה דקות כשהמכשיר מחובר לרשת ואז לנסות שוב. |