הכרה קולית באפליקציות iOS הופכת את האופן שבו משתמשים מתקשרים, מציעים שליטה ללא ידיים, כניסה מהירה יותר של נתונים, ושיפור נגישות.מסגרת הדיבור של אפל מספקת יכולות דיבור חזקות, על-ידי קידוד דיבור המכבדות את פרטיות המשתמשים ולספק תזמון בזמן אמת אמין. מאמר זה מכסה הכל מהגדרה בסיסית ועד לתבניות יישום מתקדמות, כולל ביצועים, תמיכה רב-לשונית, וטיפול בשיטות הטובות ביותר.

הבנת ארכיטקטורת המסגרת

מסגרת הדיבור (התקבלה ב-iOS 10) פועלת באמצעות שלושה מרכיבים עיקריים:

  • (FLT:0)SFSpeechRecognizerFreaLT:1) - הממשק העיקרי שמאמת את ההכרה בשפה מסוימת ובמקומית. ניתן להגדיר אותו לשימוש ב-device או בזיהוי מבוסס השרת.
  • (ב) [17] , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • (FLT:0)SFSpeechRecognitionTaskveofLT:1) - מנהל את תהליך ההכרה, מתן עדכונים מתקדמים ותוצאות סופיות.

תהליכי המסגרת אודיו באמצעות מנוע זיהוי דיבור אוטומטי (ASR) כברירת מחדל, iOS 15+ משתמש בזיהוי על הניתוק עבור כל השפות הנתמכות, אשר מפחיתה את הגמישות ומבטיחה שהנתונים לעולם לא יעזבו את המכשיר.

תכונות מפתח ו Capabilities

  • (ב) ,0) סטרימינג בזמן אמת (Real-TimeסטרימינגFLT:1) - קול מתואר כמשתמש מדבר, עם תוצאות חלקית תקופתיות.
  • (ב) כל תוצאה כוללת מספר פרשות עם נבואות של כפל (ב"ב) ו[[1924]]
  • (ב) ,0) ביטויים קונטקסטואליים (FLT:1) - מפתחים יכולים לספק ביטויים מותאמים אישית באמצעות ההרחבה (FLT:4) לשיפור הדיוק של תנאים ספציפיים לתחום.
  • (ב) ,0) שפות מפורטות (ב) 1 - מעל 60 שפות ומדגישים אזוריים.

קביעת הרשאות ופרויקט Configuration

(ב) ,0) לבקש אישור מפורשות (ב) 1:1 ללא אישורים נאותים, המערכת תדחה בקשות הכרה.

דרישות מידע.plist

הוסף את המפתח (FLT:6) (פרטיות - דיבור הכרה תיאור גיל) עם הסבר ברור, הפונה למשתמש.

<key>NSSpeechRecognitionUsageDescription</key>
<string>This app uses speech recognition to transcribe your voice commands for hands-free navigation.</string>

אם האפליקציה שלך גם מתעדת את אודיו (הופנה מהדף הכרה חיה), הוסף גם את ה-FLT:8.

מבקש אישור

קרא ל-FLT:9 מוקדם במחזור חיי היישום, בדרך כלל על השקפה של בקר (FLT:10), ה-Callback מחזיר אחד מארבעת הסטטוסים:

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
 }
 }
}

הערה: המסגרת עשויה להחזיר ל-FLT:12 אם המכשיר מנוהל על ידי פרופיל בקרת הורים או אם זיהוי דיבור הוא מוגבל באמצעות זמן מסך.

המונחים: Live Speech Recognition

עבור לכידת קול בזמן אמת, אתה צריך קונסולת: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)")
 }
}

האפשרות של LT:15 מורידה נפח מוזיקת רקע, אשר משפר את דיוק הסקירת בסביבות רועשות. עבור יישומים קול בלבד, לשקול FLT:16 כדי לנתב אודיו באמצעות דובר המכשיר במקום האוזן.

שלב 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)
}

תמיד לבטל את משימת ההכרה לפני עצירת מנוע השמע.שכחה להסיר את הברז על צומת קלט יכול לגרום לשמור מחזורים ולמנוע את המיקרופון משוחרר.

יד ביד מול המקומיים וה Custom Locals

מסגרת הדיבור תומכת בזיהוי מקומי דינמי, באפשרותך לאפשר למשתמשים לעבור שפות או אפילו לזהות שפות מרובות בפגישה אחת על ידי יצירת דוגמאות נפרדות של FLT:19.

let locales = ["en-US", "fr-FR", "zh-CN"]
let recognizers = locales.compactMap { SFSpeechRecognizer(locale: Locale(identifier: $0)) }

