Table of Contents
Η ενσωμάτωση της αναγνώρισης φωνής σε εφαρμογές iOS μετατρέπει τον τρόπο αλληλεπίδρασης των χρηστών, προσφέροντας hands-free έλεγχο, ταχύτερη εισαγωγή δεδομένων, και βελτιωμένη προσβασιμότητα. Το πλαίσιο ομιλίας της Apple παρέχει στιβαρές, on-device δυνατότητες ομιλίας-σε-κείμενο που σέβονται το απόρρητο του χρήστη και παρέχουν αξιόπιστη μεταγραφή σε πραγματικό χρόνο. Αυτό το άρθρο καλύπτει τα πάντα από τη βασική εγκατάσταση έως προχωρημένα πρότυπα υλοποίησης, συμπεριλαμβανομένης της βελτιστοποίησης απόδοσης, της πολυγλωσσικής υποστήριξης και του χειρισμού σφαλμάτων βέλτιστων πρακτικών.
Κατανόηση της Αρχιτεκτονικής Πλαισίου Λόγου
Το πλαίσιο ομιλίας (που εισήχθη στο iOS 10) λειτουργεί μέσω τριών βασικών συστατικών:
- SFSpeechRecognizer[[LFT:1]] ⁇ Η κύρια διεπαφή που συντονίζει την αναγνώριση για μια συγκεκριμένη γλώσσα και τοπική. Μπορεί να ρυθμιστεί ώστε να χρησιμοποιεί την αναγνώριση on-device ή server-based.
- SFSpeechRecognationRequest ⁇ Εκπροσωπεί την εισαγωγή ήχου. Δύο κύριες υποκλάσεις: για προηχογραφημένα αρχεία ήχου και για live audio streams.
- SFSpeechRecognitionTask ⁇ Διαχειρίζεται τη διαδικασία αναγνώρισης, παρέχοντας ενημερώσεις προόδου και τελικά αποτελέσματα.
Το πλαίσιο επεξεργάζεται τον ήχο μέσω ενός αυτόματου αναγνωριστικού ομιλίας (ASR) κινητήρα. Εξ ορισμού, το iOS 15+ χρησιμοποιεί την αναγνώριση on-device για όλες τις υποστηριζόμενες γλώσσες, η οποία μειώνει τη λανθάνουσα συχνότητα και εξασφαλίζει ότι τα δεδομένα δεν εγκαταλείπουν ποτέ τη συσκευή.
Βασικά χαρακτηριστικά και δυνατότητες
- ⁇ άλ-time streaming ⁇ Η φωνή μεταγράφεται καθώς ο χρήστης μιλάει, με περιοδικά μερικά αποτελέσματα.
- Αλληλές μεταγραφές ⁇ Κάθε αποτέλεσμα περιλαμβάνει πολλαπλές ερμηνείες με βαθμολογία εμπιστοσύνης μέσω και .
- Συνεχείς φράσεις ⁇ Οι προγραμματιστές μπορούν να παρέχουν προσαρμοσμένες φράσεις μέσω για τη βελτίωση της ακρίβειας για συγκεκριμένους όρους.
- Υποστηριγμένες γλώσσες ⁇ Πάνω από 60 γλώσσες και περιφερειακές προφορές. Χρησιμοποιήστε για να ανακτήσετε την τρέχουσα λίστα.
⁇ αδειών και ρυθμίσεων έργου
Πάντα η άδεια για την οποία ζητείται ρητά. Χωρίς τις κατάλληλες άδειες, το σύστημα θα απορρίψει τις αιτήσεις αναγνώρισης. Ακολουθήστε τα παρακάτω βήματα:
Απαιτήσεις καταλόγου πληροφοριών
Προσθέστε το κλειδί [[LPT:6]] (Προσωπικό ⁇ Αναγνώριση Λόγου Περιγραφή Χρήσης) με μια σαφή, με βάση το χρήστη εξήγηση. Παράδειγμα:
<key>NSSpeechRecognitionUsageDescription</key>
<string>This app uses speech recognition to transcribe your voice commands for hands-free navigation.</string>
Εάν η εφαρμογή σας καταγράφει επίσης ήχο (κοινό για ζωντανή αναγνώριση), προσθέστε επίσης.
Αίτηση εξουσιοδότησης
Καλέστε νωρίς στον κύκλο ζωής της εφαρμογής, συνήθως σε μια οθόνη ελέγχου . Η κλήση επιστρέφει μία από τις τέσσερις καταστάσεις:
import Speech
SFSpeechRecognizer.requestAuthorization { authStatus in
DispatchQueue.main.async {
switch authStatus {
case .authorized:
// Enable microphone and recognition UI
case .denied, .restricted:
// Show error and disable features
print("Speech recognition not available")
case .notDetermined:
// Handle if the user hasn't seen the dialog (rare)
@unknown default:
break
}
}
}
Σημείωση: Το πλαίσιο μπορεί να επιστρέψει εάν η συσκευή διαχειρίζεται από προφίλ γονικού ελέγχου ή αν η αναγνώριση ομιλίας απενεργοποιείται μέσω του Screen Time.
Εφαρμογή Αναγνώρισης Ζωντανού Λόγου
Για τη σύλληψη φωνής σε πραγματικό χρόνο, χρειάζεστε ένα [[LFT:13]] για να μεταφέρετε ρυθμιστές ήχου στο αίτημα αναγνώρισης. Ο παρακάτω κώδικας δείχνει μια έτοιμη για παραγωγή εφαρμογή με κατάλληλο καθαρισμό.
Βήμα 1: ⁇ συνεδρίας ήχου
let audioEngine = AVAudioEngine()
let request = SFSpeechAudioBufferRecognitionRequest()
var recognitionTask: SFSpeechRecognitionTask?
func configureAudioSession() {
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(.record, mode: .measurement, options: .duckOthers)
try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
} catch {
print("Audio session config failed: \(error.localizedDescription)")
}
}
Η επιλογή μειώνει τον ήχο του φόντου, ο οποίος βελτιώνει την ακρίβεια μεταγραφής σε θορυβώδη περιβάλλοντα. Για εφαρμογές φωνής ⁇ μόνο, σκεφτείτε να δρομολογήσετε τον ήχο μέσω του ηχείου της συσκευής αντί του ακουστικού.
Βήμα 2: Δημιουργήστε τον Αναγνωριστή και Αιτηθείτε
func startRecognition() {
guard let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "en-US")),
recognizer.isAvailable else {
handleError("Recognizer unavailable or not supported")
return
}
configureAudioSession()
request.shouldReportPartialResults = true
let inputNode = audioEngine.inputNode
let recordingFormat = inputNode.outputFormat(forBus: 0)
recognitionTask = recognizer.recognitionTask(with: request) { result, error in
if let result = result {
let transcribedText = result.bestTranscription.formattedString
// Update UI or process command
print("Partial: \(transcribedText)")
if result.isFinal {
self.stopRecognition()
// Handle final transcription
}
}
if let error = error {
self.stopRecognition()
self.handleError(error.localizedDescription)
}
}
inputNode.installTap(onBus: 0, bufferSize: 1024,
format: recordingFormat) { buffer, _ in
self.request.append(buffer)
}
audioEngine.prepare()
do {
try audioEngine.start()
} catch {
handleError("Audio engine start failed: \(error.localizedDescription)")
}
}
Βήμα 3: Καθαρίστε με Χάρη
func stopRecognition() {
recognitionTask?.cancel()
audioEngine.stop()
audioEngine.inputNode.removeTap(onBus: 0)
request.endAudio()
// Optionally deactivate audio session
try? AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
}
Πάντα να ακυρώνεται η εργασία αναγνώρισης πριν από τη διακοπή της μηχανής ήχου. Η λησμονώντας να αφαιρέσετε τη βρύση στον κόμβο εισόδου μπορεί να προκαλέσει κύκλους διατήρησης και να αποτρέψει την κυκλοφορία του μικροφώνου.
Χειρισμός πολύγλωσσων και προσαρμοσμένων τοπικών
Το πλαίσιο ομιλίας υποστηρίζει δυναμική ανίχνευση τοπικών περιοχών. Μπορείτε να επιτρέψετε στους χρήστες να αλλάξουν γλώσσες ή ακόμη και να αναγνωρίσουν πολλαπλές γλώσσες σε μια μόνο συνεδρία δημιουργώντας ξεχωριστές περιπτώσεις.
let locales = ["en-US", "fr-FR", "zh-CN"]
let recognizers = locales.compactMap { SFSpeechRecognizer(locale: Locale(identifier: $0)) }
// Use recognizers[0] for English, etc.
Για on-device αναγνώριση, κάθε αναγνωριστής καταναλώνει μνήμη ανάλογη με το γλωσσικό μοντέλο του.
Προσαρμοσμένοι όροι λεξιλογίου και τομέα
Βελτίωση της ακρίβειας για τους ειδικούς όρους της βιομηχανίας με χρήση της [[LFT:21]] ιδιοκτησίας [[LFT:22]]:
request.contextualStrings = ["Directus", "CMS", "headless", "REST API"]
Αυτό υπονοεί ότι ο αναγνωρίστης θα ευνοήσει αυτές τις φράσεις, μειώνοντας την εσφαλμένη αναγνώριση των ασυνήθιστων όρων.
Σφάλμα χειρισμού και υποχώρησης στρατηγικών
Η αναγνώριση φωνής μπορεί να αποτύχει για πολλούς λόγους: ζητήματα δικτύου (αν χρησιμοποιείτε server ⁇ based), διακοπές ήχου, μικρόφωνο απενεργοποιημένο, ή πίεση μνήμης.
enum RecognitionError: LocalizedError {
case noPermission
case unavailable
case audioSessionFailure
case internalError(Error)
var errorDescription: String? {
switch self {
case .noPermission:
return "Speech recognition permission denied"
case .unavailable:
return "Recognizer is busy or not available"
case .audioSessionFailure:
return "Could not start audio capture"
case .internalError(let error):
return error.localizedDescription
}
}
}
func handleError(_ message: String) {
// Show alert, retry button, or fallback to text input
DispatchQueue.main.async {
// Show toast or log
}
}
Παρακολούθηση αλλαγών κατάστασης εργασιών αναγνώρισης μέσω [[LFT:25]] ιδιότητας [[LFT:26]] για τον εντοπισμό ακυρώσεων ή χρονικών διαλείμματος.
Βελτιστοποίηση της Απόδοσης και Βέλτιστες Πρακτικές
- Προτιμήστε την αναγνώριση ⁇ συσκευής ⁇ Από το iOS 15, η αναγνώριση on ⁇ συσκευής είναι η προεπιλεγμένη και προσφέρει χαμηλότερη λανθάνουσα συχνότητα. Αποφύγετε την εξαναγκαστική χρήση server ⁇ με βάση εκτός αν χρειάζεστε μια γλώσσα που δεν υποστηρίζεται ακόμα εκτός σύνδεσης. Ελέγξτε [[LFT:27]] για να επαληθεύσετε τη διαθεσιμότητα.
- Όριο μερικών αποτελεσμάτων ⁇ ⁇ μειώνει τα γενικά έξοδα, αν χρειάζεστε μόνο τελική μεταγραφή.
- Εγχειρίδιο αναγνώρισης διάρκεια ζωής[[LFT:1]] ⁇ Ακύρωση μακροχρόνιων εργασιών όταν ο χρήστης σταματήσει να μιλάει. Χρησιμοποιήστε ένα τάιμ άουτ (π.χ., 2 δευτερόλεπτα σιωπής) για να τερματίσετε αυτόματα τη συνεδρία.
- Battery and memory ⁇ Οι εργασίες ακουστικής μηχανής και αναγνώρισης καταναλώνουν σημαντικούς πόρους.
- Δοκιμάζοντας με εικονικά δεδομένα[ ⁇ Χρησιμοποιήστε προ-ηχογραφημένα αρχεία ήχου () κατά την ανάπτυξη για να αποφύγετε εξαρτήσεις μικροφώνου.
Χειρισμός Διακοπών
Τηλεφωνικές κλήσεις, ειδοποιήσεις ή το Siri μπορεί να διακόψει μια ενεργή συνεδρία αναγνώρισης. Εγγραφείτε στο [[LFT:30]] για να σταματήσετε και να συνεχίσετε με χάρη:
NotificationCenter.default.addObserver(
self,
selector: #selector(handleInterruption),
name: AVAudioSession.interruptionNotification,
object: nil
)
@objc func handleInterruption(_ notification: Notification) {
guard let userInfo = notification.userInfo,
let type = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt else { return }
if type == AVAudioSession.InterruptionType.began.rawValue {
stopRecognition()
} else if type == AVAudioSession.InterruptionType.ended.rawValue {
// Optionally restart recognition
}
}
Εξετάσεις Προσβασιμότητας
Η αναγνώριση φωνής ενισχύει την προσβασιμότητα των χρηστών με κινητικές ή οπτικές βλάβες.
- Παρέχει σαφή ηχητική ανατροφοδότηση όταν η ακρόαση ξεκινά / σταματά.
- Υποστηρίζει VoiceOver χρησιμοποιώντας ετικέτες προσβασιμότητας στα κουμπιά αναγνώρισης.
- Προσφέρει μια εναλλακτική μέθοδο εισαγωγής κειμένου ⁇ βασισμένη σε περίπτωση που αποτύχει η αναγνώριση.
- Σεβάζεται την ιδιωτικότητα του χρήστη με το να μην αποθηκεύει δεδομένα ήχου χωρίς ρητή συγκατάθεση.
Δοκιμή και αποσφαλμάτωση
Οι προσομοιωτές δεν περιλαμβάνουν μικρόφωνο, δοκιμή σε φυσικές συσκευές. Χρησιμοποιήστε [[LFT:0]]] το διαγνωστικό ημερολόγιο αναγνώρισης ομιλίας του Xcode[[LPT:1]] στο [[LFT:32]] και προσθέστε [[LFT:33]] με την τιμή [[LFT:34]] για να ενεργοποιήσετε την καταγραφή της ⁇ μπελόζης. Προσομοιώστε διαφορετικά περιβάλλοντα θορύβου και τονισμούς κατά τη διάρκεια QA.
Πραγματικές υποθέσεις χρήσης World
- Φωνητικές εντολές σε μια εφαρμογή CMS[ ⁇ Επιτρέπει στους συντάκτες να υπαγορεύουν περιεχόμενο ή να περιηγούνται στα μενού hands ⁇ free. Για παράδειγμα, το “Δημιουργήστε ένα νέο άρθρο” ενεργοποιεί μια συγκεκριμένη ροή εργασίας.
- Δικτατορία για σημειώσεις ⁇ λήψη εφαρμογών ⁇ Μεταγραφή πραγματικού χρόνου με αναγνώριση στίξης.
- Προσιτότητα ⁇ εστιασμένη πλοήγηση ⁇ Οι χρήστες μπορούν να πουν “Πηγαίνετε πίσω” ή “Ανοίγει τις ρυθμίσεις” χωρίς να αγγίζετε την οθόνη.
- Ιατρική ή νόμιμη μεταγραφή ⁇ Χρήση συμβολοσειρών πλαισίου για την ορολογία τομέα ⁇ ειδική ορολογία και συνδυασμό με την αναγνώριση on ⁇ συσκευή για την προστασία της ιδιωτικής ζωής.
Συμπέρασμα
Το πλαίσιο ομιλίας της Apple παρέχει μια σταθερή βάση για την προσθήκη αναγνώρισης φωνής σε εφαρμογές iOS. Κατανοώντας την αρχιτεκτονική, χειριζόμενος άδειες σωστά, διαχειριζόμενος ηχητικά συνεδρίες και βελτιστοποιώντας την απόδοση, μπορείτε να δημιουργήσετε μια απρόσκοπτη φωνητική ⁇ ελεγχόμενη εμπειρία που σέβεται την ιδιωτικότητα του χρήστη. Πάντα να δοκιμάζετε σε πραγματικές συσκευές, να εξετάζετε μηχανισμούς επιστροφής, και να έχετε υπόψη το πλαίσιο του χρήστη για να παράσχετε ένα χαρακτηριστικό που πραγματικά ενισχύει τη χρηστικότητα.
Για περαιτέρω ανάγνωση, ανατρέξτε στον φάκελο πλαισίου της Apple , στον Αυθεντικό οδηγό ] και στον SFSpeechRecognizer class reference]. Πρόσθετες βέλτιστες πρακτικές για την προσβασιμότητα μπορούν να βρεθούν στον δικτυακό τόπο πρόσβασης της Apple[].