ML Kit के जेन एआई स्पीच रिकग्निशन एपीआई की मदद से, ऑडियो कॉन्टेंट को टेक्स्ट में बदला जा सकता है. यह एपीआई इन मोड के साथ काम करता है:
- बेहतर: बोली को पहचानने वाला एपीआई, 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 | "यह एक छोटा मैसेज है" |
प्लैटफ़ॉर्म के बोली पहचानने वाले एपीआई के साथ तुलना
ML Kit Speech Recognition API, बेसिक मोड का इस्तेमाल करते समय प्लैटफ़ॉर्म के SpeechRecognizer API के बुनियादी फ़ंक्शन को कवर करता है. ML Kit का एक मुख्य फ़ायदा यह है कि
यह किसी खास प्लैटफ़ॉर्म वर्शन से बंधा नहीं है.
इसके अलावा, ML Kit का बोली पहचानने वाला एपीआई, ऐडवांस मोड का इस्तेमाल करने पर, उपयोगकर्ता के डिवाइस पर मौजूद Gemini मॉडल का इस्तेमाल करके बोली पहचानने की सुविधा देता है. इससे ज़्यादा भाषाओं में बोली पहचानने की सुविधा मिलती है.
अपनी प्रोफ़ाइल बनाना शुरू करें
अपने build.gradle कॉन्फ़िगरेशन में, ML Kit के Speech Recognition API को डिपेंडेंसी के तौर पर जोड़ें:
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()
}
ऑडियो इनपुट से जुड़ी ज़रूरी शर्तें
जेन एआई स्पीच रिकग्निशन एपीआई, माइक्रोफ़ोन या फ़ाइल डिस्क्रिप्टर के ज़रिए किसी कस्टम सोर्स से इनपुट लेता है.
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 के जेन एआई एपीआई उम्मीद के मुताबिक काम न करें. यहां सेट अप से जुड़ी गड़बड़ियों के कुछ सामान्य मैसेज दिए गए हैं. साथ ही, उन्हें ठीक करने का तरीका भी बताया गया है:
| गड़बड़ी के मैसेज का उदाहरण | समस्या को कैसे हल करें |
| 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 के Speech Recognition API का कोड सैंपल देखें