SFSpeechRecognizer คือ API หลักของ Apple สำหรับการรู้จำเสียงในระบบนิเวศ iOS เฟรมเวิร์กให้การเข้าถึงเอ็นจิน ASR ของอุปกรณ์ผ่าน Speech.framework รองรับการถอดความแบบสตรีมมิ่งแบบเรียลไทม์และการรู้จำไฟล์เสียงแบบครั้งเดียว SFSpeechRecognizer พร้อมใช้งานบน iOS 10+, macOS 10.15+, watchOS 6+ และ tvOS 17+ ด้วย iOS 17 Apple ได้เพิ่มโหมดบนอุปกรณ์แบบเต็มรูปแบบที่ช่วยให้รู้จำเสียงได้โดยไม่ต้องเชื่อมต่ออินเทอร์เน็ต ตาม Apple Speech Documentation, 2025 มีการใช้ SFSpeechRecognizer ในแอปพลิเคชัน App Store กว่า 200,000 รายการและประมวลผลคำขอหลายล้านรายการต่อวันด้วย WER 7% ในภาษาอังกฤษ
ประเด็นสำคัญ
SFSpeechRecognizer คือคลาสจาก Speech.framework ที่แสดงถึงตัวรู้จำเสียงสำหรับภาษาเฉพาะ มันถูกเริ่มต้นด้วย Locale (ru_RU, en_US, zh_CN) SFSpeechRecognizer จัดการคำขอรู้จำ (SFSpeechRecognitionRequest) และส่งคืนผลลัพธ์ (SFSpeechRecognitionResult) พร้อมการถอดความและเมตาดาต้า รองรับคำขอสองประเภท: SFSpeechAudioBufferRecognitionRequest (สตรีมเสียงสด) และ SFSpeechURLRecognitionRequest (ไฟล์เสียง) ทั้งคู่ส่งคืน SFTranscription — อาร์เรย์ของสมมติฐานการรู้จำทางเลือก
SFSpeechRecognitionResult ประกอบด้วย: bestTranscription (สมมติฐานที่ดีที่สุด, SFTranscription), transcriptions (ทางเลือกทั้งหมด), isFinal (สุดท้าย/ระหว่างกลาง) SFTranscription ประกอบด้วย: formattedString (ข้อความ), segments (อาร์เรย์ของ SFTranscriptionSegment พร้อมประทับเวลา, ความเชื่อมั่น, substringRange, alternativeSubstrings) ความเชื่อมั่นสำหรับแต่ละเซกเมนต์ (0..1) — ช่วยให้กรองส่วนที่ไม่น่าเชื่อถือออกไปได้ Segments เป็นคุณสมบัติหลักของ Speech.framework: มันให้การทำเครื่องหมายแบบคำต่อคำพร้อมคะแนนความเชื่อมั่น
สถาปัตยกรรม SFSpeechRecognizer: AVFoundation (การจับเสียง) → Audio Buffer → SFSpeechAudioBufferRecognitionRequest → SFSpeechRecognizer (เอ็นจิน ASR) → SFSpeechRecognitionResult → SFSpeechRecognitionTask (ควบคุม: cancel, finish, pause) เอ็นจิน ASR ของ Apple ใช้สถาปัตยกรรมแบบไฮบริด: Conformer (ตัวเข้ารหัส) + RNNT (ตัวถอดรหัส) สำหรับบนอุปกรณ์, Transducer สำหรับคลาวด์ โมเดลได้รับการปรับให้เหมาะสมกับ Apple Neural Engine (ANE) บน A17 Pro, ASR บนอุปกรณ์ทำงานด้วย RTF 0.3–0.6 (เร็วกว่าเวลาจริง)
| คอมโพเนนต์ | วัตถุประสงค์ | เวอร์ชัน iOS |
|---|---|---|
| SFSpeechRecognizer | คลาสหลักสำหรับการรู้จำ | iOS 10+ |
| SFSpeechAudioBufferRecognitionRequest | สตรีมเสียงสด | iOS 10+ |
| SFSpeechURLRecognitionRequest | ไฟล์เสียง (.wav, .m4a) | iOS 10+ |
| SFSpeechRecognitionTask | การจัดการคำขอ (cancel, finish) | iOS 10+ |
| การรู้จำบนอุปกรณ์ | ASR แบบออฟไลน์ | iOS 17+ |
| การรู้จำแบบรวม | ไฮบริดบนอุปกรณ์ + คลาวด์ | iOS 17+ |
ข้อกำหนดเสียง: SFSpeechRecognizer รองรับ LPCM (16 kHz, 16 bit, โมโน) หรือ Opus (iOS 17+) AVFoundation สามารถจับบัฟเฟอร์ในรูปแบบใดก็ได้ คำขอจะแปลงโดยอัตโนมัติ ความยาวขั้นต่ำ: 0.5 วินาที (การตรวจจับความเงียบ) สูงสุด: 1 นาที (คลาวด์) / 2 นาที (บนอุปกรณ์) ต่อคำขอ สำหรับการถอดความยาว ให้แบ่งเสียงเป็นชิ้นส่วน 30–60 วินาทีโดยมีการซ้อนทับ 2–5 วินาที
สิทธิ์ผู้ใช้: SFSpeechRecognizer ต้องการสิทธิ์ที่ชัดเจนสองรายการ NSMicrophoneUsageDescription (Privacy — Microphone Usage Description) — สำหรับการเข้าถึงไมโครโฟน NSSpeechRecognitionUsageDescription (Privacy — Speech Recognition Usage Description) — สำหรับการเข้าถึงการรู้จำเสียง ทั้งสองเป็นสตริงที่อธิบายเหตุผลให้ผู้ใช้ทราบ SFSpeechRecognizer.requestAuthorization — แสดงกล่องโต้ตอบสิทธิ์ สถานะ: notDetermined, denied, restricted, authorized หากไม่มีสถานะ authorized การเรียก recognizer จะส่งคืนข้อผิดพลาด 216 (Speech framework error)
การตรวจสอบความพร้อมใช้งาน: SFSpeechRecognizer.isAvailable — ตรวจสอบว่า ASR พร้อมใช้งานสำหรับภาษาปัจจุบันหรือไม่ บน iOS 16-, isAvailable = false โดยไม่มีอินเทอร์เน็ต บน iOS 17+, isAvailable = true สำหรับภาษาที่ทำงานบนอุปกรณ์แม้ออฟไลน์ SFSpeechRecognizer.supportedLocales — เมธอดแบบสแตติกสำหรับรับรายการภาษาที่อุปกรณ์รองรับ แนะนำให้ตรวจสอบ isAvailable ก่อนเริ่มทำงานแต่ละครั้ง (ผู้ใช้อาจปิด Siri/การเขียนตามคำบอกในการตั้งค่า) ความพร้อมใช้งานขึ้นอยู่กับภูมิภาค: จีน — เฉพาะในจีน, อาหรับ — ในสหรัฐอาหรับเอมิเรตส์
// การตั้งค่า SFSpeechRecognizer
import Speech
SFSpeechRecognizer.requestAuthorization { status in
guard status == .authorized else { return }
}
let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "ru_RU"))!
guard recognizer.isAvailable else {
print("ASR ไม่พร้อมใช้งาน เปิดใช้งาน Siri และการเขียนตามคำบอกในการตั้งค่า")
return
}
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
การจัดการข้อผิดพลาด: SFSpeechRecognizer ถูกเรียกด้วยตัวจัดการการเสร็จสมบูรณ์ที่อาจส่งคืนข้อผิดพลาด ข้อผิดพลาดหลัก: 203 — ไม่มีอินเทอร์เน็ต (คลาวด์, iOS 16-); 216 — ไม่ได้รับอนุญาต (ไม่มีสิทธิ์); 301 — ข้อผิดพลาดเสียง (ปัญหาไมโครโฟน/รูปแบบ); 401 — บริการไม่พร้อมใช้งาน (บริการโอเวอร์โหลด); 601 — ภาษาไม่พร้อมใช้งาน (ภาษาไม่รองรับบนอุปกรณ์) สำหรับบนอุปกรณ์ iOS 17+ ข้อผิดพลาดหลัก: 301 (เสียง), 601 (ภาษา) จัดการตัวจัดการการเสร็จสมบูรณ์เสมอ — ข้อผิดพลาดสามารถเกิดขึ้นได้ตลอดเวลาระหว่างการบันทึก
ไปป์ไลน์ ASR แบบสด: AVAudioEngine (การจับจากไมโครโฟน) → installTap (บัฟเฟอร์เสียง) → request.append(buffer) → SFSpeechRecognizer → recognitionTask → delegate/resultHandler AVAudioEngine ให้ความหน่วงต่ำ (5–10 ms จากไมค์ถึงบัฟเฟอร์) SFSpeechRecognitionDelegate: didHypothesizeTranscription (ทุก 200–500 ms — ข้อความบางส่วน), didFinishRecognition (ผลลัพธ์สุดท้าย) Task.isFinishing — สามารถยกเลิกเมื่อการรู้จำเสร็จสมบูรณ์ สำหรับการรู้จำต่อเนื่อง (การเขียนตามคำบอกไม่สิ้นสุด) ให้สร้างงานใหม่หลังจาก isFinal
SFSpeechRecognitionTaskDelegate: เมธอดที่ไม่บังคับ speechRecognitionDidDetectSpeech (เริ่มพูด) — สำหรับการแสดงผลบนอินเทอร์เฟซผู้ใช้ didHypothesizeTranscription (ข้อความระหว่างกลาง) — สำหรับแสดงขณะพูด didFinishRecognition (ผลลัพธ์สุดท้าย) — สำหรับสรุปข้อความ didFinishSuccessfully (สำเร็จ/ข้อผิดพลาด) — สำหรับการเสร็จสมบูรณ์ didProcessAudio (บัฟเฟอร์เสียงถูกประมวลผล) — สำหรับมาตรวัด RMS แนะนำให้ใช้ didHypothesizeTranscription — ผู้ใช้เห็นข้อความทันทีโดยไม่มีความล่าช้า การถอดความสุดท้ายสำหรับการบันทึก
// การรู้จำเสียงแบบสด
let audioEngine = AVAudioEngine()
let request = SFSpeechAudioBufferRecognitionRequest()
request.shouldReportPartialResults = true
recognitionTask = recognizer.recognitionTask(with: request) { result, error in
if let result = result {
textView.text = result.bestTranscription.formattedString
}
if error != nil || result?.isFinal == true {
audioEngine.stop()
request.endAudio()
}
}
let inputNode = audioEngine.inputNode
let recordingFormat = inputNode.outputFormat(forBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 1024,
format: recordingFormat) { buffer, _ in
request.append(buffer)
}
audioEngine.prepare()
try audioEngine.start()
การรู้จำต่อเนื่อง: สำหรับโหมด “ฟังตลอดเวลา” (การป้อนเสียง, ผู้ช่วย) จำเป็นต้องเริ่มงานใหม่หลังจาก isFinal สร้างลูป: finishTask → request = SFSpeechAudioBufferRecognitionRequest() → recognitionTask = recognizer.recognitionTask(with: request) เพื่อหลีกเลี่ยงช่องว่าง ให้ซ้อนทับจุดสิ้นสุดของงานหนึ่งกับจุดเริ่มต้นของงานถัดไป (เริ่มคำขอใหม่ 1–2 วินาทีก่อนที่งานก่อนหน้าจะสิ้นสุด) AVFoundation AVAudioSession — กำหนดค่า .playAndRecord สำหรับการเล่นและบันทึกพร้อมกัน บน iOS 17+ ASR ต่อเนื่องบนอุปกรณ์ใช้พลังงานแบตเตอรี่ 2–5% ต่อชั่วโมง (A15+)
SFSpeechURLRecognitionRequest — คำขอสำหรับรู้จำไฟล์เสียงด้วย URL รองรับรูปแบบ: .wav (16 kHz, 16 bit, โมโน), .m4a (AAC), .mp4, .mov ความยาวสูงสุด: ~1 นาทีสำหรับคลาวด์, ~2 นาทีสำหรับบนอุปกรณ์ สำหรับไฟล์ที่ยาวกว่าให้แบ่งเป็นชิ้นส่วน (AVAssetExportSession + trim) SFSpeechURLRecognitionRequest ไม่รองรับการสตรีมมิ่ง (ไม่มีผลลัพธ์บางส่วน) — เฉพาะผลลัพธ์สุดท้าย สำหรับผลลัพธ์บางส่วนกับไฟล์ให้แปลงเป็นคำขอ Audio Buffer
การรับการถอดความไฟล์เสียง: SFSpeechRecognizer.recognitionTask(with: request) resultHandler ดึง bestTranscription.formattedString สำหรับประทับเวลาระดับคำ — segments จาก bestTranscription.segments (segment.duration, segment.timestamp, segment.substring) ความเชื่อมั่นต่อเซกเมนต์ — ความเชื่อมั่นของ ASR สำหรับแต่ละคำ (ใช้สำหรับการกรอง) สมมติฐานทางเลือก — ทางเลือก transcriptionFormatter สำหรับคำที่มีความเชื่อมั่นต่ำ สำหรับไฟล์ที่มีผู้พูดหลายคน SFSpeechRecognitionRequest อาจส่งคืนหลายคำขอ (หนึ่งคำขอต่อผู้พูด, iOS 17+)
// การถอดความไฟล์เสียง
let audioURL = Bundle.main.url(forResource: "recording", withExtension: "m4a")!
let request = SFSpeechURLRecognitionRequest(url: audioURL)
request.requiresOnDeviceRecognition = true
recognizer.recognitionTask(with: request) { result, error in
guard let result = result, error == nil else {
print("ข้อผิดพลาด: \(error?.localizedDescription ?? "unknown")")
return
}
let transcription = result.bestTranscription
let text = transcription.formattedString
let words = transcription.segments.map { segment in
Word(text: segment.substring,
start: segment.timestamp,
duration: segment.duration,
confidence: segment.confidence)
}
}
การแบ่งไฟล์เสียงยาว: สำหรับไฟล์ > 1 นาที ให้แบ่งเป็นชิ้นส่วน 30–60 วินาทีโดยมีการซ้อนทับ 2–3 วินาที (การต่อเชื่อม) AVAssetExportSession + CMTimeRange — ส่งออกชิ้นส่วน ทางเลือก: UISelectionView (ผู้ใช้เลือกเซกเมนต์) การต่อเชื่อมการถอดความ: รวมข้อความ, ต่อเชื่อมโดยการซ้อนทับ (เปรียบเทียบ 2–3 คำสุดท้ายของชิ้นส่วนก่อนหน้ากับ 2–3 คำแรกของชิ้นส่วนถัดไป — ลบรายการที่ซ้ำกัน) Vosk และ Whisper รองรับเสียงยาวโดยตรง SFSpeechRecognizer ไม่รองรับ สำหรับการถอดความยาว ฉันแนะนำ Whisper (Core ML) — ไม่มีข้อจำกัดความยาว
โหมดบนอุปกรณ์ (iOS 17+): request.requiresOnDeviceRecognition = true ASR ทำงานในเครื่องบน Apple Neural Engine (ANE) ข้อดี: ไม่ต้องใช้อินเทอร์เน็ต, ความเป็นส่วนตัว (เสียงไม่เคยออกจากอุปกรณ์), ต้นทุนเป็นศูนย์ (ฟรี), ความหน่วงต่ำ (RTF 0.3–0.6) ข้อเสีย: ความแม่นยำต่ำกว่า (WER 12–14% เทียบกับ 7–12%), จำกัด 2 นาทีต่อคำขอ, ชุดภาษาที่จำกัด (ไม่ใช่ทั้งหมด 60 ภาษาที่พร้อมใช้งานบนอุปกรณ์) โมเดลบนอุปกรณ์ใช้พื้นที่ ~50–100 MB บนอุปกรณ์และดาวน์โหลดเมื่อมีการขอครั้งแรก
คลาวด์ (iOS 16-): request.requiresOnDeviceRecognition = false (หรือไม่มีพารามิเตอร์) ASR บนเซิร์ฟเวอร์ของ Apple — แม่นยำกว่า (WER 7% EN, 12% RU), ภาษามากกว่า, สูงสุด 1 นาทีต่อคำขอ ต้องใช้อินเทอร์เน็ต (WiFi หรือเซลลูลาร์) Apple ไม่เรียกเก็บเงินจากนักพัฒนาสำหรับ ASR แบบคลาวด์ (ฟรี) ข้อจำกัด: 1 คำขอต่อนาทีต่อแอปพลิเคชัน (ไม่ระบุ) แต่ Apple อาจจำกัดในระดับการผลิต ASR แบบคลาวด์ให้คุณภาพแบบ best-effort โดยไม่มี SLA สำหรับแอประดับองค์กร ให้ใช้ Google Cloud ASR หรือ Whisper (Core ML)
| พารามิเตอร์ | บนอุปกรณ์ (iOS 17+) | คลาวด์ (iOS 10+) |
|---|---|---|
| ต้องใช้อินเทอร์เน็ต | ไม่ | ใช่ |
| WER (EN) | 10–12% | 7% |
| WER (RU) | 12–14% | 12% |
| ความหน่วง (RTF) | 0.3–0.6 | 0.3–0.8 (+เครือข่าย) |
| ความยาวสูงสุด | 2 นาที | 1 นาที |
| ความเป็นส่วนตัว | สมบูรณ์ | เสียงออกจากอุปกรณ์ |
| ฟรี | ใช่ | ใช่ |
การรู้จำแบบรวม (iOS 17+): request.requiresOnDeviceRecognition = false เมื่อมีอินเทอร์เน็ต (คลาวด์), = true เมื่อออฟไลน์ (สำรอง) Apple เลือกโหมดโดยอัตโนมัติ สำหรับแอปที่สำคัญต่อความแม่นยำ: ตรวจสอบ NetworkMonitor (NWPathMonitor) — ใช้คลาวด์เมื่อมีอินเทอร์เน็ต, บนอุปกรณ์เมื่อไม่มี สำหรับแอปที่สำคัญต่อความเป็นส่วนตัว: บนอุปกรณ์เสมอ สำหรับการถอดความ: คลาวด์ (แม่นยำกว่า) สำหรับการป้อนเสียง: บนอุปกรณ์ (เร็วกว่า) แนะนำแบบรวม: 80% คลาวด์, 20% สำรองบนอุปกรณ์
การป้อนเสียงในแป้นพิมพ์แบบกำหนดเอง — SFSpeechRecognizer ถูกรวมเข้ากับส่วนขยายแป้นพิมพ์ (iOS 10+) ผู้ใช้กดปุ่มไมโครโฟน ASR ถอดความเสียงเป็นข้อความและแทรกลงในฟิลด์ข้อความ ข้อกำหนด: ผลลัพธ์บางส่วน (เห็นข้อความแบบเรียลไทม์), บนอุปกรณ์ (แป้นพิมพ์ต้องทำงานโดยไม่ต้องใช้อินเทอร์เน็ต) SFSpeechRecognizer + AVSpeechSynthesizer — การป้อนเสียง + การส่งออกเสียง สำหรับแป้นพิมพ์แบบกำหนดเองบน iOS 17+ ให้ใช้บนอุปกรณ์ ข้อจำกัดของส่วนขยายแป้นพิมพ์: AVAudioEngine พร้อมใช้งานแต่มีข้อจำกัดด้านเวลา (การทำงานเบื้องหลังมีจำกัด)
การถอดความการประชุมและการบรรยาย — แอปสำหรับบันทึกและถอดความเสียง (Otter.ai, Rev, Apple Voice Memos) SFSpeechURLRecognitionRequest ประมวลผลไฟล์ .m4a สำหรับการบันทึกยาว (30–60 นาที) — Whisper Core ML (ไม่มีข้อจำกัดความยาว) Segments ของ SFSpeechRecognizer พร้อมประทับเวลา — สำหรับซิงค์ข้อความกับเสียง (การเน้นข้อความระหว่างการเล่น) ความเชื่อมั่นต่อเซกเมนต์ — สำหรับแสดงส่วนที่ไม่น่าเชื่อถือ (เน้นสีเหลือง) สำหรับการแยกผู้พูด (ใครพูด) — Apple ไม่มี API ให้ ใช้ pyannote-audio + Whisper บนเซิร์ฟเวอร์
คำสั่งเสียงในแอป iOS — SFSpeechRecognizer + เฟรมเวิร์ก VGS (Voice Grammar Services) สำหรับดำเนินการคำสั่ง: “เปิดการตั้งค่า”, “ส่งข้อความ”, “เปิดไฟ” การรู้จำตามหลักไวยากรณ์: SFSpeechRecognitionRequest contextualStrings = อาร์เรย์ของคำสั่ง ซึ่งช่วยเพิ่มความแม่นยำในการรู้จำคำสั่งเป็น 95% (เทียบกับ 85% แบบฟรีฟอร์ม) SFSpeechRecognitionTask.cancel — สำหรับขัดจังหวะหลังจากดำเนินการคำสั่ง VGS + SFSpeechRecognizer + Shortcuts — คำสั่งเสียงแบบกำหนดเองโดยไม่ต้องเขียนอินเทอร์เฟซผู้ใช้ สำหรับการช่วยเหลือ: Voice Control (ในตัว) + SFSpeechRecognizer (คำสั่งแบบกำหนดเอง)
// คำสั่งเสียงพร้อมสตริงบริบท
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
request.shouldReportPartialResults = true
request.contextualStrings = ["open contacts", "send message",
"show notifications", "เปิดไฟฉาย"]
recognitionTask = recognizer.recognitionTask(with: request) { result, _ in
guard let text = result?.bestTranscription.formattedString.lowercased() else { return }
voiceCommands.first { text.contains($0) }.map { command in
DispatchQueue.main.async { self.executeCommand(command) }
recognitionTask?.cancel()
}
}
การเขียนตามคำบอกในแอปทางการแพทย์และกฎหมาย — SFSpeechRecognizer สำหรับสร้างเอกสารที่มีโครงสร้างด้วยเสียง การปรับเปลี่ยนโดเมน: contextualStrings พร้อมคำศัพท์ทางการแพทย์/กฎหมาย (500+ วลี) SFSpeechRecognitionRequest.customLmProbability — ผลกระทบของ contextualStrings (0.1–1.0) สำหรับการเขียนตามคำบอกทางการแพทย์ ให้ใช้บนอุปกรณ์ (ความเป็นส่วนตัวของข้อมูลผู้ป่วย) Whisper ที่ปรับแต่งบนข้อมูลทางการแพทย์ — ทางเลือกด้วย WER 5% แทน 12% ของ SFSpeechRecognizer พื้นฐาน การปฏิบัติตาม HIPAA: โหมดบนอุปกรณ์ (ข้อมูลไม่เคยออกจากอุปกรณ์) สำหรับการถอดความนัดหมาย — SFSpeechURLRecognitionRequest + segments พร้อมประทับเวลาผู้พูด
คำถามที่พบบ่อย
SFSpeechRecognizer พร้อมใช้งานตั้งแต่ iOS 10, macOS 10.15, watchOS 6 และ tvOS 17 โหมดบนอุปกรณ์ตั้งแต่ iOS 17 (requiresOnDeviceRecognition) บน iOS 10–16 SFSpeechRecognizer ทำงานผ่านเซิร์ฟเวอร์คลาวด์ของ Apple เท่านั้น (ต้องใช้อินเทอร์เน็ต) ทุกเวอร์ชันต้องได้รับอนุญาตอย่างชัดแจ้งจากผู้ใช้ (NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription) SFSpeechRecognizer.supportedLocales — รายการแบบไดนามิก ขึ้นอยู่กับภูมิภาคและรุ่นอุปกรณ์
ได้ โดยการสร้าง recognitionTask ใหม่หลังจาก isFinal เริ่มงานใหม่หลังจากงานก่อนหน้าเสร็จสมบูรณ์สำหรับการรู้จำต่อเนื่อง บน iOS 17 ASR ต่อเนื่องบนอุปกรณ์ใช้พลังงานแบตเตอรี่ 2–5% ต่อชั่วโมง (A15+) บน iOS 16- ASR ต่อเนื่องต้องใช้อินเทอร์เน็ต (ปริมาณการใช้งาน ~1 MB/นาที) สำหรับการรู้จำต่อเนื่องอย่างแท้จริง (ฟังตลอดเวลา) ให้ใช้ Vosk (ออฟไลน์) หรือ Whisper Core ML SFSpeechRecognizer ไม่รองรับโหมดเปิดตลอดเวลาบน iOS 16-
ใช้ result.bestTranscription.segments — แต่ละ SFTranscriptionSegment มี confidence (Float 0..1) สำหรับคำ segments[i].substring — ข้อความของคำ segments[i].confidence — ความเชื่อมั่นของ ASR สำหรับคำนั้น คำที่มี confidence < 0.5 ไม่น่าเชื่อถือ — เน้นคำเหล่านั้นในอินเทอร์เฟซผู้ใช้ segments[i].timestamp — เวลาเริ่มต้น (TimeInterval) segments[i].duration — ระยะเวลา segments[i].alternativeSubstrings — สมมติฐานการรู้จำทางเลือกสำหรับคำ สำหรับไฟล์ยาว การวนซ้ำผ่าน segments จะให้ความเชื่อมั่นต่อคำโดยไม่ต้องแยกวิเคราะห์ด้วยตนเอง
203 คือ SFSpeechError.ErrorCode.opportunistic (ไม่มีอินเทอร์เน็ตสำหรับ ASR คลาวด์) เกิดขึ้นบน iOS 16- หรือเมื่อ request.requiresOnDeviceRecognition = false โดยไม่มีอินเทอร์เน็ต วิธีแก้ไข: ตั้งค่า requiresOnDeviceRecognition = true (iOS 17+) สำหรับการทำงานออฟไลน์ บน iOS 16- ให้ใช้ NWPathMonitor — เมื่อไม่มีอินเทอร์เน็ต ให้แสดงข้อความ “การรู้จำเสียงต้องมีการเชื่อมต่ออินเทอร์เน็ต” ทางเลือก: ใช้ Vosk (ออฟไลน์, iOS 12+) เป็นตัวสำรองเมื่อไม่มีเครือข่าย
SFSpeechRecognizer — API ในตัวของ Apple, ฟรี, รวมง่าย, แต่มีข้อจำกัดความยาว (1–2 นาที), ความแม่นยำ WER 7–14% และเฉพาะระบบนิเวศ iOS Whisper Core ML — โอเพนซอร์ส (MIT), รองรับ 99 ภาษา, WER 6–10%, ไม่มีข้อจำกัดความยาว, แต่ต้องรวมด้วยตนเอง, โมเดล Core ML (39M–769M พารามิเตอร์), RTF 0.5–6 (ช้ากว่า SFSpeechRecognizer) SFSpeechRecognizer — สำหรับการป้อนเสียงมาตรฐาน Whisper — สำหรับการถอดความเสียงยาวที่มีความแม่นยำสูง
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