// Use recognizers[0] for English, etc.

עבור הכרה על-ידי ה-device, כל מזהה צורב את הזיכרון ביחס למודל השפה שלו.מבחן ביצועים על מכשירים ישנים יותר כאשר תומך במספר שפות.

תנאי VOCLL AND MOLM

שיפור הדיוק של התנאים הספציפיים לתעשייה באמצעות הנכס ב-FLT:21:

request.contextualStrings = ["Directus", "CMS", "headless", "REST API"]

זה מרמז על ההכרה לטובת ביטויים אלה, צמצום ההכרה הלא נכונה של מונחים נדירים.

טעויות אסטרטגיות ו Fallback

זיהוי קולי יכול להיכשל מסיבות רבות: בעיות ברשת (אם משתמשים מבוסס שרת), הפרעות אודיו, מיקרופון נכה או לחץ זיכרון.

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
 }
}

שינוי במצב המשימה של קונסולת 25 (FLT:25) ברכישת נכסים של FLT:26 כדי לזהות ביטולים או זמנם.

אופטימיזציה ביצועים ופרקטיקה הטובה ביותר

  • (הופנה מהדף deviceהכרה:0) , שכן iOS 15, על זיהוי הדלפק הוא ברירת המחדל ומציע שקיפות נמוכה יותר.הימנעות מלכפות על בסיס השרת, אלא אם כן אתה צריך שפה עדיין לא נתמך באופן לא מקוון.
  • (ב) ,0) תוצאות חלקית של הוראת סעיף 1 (הדגשה על ידי הוראת סעיף 7) - הפחתה של ה-FLT:28 אם רק צריך את הסידור הסופי.
  • (FLT:0) הכרה בחיים אורך החיים של LT:1 - ביטול משימות ארוכות טווח כאשר המשתמש מפסיק לדבר. השתמש בזמן (למשל, 2 שניות של שתיקה) כדי לסיים את הפגישה באופן אוטומטי.
  • (ב) ,0)חומרי זיכרון וזיכרון (צילום: 1) - מנוע אודיו ומשימות הכרה צורכים משאבים משמעותיים.
  • (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

המונחים:

שיחות טלפון, אזעקה או Siri יכולים להפריע לפגישת הכרה פעילה.

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 באמצעות תוויות נגישות על כפתורים הכרה.
  • מציע שיטת קלט מבוססת טקסט חלופית במקרה נכשלת.
  • מכבד את הפרטיות של המשתמש על ידי לא אחסון נתוני אודיו ללא הסכמה מפורשת.

בדיקות ווויכוח

הסימולציות אינן כוללות מיקרופון; בדיקת מכשירים פיזיים. השתמש ב-FLT:0 (הנאום של אקסקוד) קידוד זיהוי לוג'רטוט 1FLT:1 תחת FLT:32 ולהוסיף FLT:33 עם הערך (FLT 34) כדי לאפשר למילוי של סביבות רעש שונות ומבטאים במהלך QA.

מקרים אמיתיים לשימוש

  • (FLT:0) פקודות באפליקציית CMSFLT:1 - מאפשרות לעורךים להכתיב תוכן או לנווט תפריטים ללא ידיים.
  • (ב) ,0) ,הקדשה לאפליקציות של קידוד 1 (בתרגום חופשי: ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ).
  • (FLT:0) ניווט ממוקד גישה (FLT): משתמשים יכולים לומר "לך אחורה" או "הגדרות פתוחות" מבלי לגעת במסך.
  • (FLT:0Medical או משפטי תמליל 1FLT) - השתמש בחוזים קונטקסטואליים עבור המינוח הספציפי של התחום ומשלב עם הכרה על-ידי הפרט.

מסקנה

מסגרת הדיבור של אפל מספקת בסיס מוצק להוספת הכרה קולית לאפליקציות iOS.על ידי הבנת האדריכלות, ניהול הרשאות כראוי, ניהול הפעלות אודיו וקידוד לביצועים, אתה יכול ליצור חוויה מבוקרת קול חלקה המכבדת את הפרטיות של המשתמש תמיד במבחן על מכשירים אמיתיים, לשקול מנגנוני נפילה, ולשמור על ההקשר של המשתמש בראש כדי לספק תכונה שבאמת משפרת את יכולת השימוש.

(ב) ב[[1924]], [[1924]]]], [[1924]]]]]], [[1924]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]], [[1924]]]]]]]], [[1924]]]]]]]], [[1924]]]]]]]]