ML Kit के GenAI Speech Recognition API की मदद से, ऑडियो कॉन्टेंट को टेक्स्ट में बदला जा सकता है. इस एपीआई में ये मोड काम करते हैं:
- बेहतर: बोली पहचानने वाला एपीआई, GenAI मॉडल का इस्तेमाल करता है. इससे ज़्यादा भाषाओं को कवर किया जा सकता है और बेहतर क्वालिटी मिलती है. आपको हर भाषा के लिए अलग से भाषा पैक डाउनलोड करने की ज़रूरत नहीं है. इससे स्टोरेज की बचत होती है.
- बेसिक: Speech Recognition API, उपयोगकर्ता के डिवाइस पर मौजूद बोली की पहचान के परंपरागत मॉडल का इस्तेमाल करता है. यह SpeechRecognizer API की तरह ही काम करता है.
Speech Recognition API, ऑडियो कॉन्टेंट को उसी भाषा में टेक्स्ट में ट्रांसक्राइब करता है. ऑडियो को किसी दूसरी भाषा में टेक्स्ट में बदलने के लिए, बातचीत का अनुवाद API का इस्तेमाल करें.
मुख्य सुविधाएं
- माइक्रोफ़ोन या ऑडियो फ़ाइल से स्ट्रीमिंग इनपुट कैप्चर करता है.
AudioSource.fromFile()याAudioSource.fromUri()तरीके का इस्तेमाल करके, पहले से रिकॉर्ड की गई पूरी फ़ाइल को ट्रांसक्राइब करता है. ज़्यादा जानकारी के लिए, ऑडियो इनपुट से जुड़ी ज़रूरी शर्तें लेख पढ़ें.- स्ट्रीमिंग इनपुट के लिए, पहचाने गए हर शब्द के शुरू होने का सटीक समय उपलब्ध कराता है. इससे आपको यूज़र इंटरफ़ेस (यूआई) ऐनिमेशन को सिंक करने, कैप्शन जनरेट करने या शब्दों को बोले जाने के दौरान हाइलाइट करने में मदद मिलती है. पहचाने गए हर शब्द के शुरू होने का समय (मिलीसेकंड में), इवेंट के शुरू होने के समय से ऑफ़सेट होता है. यह टाइमस्टैंप 0 होता है.
- ट्रांसक्राइब किया गया टेक्स्ट, लगातार स्ट्रीम के तौर पर उपलब्ध कराया जाता है. यह टेक्स्ट, शुरुआत में अधूरा हो सकता है और इसमें बदलाव भी हो सकता है. हालांकि, बाद में यह पूरा टेक्स्ट बन जाता है.
परिणामों के उदाहरण
| ऑडियो | मोड | स्थान-भाषा | बोली को लेख में बदलना |
|---|---|---|---|
| audio_2 | बेहतर | es-ES | "Este es un mensaje corto." |
| audio_1 | सामान्य | en-US | "यह एक छोटा मैसेज है" |
प्लैटफ़ॉर्म के बोली पहचानने वाले एपीआई के साथ तुलना
ML Kit Speech Recognition API, बेसिक मोड का इस्तेमाल करते समय प्लैटफ़ॉर्म SpeechRecognizer API की बुनियादी सुविधाओं को कवर करता है. ML Kit का एक मुख्य फ़ायदा यह है कि यह किसी खास प्लैटफ़ॉर्म वर्शन तक सीमित नहीं है.
इसके अलावा, ML Kit का बोली पहचानने वाला एपीआई, ऐडवांस मोड का इस्तेमाल करने पर, उपयोगकर्ता के डिवाइस पर मौजूद Gemini मॉडल का इस्तेमाल करके बोली पहचानने की सुविधा देता है. इससे ज़्यादा भाषाओं में बोली पहचानने की सुविधा मिलती है.
अपनी प्रोफ़ाइल बनाना शुरू करें
ML Kit के Speech Recognition API को अपने build.gradle कॉन्फ़िगरेशन में डिपेंडेंसी के तौर पर जोड़ें:
implementation("com.google.mlkit:genai-speech-recognition:1.0.0-alpha2")
अपने ऐप्लिकेशन में 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) का इस्तेमाल करने पर, इनपुट ऑडियो को इन ज़रूरी शर्तों को पूरा करना होगा:
- फ़ॉर्मैट: रॉ, हेडरलेस 16-बिट पीसीएम.
- चैनल: मोनो (एकल चैनल).
- सैंपल रेट: 16 किलोहर्ट्ज़.
ज़्यादातर मामलों में, AudioSource.fromMic() का इस्तेमाल करने का सुझाव दिया जाता है, क्योंकि यह इन पाबंदियों को अपने-आप मैनेज करता है.
इस्तेमाल किए जा सकने वाले ऑडियो इनपुट फ़ॉर्मैट
Speech Recognition API में, ऑडियो इनपुट के ये फ़ॉर्मैट इस्तेमाल किए जा सकते हैं:
- MP3, WAV, FLAC, M4A, और OGG फ़ाइलें, डिवाइस पर अपने-आप डिकोड हो जाती हैं.
- रॉ, हेडरलेस ऑडियो (
.rawया.pcm) 16-बिट पीसीएम, 16 किलोहर्ट्ज़, मोनो फ़ॉर्मैट में होना चाहिए.
अगर फ़ॉर्मैट अमान्य है या काम नहीं करता है, तो पहचान की प्रोसेस शुरू होने पर ErrorResponse वैल्यू दिखती है.
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 कॉन्सटैंट यह कंट्रोल करता है कि एपीआई, आने वाले ऑडियो को कैसे प्रोसेस करे:
AudioSource.Mode.STREAMINGकॉन्सटैंट, बोली पहचानने वाले सिस्टम को कॉन्फ़िगर करता है, ताकि ऑडियो डेटा मिलने पर, ट्रांसक्रिप्शन के अधूरे और पूरे नतीजे लगातार मिलते रहें. कस्टमParcelFileDescriptorऑब्जेक्ट उपलब्ध कराने पर, आपको रीयल-टाइम में स्ट्रीम में डेटा लिखना होगा. स्टैंडर्ड 16 किलोहर्ट्ज़, 16-बिट, मोनो पीसीएम ऑडियो के लिए, हर सेकंड करीब 32,000 बाइट डेटा लिखना होगा. डेटा को बहुत तेज़ी से लिखने पर, बफ़र ओवरफ़्लो हो सकता है.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()
}
}
शब्दों के टाइमस्टैंप का इस्तेमाल करना
पहचाने गए हर शब्द के शुरू होने का समय जानने के लिए, अपने अनुरोध के recognitionOptions कॉन्फ़िगरेशन ब्लॉक में, enableWordTiming पैरामीटर को true पर सेट करें.
शब्दों के समय की जानकारी देने की सुविधा चालू होने पर, हर 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 (बीटा) |
इन डिवाइस पर पासकी का इस्तेमाल किया जा सकता है
| मोड | इस सुविधा के साथ काम करने वाले डिवाइस |
| सामान्य | एपीआई लेवल 31 और इसके बाद के वर्शन का इस्तेमाल करने वाले Android डिवाइसों पर. |
| बेहतर |
Pixel 10 और Pixel 11 सीरीज़ के डिवाइस. इसके अलावा, ऐसे डिवाइस जिनमें Gemini Nano इन चिपसेट पर काम करता है (इनमें Samsung Galaxy S26, Z Flip8, और Z Fold8 सीरीज़ के डिवाइसों के साथ-साथ अन्य डिवाइस भी शामिल हैं):
|
सेटअप से जुड़ी आम समस्याएं
ML Kit GenAI एपीआई, Gemini Nano को ऐक्सेस करने के लिए Android AICore ऐप्लिकेशन का इस्तेमाल करते हैं. जब किसी डिवाइस को सेटअप या रीसेट किया जाता है या AICore ऐप्लिकेशन को रीसेट किया जाता है (जैसे, डेटा मिटाना, अनइंस्टॉल करके फिर से इंस्टॉल करना), तो हो सकता है कि AICore ऐप्लिकेशन को शुरू होने के लिए ज़रूरत के मुताबिक समय न मिले. इसमें सर्वर से नए कॉन्फ़िगरेशन डाउनलोड करना भी शामिल है. इस वजह से, हो सकता है कि ML Kit के GenAI एपीआई उम्मीद के मुताबिक काम न करें. यहां सेट अप से जुड़ी गड़बड़ियों के कुछ सामान्य मैसेज दिए गए हैं. साथ ही, उन्हें ठीक करने का तरीका भी बताया गया है:
| गड़बड़ी के मैसेज का उदाहरण | कैसे मैनेज करें |
| AICore में गड़बड़ी का टाइप 4-CONNECTION_ERROR और गड़बड़ी का कोड 601-BINDING_FAILURE मिला: AICore सेवा को बाइंड नहीं किया जा सका. | ऐसा तब हो सकता है, जब डिवाइस सेटअप करने के तुरंत बाद, ML Kit GenAI एपीआई का इस्तेमाल करके ऐप्लिकेशन इंस्टॉल किया गया हो या ऐप्लिकेशन इंस्टॉल करने के बाद, AICore को अनइंस्टॉल कर दिया गया हो. AICore ऐप्लिकेशन को अपडेट करने के बाद, अपने ऐप्लिकेशन को फिर से इंस्टॉल करें. इससे समस्या ठीक हो जाएगी. |
| AICore में गड़बड़ी हुई. गड़बड़ी का टाइप 3-PREPARATION_ERROR और गड़बड़ी का कोड 606-FEATURE_NOT_FOUND है: ... सुविधा उपलब्ध नहीं है. |
ऐसा तब हो सकता है, जब AICore ने नए कॉन्फ़िगरेशन डाउनलोड न किए हों. जब डिवाइस इंटरनेट से कनेक्ट होता है, तो आम तौर पर इसे अपडेट होने में कुछ मिनट से लेकर कुछ घंटे लगते हैं. डिवाइस को रीस्टार्ट करने से, अपडेट की प्रोसेस तेज़ हो सकती है.
ध्यान दें कि अगर डिवाइस का बूटलोडर अनलॉक है, तो आपको यह गड़बड़ी भी दिखेगी. यह एपीआई, अनलॉक किए गए बूटलोडर वाले डिवाइसों पर काम नहीं करता. |
| AICore में गड़बड़ी हुई. गड़बड़ी का टाइप 1-DOWNLOAD_ERROR और गड़बड़ी का कोड 0-UNKNOWN: सुविधा ... काम नहीं कर सकी. गड़बड़ी का स्टेटस 0 और गड़बड़ी का कोड esz: UNAVAILABLE: होस्ट ... को रिज़ॉल्व नहीं किया जा सका | इंटरनेट कनेक्शन चालू रखें, कुछ मिनट इंतज़ार करें, और फिर से कोशिश करें. |
सैंपल कोड
- GitHub पर, ML Kit के बोली पहचानने वाले एपीआई का कोड सैंपल देखें