Memulai
-
Instal paket
Terminal window npm i @capgo/capacitor-speech-recognitionTerminal window pnpm add @capgo/capacitor-speech-recognitionTerminal window yarn add @capgo/capacitor-speech-recognitionTerminal window bun add @capgo/capacitor-speech-recognition -
Sinkronkan dengan proyek native
Terminal window npx cap syncTerminal window pnpm cap syncTerminal window yarn cap syncTerminal window bunx cap sync -
Konfigurasi izin platform (lihat di bawah)
Konfigurasi Platform
Section titled “Konfigurasi Platform”Tambahkan kunci berikut ke file Info.plist aplikasi Anda:
<key>NSSpeechRecognitionUsageDescription</key><string>We need access to speech recognition to transcribe your voice</string><key>NSMicrophoneUsageDescription</key><string>We need access to your microphone to record audio for transcription</string>Android
Section titled “Android”Plugin secara otomatis menambahkan izin RECORD_AUDIO yang diperlukan ke AndroidManifest.xml Anda. Tidak diperlukan konfigurasi tambahan.
Penggunaan Dasar
Section titled “Penggunaan Dasar”Cek Ketersediaan
Section titled “Cek Ketersediaan”Sebelum menggunakan pengenalan suara, periksa apakah tersedia di perangkat:
import { SpeechRecognition } from '@capgo/capacitor-speech-recognition';
const checkAvailability = async () => { const { available } = await SpeechRecognition.available(); if (!available) { console.warn('Speech recognition is not supported on this device'); return false; } return true;};Minta Izin
Section titled “Minta Izin”Minta izin yang diperlukan sebelum memulai pengenalan:
const requestPermissions = async () => { const { speechRecognition } = await SpeechRecognition.requestPermissions();
if (speechRecognition === 'granted') { console.log('Permission granted'); return true; } else { console.log('Permission denied'); return false; }};Mulai Pengenalan
Section titled “Mulai Pengenalan”Mulai mendengarkan suara dengan konfigurasi opsional:
// Basic usageawait SpeechRecognition.start({ language: 'en-US', maxResults: 3, partialResults: true,});
// With all optionsawait SpeechRecognition.start({ language: 'en-US', maxResults: 5, prompt: 'Speak now...', // Android only popup: false, // Android only partialResults: true, addPunctuation: true, // iOS 16+ only allowForSilence: 2000, // Android only, milliseconds});Dengarkan Hasil
Section titled “Dengarkan Hasil”Berlangganan hasil parsial saat pengenalan aktif:
const partialListener = await SpeechRecognition.addListener( 'partialResults', (event) => { const transcription = event.matches?.[0]; console.log('Partial result:', transcription); });
// Don't forget to remove the listener when doneawait partialListener.remove();Hentikan Pengenalan
Section titled “Hentikan Pengenalan”Hentikan mendengarkan dan bersihkan resource:
await SpeechRecognition.stop();Contoh Lengkap
Section titled “Contoh Lengkap”Berikut contoh lengkap yang menunjukkan cara menggunakan plugin:
import { SpeechRecognition } from '@capgo/capacitor-speech-recognition';
export class VoiceRecognitionService { private partialListener: any = null; private isListening = false;
async initialize(): Promise<boolean> { // Check availability const { available } = await SpeechRecognition.available(); if (!available) { throw new Error('Speech recognition not available'); }
// Request permissions const { speechRecognition } = await SpeechRecognition.requestPermissions(); if (speechRecognition !== 'granted') { throw new Error('Permission denied'); }
return true; }
async startListening( onPartialResult: (text: string) => void, onFinalResult: (text: string) => void ): Promise<void> { if (this.isListening) { console.warn('Already listening'); return; }
try { // Set up partial results listener this.partialListener = await SpeechRecognition.addListener( 'partialResults', (event) => { const text = event.matches?.[0] || ''; onPartialResult(text); } );
// Start recognition const result = await SpeechRecognition.start({ language: 'en-US', maxResults: 3, partialResults: true, addPunctuation: true, });
this.isListening = true;
// Handle final result if partialResults is false if (result.matches && result.matches.length > 0) { onFinalResult(result.matches[0]); } } catch (error) { console.error('Error starting speech recognition:', error); throw error; } }
async stopListening(): Promise<void> { if (!this.isListening) { return; }
try { await SpeechRecognition.stop();
// Clean up listener if (this.partialListener) { await this.partialListener.remove(); this.partialListener = null; }
this.isListening = false; } catch (error) { console.error('Error stopping speech recognition:', error); throw error; } }
async getSupportedLanguages(): Promise<string[]> { const { languages } = await SpeechRecognition.getSupportedLanguages(); return languages; }
async checkListeningState(): Promise<boolean> { const { listening } = await SpeechRecognition.isListening(); return listening; }}Referensi API
Section titled “Referensi API”available()
Section titled “available()”Memeriksa apakah layanan pengenalan suara native dapat digunakan di perangkat saat ini.
const result = await SpeechRecognition.available();// Returns: { available: boolean }start(options?)
Section titled “start(options?)”Mulai menangkap audio dan mentranskripsikan suara.
interface SpeechRecognitionStartOptions { language?: string; // Locale identifier (e.g., 'en-US') maxResults?: number; // Maximum number of results (default: 5) prompt?: string; // Android only: Dialog prompt popup?: boolean; // Android only: Show system dialog partialResults?: boolean; // Stream partial results addPunctuation?: boolean; // iOS 16+ only: Add punctuation allowForSilence?: number; // Android only: Silence timeout in ms}
const result = await SpeechRecognition.start(options);// Returns: { matches?: string[] }stop()
Section titled “stop()”Menghentikan mendengarkan dan membersihkan resource native.
await SpeechRecognition.stop();getSupportedLanguages()
Section titled “getSupportedLanguages()”Mendapatkan lokal yang didukung oleh recognizer yang mendasarinya.
Catatan: Perangkat Android 13+ tidak lagi mengekspos daftar ini; dalam hal itu languages akan kosong.
const result = await SpeechRecognition.getSupportedLanguages();// Returns: { languages: string[] }isListening()
Section titled “isListening()”Mengembalikan apakah plugin secara aktif mendengarkan suara.
const result = await SpeechRecognition.isListening();// Returns: { listening: boolean }checkPermissions()
Section titled “checkPermissions()”Mendapatkan status izin saat ini.
const result = await SpeechRecognition.checkPermissions();// Returns: { speechRecognition: 'prompt' | 'prompt-with-rationale' | 'granted' | 'denied' }requestPermissions()
Section titled “requestPermissions()”Meminta izin mikrofon + pengenalan suara.
const result = await SpeechRecognition.requestPermissions();// Returns: { speechRecognition: 'prompt' | 'prompt-with-rationale' | 'granted' | 'denied' }Event Listeners
Section titled “Event Listeners”partialResults
Section titled “partialResults”Dengarkan update transkripsi parsial saat partialResults diaktifkan.
const listener = await SpeechRecognition.addListener( 'partialResults', (event: { matches: string[] }) => { console.log('Partial:', event.matches?.[0]); });segmentResults (Hanya Android)
Section titled “segmentResults (Hanya Android)”Dengarkan hasil pengenalan tersegmentasi.
const listener = await SpeechRecognition.addListener( 'segmentResults', (event: { matches: string[] }) => { console.log('Segment:', event.matches?.[0]); });endOfSegmentedSession (Hanya Android)
Section titled “endOfSegmentedSession (Hanya Android)”Dengarkan event penyelesaian sesi tersegmentasi.
const listener = await SpeechRecognition.addListener( 'endOfSegmentedSession', () => { console.log('Segmented session ended'); });listeningState
Section titled “listeningState”Dengarkan perubahan ke status mendengarkan native.
const listener = await SpeechRecognition.addListener( 'listeningState', (event: { status: 'started' | 'stopped' }) => { console.log('Listening state:', event.status); });removeAllListeners()
Section titled “removeAllListeners()”Removes all registered listeners.
await SpeechRecognition.removeAllListeners();Best Practices
Section titled “Best Practices”-
Always check availability and permissions
const { available } = await SpeechRecognition.available();if (!available) return;const { speechRecognition } = await SpeechRecognition.requestPermissions();if (speechRecognition !== 'granted') return; -
Clean up listeners Always remove listeners when they’re no longer needed to prevent memory leaks:
await listener.remove();// orawait SpeechRecognition.removeAllListeners(); -
Handle errors gracefully
try {await SpeechRecognition.start({ language: 'en-US' });} catch (error) {console.error('Speech recognition failed:', error);// Show user-friendly error message} -
Provide visual feedback Use the
listeningStateevent to show users when the app is actively listening. -
Test with different accents and languages Speech recognition accuracy varies by language and accent. Test thoroughly with your target audience.
Platform Notes
Section titled “Platform Notes”- Requires iOS 10.0+
- Uses native
SFSpeechRecognizer - Supports punctuation on iOS 16+
- Requires both microphone and speech recognition permissions
- Recognition may fail if device language doesn’t match requested language
Android
Section titled “Android”- Requires Android 6.0 (API 23)+
- Uses
SpeechRecognizerAPI - Supports segmented sessions with configurable silence detection
- Android 13+ doesn’t expose list of supported languages
- Some devices may show system recognition UI
- Limited support via Web Speech API
- Not all browsers support speech recognition
- Requires HTTPS connection
- May have different behavior across browsers
Troubleshooting
Section titled “Troubleshooting”Permission Denied
Section titled “Permission Denied”If permissions are denied, guide users to app settings:
const { speechRecognition } = await SpeechRecognition.checkPermissions();if (speechRecognition === 'denied') { // Show instructions to enable permissions in Settings}No Results Returned
Section titled “No Results Returned”- Check microphone is working
- Ensure quiet environment
- Verify language code matches device capabilities
- Check network connection (some platforms require it)
Recognition Stops Unexpectedly
Section titled “Recognition Stops Unexpectedly”- Use
isListening()to check state - Listen to
listeningStateevents - Implement auto-restart logic if needed