หากต้องการใช้แอปพลิเคชันการโต้ตอบด้วยเสียง (VIA) ให้ทำตามขั้นตอนต่อไปนี้
- สร้างโครงร่าง VIA
- (ไม่บังคับ) ใช้ขั้นตอนการตั้งค่า/การลงชื่อเข้าใช้
- (ไม่บังคับ) ใช้หน้าจอการตั้งค่า
- ประกาศสิทธิ์ที่จําเป็นในไฟล์ Manifest
- ใช้ UI แผ่นเสียง
- ติดตั้งใช้งานการจดจําเสียง (ต้องรวมการติดตั้งใช้งาน RecognitionService API ด้วย)
- ใช้คําพูด (ไม่บังคับ คุณใช้ TextToSpeech API ได้)
- ใช้การดําเนินการตามคําสั่ง ดูเนื้อหานี้ในการดำเนินการตามคําสั่ง
ส่วนต่อไปนี้จะอธิบายวิธีดำเนินการแต่ละขั้นตอนที่กล่าวถึงข้างต้น
สร้างโครงร่าง VIA
Manifest
ระบบจะตรวจพบว่าแอปมีการโต้ตอบด้วยเสียงเมื่อมีสิ่งต่อไปนี้รวมอยู่ในไฟล์ Manifest
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myvoicecontrol"> ... <application ... > <service android:name=".MyInteractionService" android:label="@string/app_name" android:permission="android.permission.BIND_VOICE_INTERACTION" android:process=":interactor"> <meta-data android:name="android.voice_interaction" android:resource="@xml/interaction_service" /> <intent-filter> <action android:name= "android.service.voice.VoiceInteractionService" /> </intent-filter> </service> </application> </manifest>
ในตัวอย่างนี้
- VIA ต้องแสดงบริการที่ขยาย
VoiceInteractionService
โดยมีตัวกรอง Intent สําหรับการดําเนินการVoiceInteractionService.SERVICE_INTERFACE ("android.service.voice.VoiceInteractionService")
- บริการนี้ต้องมีสิทธิ์การรับรองระบบ
BIND_VOICE_INTERACTION
- บริการนี้ควรมี
android.voice_interaction
ไฟล์ข้อมูลเมตา ที่มีข้อมูลต่อไปนี้res/xml/interaction_service.xml
<voice-interaction-service xmlns:android="http://schemas.android.com/apk/res/android" android:sessionService= "com.example.MyInteractionSessionService" android:recognitionService= "com.example.MyRecognitionService" android:settingsActivity= "com.example.MySettingsActivity" android:supportsAssist="true" android:supportsLaunchVoiceAssistFromKeyguard="true" android:supportsLocalInteraction="true" />
โปรดดูรายละเอียดเกี่ยวกับแต่ละช่องที่หัวข้อR.styleable#VoiceInteractionService
เนื่องจาก VIA ทั้งหมดเป็นบริการจดจำเสียงด้วย คุณจึงต้องใส่ข้อมูลต่อไปนี้ไว้ในไฟล์ Manifest ด้วย
AndroidManifest.xml
<manifest ...> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <application ...> ... <service android:name=".RecognitionService" ...> <intent-filter> <action android:name="android.speech.RecognitionService" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-data android:name="android.speech" android:resource="@xml/recognition_service" /> </service> </application> </manifest>
บริการจดจำเสียงต้องใช้ข้อมูลเมตาต่อไปนี้ด้วย
res/xml/recognition_service.xml
<recognition-service xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="com.example.MyRecognizerSettingsActivity" />
VoiceInteractionService, VoiceInteractionSessionService และ VoiceInteractionSession
แผนภาพต่อไปนี้แสดงวงจรชีวิตของเอนทิตีแต่ละรายการ
รูปที่ 1 วงจร
ดังที่ได้กล่าวไว้ก่อนหน้านี้ VoiceInteractionService
คือจุดแรกเข้าสู่ VIA ความรับผิดชอบหลักของบริการนี้ ได้แก่
- เริ่มต้นกระบวนการใดๆ ที่ควรทำงานต่อไปตราบเท่าที่ VIA นี้ทำงานอยู่ เช่น การตรวจหาคำที่นิยม
- รายงานการสั่งงานด้วยเสียงที่รองรับ (ดูฟีเจอร์แตะเพื่ออ่านของ Voice Assistant)
- เปิดเซสชันการโต้ตอบด้วยเสียงจากหน้าจอล็อก (Keyguard)
รูปแบบที่ง่ายที่สุดของการใช้งาน VoiceInteractionService จะมีลักษณะดังนี้
public class MyVoiceInteractionService extends VoiceInteractionService { private static final List<String> SUPPORTED_VOICE_ACTIONS = Arrays.asList( CarVoiceInteractionSession.VOICE_ACTION_READ_NOTIFICATION, CarVoiceInteractionSession.VOICE_ACTION_REPLY_NOTIFICATION, CarVoiceInteractionSession.VOICE_ACTION_HANDLE_EXCEPTION ); @Override public void onReady() { super.onReady(); // TODO: Setup hotword detector } @NonNull @Override public Set<String> onGetSupportedVoiceActions( @NonNull Set<String> voiceActions) { Set<String> result = new HashSet<>(voiceActions); result.retainAll(SUPPORTED_VOICE_ACTIONS); return result; } ... }
การติดตั้งใช้งาน VoiceInteractionService#onGetSupportedVoiceActions()
เป็นสิ่งที่จําเป็นเพื่อจัดการฟีเจอร์แตะเพื่ออ่านของ Assistant
ระบบใช้ VoiceInteractionSessionService เพื่อสร้างและโต้ตอบกับ VoiceInteractionSession หน้าที่มีเพียงอย่างเดียวคือเริ่มเซสชันใหม่เมื่อได้รับคําขอ
public class MyVoiceInteractionSessionService extends VoiceInteractionSessionService { @Override public VoiceInteractionSession onNewSession(Bundle args) { return new MyVoiceInteractionSession(this); } }
สุดท้าย VoiceInteractionSession คือที่ที่งานส่วนใหญ่จะดำเนินการ ระบบอาจนําอินสแตนซ์เซสชันเดียวมาใช้ซ้ำเพื่อให้การโต้ตอบของผู้ใช้หลายรายการเสร็จสมบูรณ์ ใน AAOS จะมีตัวช่วย CarVoiceInteractionSession
อยู่ ซึ่งช่วยในการใช้งานฟังก์ชันการทำงานเฉพาะบางอย่างของยานยนต์
public class MyVoiceInteractionSession extends CarVoiceInteractionSession { public InteractionSession(Context context) { super(context); } @Override protected void onShow(String action, Bundle args, int showFlags) { closeSystemDialogs(); // TODO: Unhide UI and update UI state // TODO: Start processing audio input } ... }
VoiceInteractionSession
มีเมธอดการเรียกกลับจํานวนมากซึ่งอธิบายไว้ในส่วนต่อไปนี้ ดูรายการทั้งหมดของVoiceInteractionSession
ได้ในเอกสารประกอบ
ใช้ขั้นตอนการตั้งค่า/การลงชื่อเข้าใช้
การตั้งค่าและการลงชื่อเข้าใช้อาจเกิดขึ้นในกรณีต่อไปนี้
- ในระหว่างการเริ่มต้นใช้งานอุปกรณ์ (วิซาร์ดการตั้งค่า)
- ในระหว่างการสลับบริการโต้ตอบด้วยเสียง (การตั้งค่า)
- เมื่อเปิดแอปเป็นครั้งแรก
ดูรายละเอียดเกี่ยวกับประสบการณ์ของผู้ใช้และคำแนะนำภาพแนะนำได้ที่ผู้ช่วยที่โหลดไว้ล่วงหน้า: คำแนะนำ UX
การตั้งค่าระหว่างการสลับบริการเสียง
ผู้ใช้อาจเลือก VIA ที่ยังไม่ได้กําหนดค่าอย่างถูกต้องได้เสมอ ซึ่งอาจเกิดขึ้นเนื่องจากสาเหตุต่อไปนี้
- ผู้ใช้ข้ามวิซาร์ดการตั้งค่าโดยสิ้นเชิง หรือข้ามขั้นตอนการกําหนดค่าการโต้ตอบด้วยเสียง
- ผู้ใช้เลือก VIA ที่แตกต่างจากที่กําหนดค่าไว้ระหว่างการเริ่มต้นใช้งานอุปกรณ์
ไม่ว่าในกรณีใด VoiceInteractionService
ก็มีวิธีต่างๆ ในการกระตุ้นให้ผู้ใช้ตั้งค่าให้เสร็จสมบูรณ์ ดังนี้
- การช่วยเตือนการแจ้งเตือน
- การตอบกลับด้วยเสียงอัตโนมัติเมื่อผู้ใช้พยายามใช้
หมายเหตุ: ไม่แนะนําอย่างยิ่งให้แสดงขั้นตอนการตั้งค่า VIA โดยไม่ได้รับการร้องขอจากผู้ใช้อย่างชัดเจน ซึ่งหมายความว่า VIA ควรหลีกเลี่ยงการแสดงเนื้อหาบน HU โดยอัตโนมัติระหว่างการบูตอุปกรณ์หรือเมื่อผู้ใช้สลับหรือปลดล็อก
การช่วยเตือนการแจ้งเตือน
การช่วยเตือนด้วยการแจ้งเตือนเป็นวิธีที่ไม่รบกวนในการบ่งบอกถึงความจำเป็นในการตั้งค่า และเพื่อให้ผู้ใช้ไปยังขั้นตอนการตั้งค่า Assistant ได้
รูปที่ 2 การช่วยเตือนการแจ้งเตือน
ขั้นตอนการทำงานมีดังนี้
รูปที่ 3 ขั้นตอนการช่วยเตือนการแจ้งเตือน
ตอบกลับด้วยเสียง
นี่เป็นขั้นตอนที่ง่ายที่สุดในการใช้งาน โดยเริ่มคําพูดใน VoiceInteractionSession#onShow()
callback, อธิบายให้ผู้ใช้ทราบว่าต้องทําอะไรบ้าง จากนั้นถามผู้ใช้ (หากอนุญาตให้ตั้งค่าโดยพิจารณาจากสถานะข้อจํากัด UX) ว่าต้องการเริ่มขั้นตอนการตั้งค่าหรือไม่ หากตั้งค่าไม่ได้ในตอนนั้น ให้อธิบายสถานการณ์นี้ด้วย
การตั้งค่าในการใช้งานครั้งแรก
ผู้ใช้อาจเรียกใช้ VIA ที่ยังไม่ได้กําหนดค่าอย่างถูกต้องได้เสมอ ในกรณีดังกล่าว
- แจ้งให้ผู้ใช้ทราบเกี่ยวกับสถานการณ์นี้ด้วยวาจา (เช่น "หากต้องการให้ทำงานได้อย่างถูกต้อง เราต้องการให้คุณทำตามขั้นตอน 2-3 ขั้นตอน … ")
- หากเครื่องมือข้อจำกัด UX อนุญาต (ดู UX_RESTRICTIONS_NO_SETUP) ให้ถามผู้ใช้ว่าต้องการเริ่มกระบวนการตั้งค่าหรือไม่ จากนั้นเปิดหน้าจอการตั้งค่าสำหรับ VIA
- หรือหากไม่ (เช่น ผู้ใช้ขับรถอยู่) ให้ส่งการแจ้งเตือนเพื่อให้ผู้ใช้คลิกตัวเลือกเมื่อปลอดภัย
สร้างหน้าจอการตั้งค่าการโต้ตอบด้วยเสียง
หน้าจอการตั้งค่าและหน้าจอลงชื่อเข้าใช้ควรพัฒนาเป็นกิจกรรมปกติ ดูหลักเกณฑ์ UX และภาพสำหรับการพัฒนา UI ในผู้ช่วยที่โหลดไว้ล่วงหน้า: คำแนะนำ UX
หลักเกณฑ์ทั่วไป
- VIA ควรอนุญาตให้ผู้ใช้หยุดการตั้งค่าชั่วคราวและกลับมาตั้งค่าต่อได้ทุกเมื่อ
- ไม่ควรอนุญาตให้ตั้งค่าหากการจํากัด
UX_RESTRICTIONS_NO_SETUP
มีผล โปรดดูรายละเอียดที่หัวข้อหลักเกณฑ์เกี่ยวกับสิ่งรบกวนคนขับ - หน้าจอการตั้งค่าควรตรงกับระบบการออกแบบของยานพาหนะแต่ละคัน เลย์เอาต์ ไอคอน สี และองค์ประกอบอื่นๆ ของหน้าจอทั่วไปควรสอดคล้องกับ UI ที่เหลือ ดูรายละเอียดได้ที่การปรับแต่ง
ใช้หน้าจอการตั้งค่า
รูปที่ 4 การผสานรวมการตั้งค่า
หน้าจอการตั้งค่าเป็นกิจกรรมปกติของ Android หากมีการใช้งาน จะต้องประกาศจุดแรกเข้าของ VIA ใน res/xml/interaction_service.xml
เป็นส่วนหนึ่งของไฟล์ Manifest ของ VIA (ดูไฟล์ Manifest)
ส่วนการตั้งค่าเป็นตําแหน่งที่ดีในการตั้งค่าและลงชื่อเข้าใช้ต่อ (หากผู้ใช้ยังไม่ได้ดำเนินการให้เสร็จสิ้น) หรือเสนอตัวเลือกออกจากระบบหรือเปลี่ยนผู้ใช้ หากจําเป็น หน้าจอเหล่านี้ควรมีลักษณะคล้ายกับหน้าจอการตั้งค่าที่อธิบายไว้ข้างต้น ดังนี้
- ระบุตัวเลือกในการออกกลับไปยังหน้าจอก่อนหน้าในกองหน้าจอ (เช่น ไปยังการตั้งค่ารถยนต์)
- ไม่อนุญาตขณะขับรถ โปรดดูรายละเอียดที่หัวข้อหลักเกณฑ์เกี่ยวกับสิ่งรบกวนคนขับ
- จับคู่ระบบการออกแบบยานพาหนะแต่ละระบบ โปรดดูรายละเอียดที่หัวข้อการปรับแต่ง
ประกาศสิทธิ์ที่จําเป็นในไฟล์ Manifest
สิทธิ์ที่จําเป็นสําหรับ VIA สามารถแบ่งออกเป็น 3 หมวดหมู่ ดังนี้
- สิทธิ์การรับรองระบบ สิทธิ์เหล่านี้จะมอบให้กับ APK ที่ติดตั้งไว้ล่วงหน้าและรับรองโดยระบบเท่านั้น ผู้ใช้ไม่สามารถให้สิทธิ์เหล่านี้ได้ มีเพียง OEM เท่านั้นที่ให้สิทธิ์เหล่านั้นได้เมื่อสร้างอิมเมจระบบ ดูข้อมูลเพิ่มเติมเกี่ยวกับการรับสิทธิ์การรับรองได้ที่หัวข้อให้สิทธิ์ที่มีสิทธิ์ระดับระบบ
- สิทธิ์ที่เป็นอันตราย สิทธิ์เหล่านี้คือสิทธิ์ที่ผู้ใช้ต้องมอบโดยใช้กล่องโต้ตอบ PermissionsController OEM สามารถให้สิทธิ์บางอย่างเหล่านี้แก่ VoiceInteractionService เริ่มต้นล่วงหน้าได้ แต่เนื่องจากค่าเริ่มต้นนี้อาจแตกต่างกันไปในแต่ละอุปกรณ์ แอปจึงควรขอสิทธิ์เหล่านี้ได้เมื่อจำเป็น
- สิทธิ์อื่นๆ สิทธิ์อื่นๆ ทั้งหมดที่ไม่จำเป็นต้องมีการดำเนินการจากผู้ใช้ ระบบจะมอบสิทธิ์เหล่านี้ให้โดยอัตโนมัติ
จากข้อมูลข้างต้น ส่วนต่อไปนี้จะมุ่งเน้นที่การขอสิทธิ์ที่เป็นอันตรายเท่านั้น ควรขอสิทธิ์เฉพาะในขณะที่ผู้ใช้อยู่ในหน้าจอลงชื่อเข้าใช้หรือการตั้งค่าเท่านั้น
หากแอปไม่มีสิทธิ์ที่จําเป็นต่อการใช้งาน ขั้นตอนที่แนะนําคือการใช้คําพูดเพื่ออธิบายสถานการณ์ให้ผู้ใช้ทราบ และการแจ้งเตือนเพื่อระบุสิ่งที่ผู้ใช้สามารถทำได้เพื่อไปยังหน้าจอการตั้งค่า VIA ดูรายละเอียดได้ที่ 1. การช่วยเตือนการแจ้งเตือน
ขอสิทธิ์ในหน้าจอการตั้งค่า
ระบบจะขอสิทธิ์ที่เป็นอันตรายโดยใช้เมธอด ActivityCompat#requestPermission()
ปกติ (หรือเทียบเท่า) ดูรายละเอียดเกี่ยวกับวิธีขอสิทธิ์ได้ที่หัวข้อขอสิทธิ์ของแอป
รูปที่ 5 ขอสิทธิ์
สิทธิ์ตัวฟังการแจ้งเตือน
หากต้องการใช้ขั้นตอน TTR คุณต้องกำหนด VIA เป็นผู้ฟังการแจ้งเตือน การดำเนินการนี้ไม่ใช่สิทธิ์ แต่เป็นการกําหนดค่าที่อนุญาตให้ระบบส่งการแจ้งเตือนไปยังผู้ฟังที่ลงทะเบียนไว้ หากต้องการดูว่า VIA ได้รับสิทธิ์เข้าถึงข้อมูลนี้หรือไม่ แอปจะทำสิ่งต่อไปนี้ได้
- (ไม่บังคับ) ตรวจสอบว่ามีผู้ฟังการแจ้งเตือนล่วงหน้าหรือไม่โดยใช้
CarAssistUtils#assistantIsNotificationListener()
ซึ่งอาจทำได้ในระหว่างขั้นตอนการตั้งค่า - (ต้องระบุ) ตอบสนองต่อการจัดการ
CarVoiceInteractionSession#onShow()
ด้วยการดำเนินการVOICE_ACTION_HANDLE_EXCEPTION
และข้อยกเว้นEXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING
หากไม่มีการให้สิทธิ์เข้าถึงนี้ล่วงหน้า VIA ควรนำผู้ใช้ไปยังส่วนการเข้าถึงการแจ้งเตือนในการตั้งค่ารถยนต์ โดยใช้คําพูดและการแจ้งเตือนร่วมกัน คุณสามารถใช้โค้ดต่อไปนี้เพื่อเปิดส่วนที่เหมาะสมของแอปการตั้งค่า
private void requestNotificationListenerAccess() { Intent intent = new Intent(Settings .ACTION_NOTIFICATION_LISTENER_SETTINGS); intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName()); startActivity(intent); }
ใช้ UI ของเพลตเสียง
เมื่อ VoiceInteractionSession
ได้รับ onShow()
ติดต่อกลับ VoiceInteractionSession
จะแสดง UI ของเพลตเสียงได้ ดูหลักเกณฑ์ด้านภาพและ UX ในการใช้งานเพลตเสียงได้ที่ผู้ช่วยที่โหลดไว้ล่วงหน้า: หลักเกณฑ์ UX
รูปที่ 6 การแสดงเพลตเสียง
การติดตั้งใช้งาน UI นี้ทำได้ 2 วิธีดังนี้
- ลบล้าง
VoiceInteractionSession#onCreateContentView()
- เปิดกิจกรรมโดยใช้
VoiceInteractionSession#startAssistantActivity()
ใช้ onCreateContentView()
วิธีนี้เป็นวิธีเริ่มต้นในการแสดงป้ายเสียง VoiceInteractionSession
คลาสพื้นฐานจะสร้างกรอบเวลาและจัดการวงจรของกรอบเวลานั้นตราบใดที่เซสชันเสียงยังทำงานอยู่ แอปต้องลบล้าง VoiceInteractionSession#onCreateContentView()
และแสดงผลลัพธ์ที่แนบมากับหน้าต่างนั้นทันทีที่สร้างเซสชัน มุมมองนี้ไม่ควรแสดงในตอนแรก เมื่อเริ่มการโต้ตอบด้วยเสียง ระบบควรแสดงมุมมองนี้ใน VoiceInteractionSession#onShow()
แล้วกลับซ่อนอีกครั้งใน VoiceInteractionSession#onHide()
public class MyVoiceInteractionSession extends CarVoiceInteractionSession { private View mVoicePlate; … @Override public View onCreateContentView() { mVoicePlate = inflater.inflate(R.layout.voice_plate, null); … } @Override protected void onShow(String action, Bundle args, int showFlags) { // TODO: Update UI state to "listening" mVoicePlate.setVisibility(View.VISIBLE); } @Override public void onHide() { mVoicePlate.setVisibility(View.GONE); } … }
เมื่อใช้วิธีนี้ คุณอาจต้องปรับ VoiceInteractionSession#onComputeInsets()
เพื่อพิจารณาพื้นที่ของ UI ที่บดบัง
ใช้ startAssistantActivity()
ในกรณีนี้ VoiceInteractionSession
จะมอบสิทธิ์การจัดการ UI ของแพลตฟอร์มเสียงให้กับกิจกรรมปกติ เมื่อใช้ตัวเลือกนี้ การใช้งาน VoiceInteractionSession
ต้องปิดใช้การสร้างหน้าต่างเนื้อหาเริ่มต้น (ดูการใช้ onCreateContentView()) ใน onPrepareShow()
callback เวลา VoiceInteractionSession#onShow()
เซสชันจะเริ่มกิจกรรมแพลตฟอร์มเสียงโดยใช้ VoiceInteractionSession#startAssistantActivity()
วิธีนี้จะเริ่มต้น UI ด้วยการตั้งค่าหน้าต่างและ Flag กิจกรรมที่เหมาะสม
public class MyVoiceInteractionSession extends CarVoiceInteractionSession { … @Override public void onPrepareShow(Bundle args, int showFlags) { super.onPrepareShow(args, showFlags); setUiEnabled(false); } @Override protected void onShow(String action, Bundle args, int showFlags) { closeSystemDialogs(); Intent intent = new Intent(getContext(), VoicePlateActivity.class); intent.putExtra(VoicePlateActivity.EXTRA_ACTION, action); intent.putExtra(VoicePlateActivity.EXTRA_ARGS, args); startAssistantActivity(intent); } … }
หากต้องการรักษาการสื่อสารระหว่างกิจกรรมนี้กับVoiceInteractionSession
คุณอาจต้องใช้ชุด Intent หรือการเชื่อมโยงบริการภายใน เช่น เมื่อเรียกใช้ VoiceInteractionSession#onHide()
เซสชันต้องสามารถส่งคําขอนี้ไปยังกิจกรรมได้
สำคัญ ในยานยนต์ เฉพาะกิจกรรมที่มีคำอธิบายประกอบเป็นพิเศษหรือกิจกรรมที่แสดงอยู่ใน "รายการที่อนุญาต" ของ UXR เท่านั้นที่จะแสดงขณะขับรถได้ ซึ่งมีผลกับกิจกรรมที่เริ่มต้นด้วย VoiceInteractionSession#startAssistantActivity()
ด้วย อย่าลืมกำกับเนื้อหากิจกรรมด้วย <meta-data
android:name="distractionOptimized" android:value="true"/>
หรือรวมกิจกรรมนี้ไว้ในคีย์ systemActivityWhitelist
ของไฟล์ /packages/services/Car/service/res/values/config.xml
ดูข้อมูลเพิ่มเติมได้ที่หลักเกณฑ์เกี่ยวกับการรบกวนสมาธิของผู้ขับขี่
ใช้การจดจำเสียงพูด
ในส่วนนี้ คุณจะได้ดูวิธีใช้การจดจําเสียงผ่านการตรวจจับและการจดจําคําที่ตรงตามเงื่อนไข คีย์เวิร์ดคือคำเรียกให้ดำเนินการที่ใช้เพื่อเริ่มการค้นหาหรือการดำเนินการใหม่ด้วยเสียง เช่น "Ok Google" หรือ "Hey Google"
การตรวจหาคําที่ทำให้เกิดการทำงานอัตโนมัติของ DSP
Android ให้สิทธิ์เข้าถึงเครื่องมือตรวจจับคำที่เปิดอยู่ตลอดเวลาที่ระดับ DSP ผ่าน AlwaysOnHotwordDetector
วิธีใช้การตรวจหาคำที่นิยมด้วย CPU ต่ำ การใช้งานฟังก์ชันนี้จะแบ่งออกเป็น 2 ส่วน ดังนี้
- การสร้างอินสแตนซ์ของ
AlwaysOnHotwordDetector
- การลงทะเบียนโมเดลเสียงสำหรับการตรวจจับคําที่มักใช้
การติดตั้งใช้งาน VoiceInteractionService สามารถสร้างตัวตรวจหาคําพูดที่กระตุ้นให้ดำเนินการได้โดยใช้ VoiceInteractionService#createAlwaysOnHotwordDetector()
โดยส่งวลีหลักและภาษาที่ต้องการใช้สำหรับการตรวจจับ ด้วยเหตุนี้ แอปจึงได้รับ onAvailabilityChanged()
callbacks ที่มีค่าที่เป็นไปได้ค่าใดค่าหนึ่งต่อไปนี้
STATE_HARDWARE_UNAVAILABLE
ความสามารถของ DSP ไม่พร้อมใช้งานในอุปกรณ์ ในกรณีนี้ ระบบจะใช้การตรวจหาคำที่นิยมของซอฟต์แวร์STATE_HARDWARE_UNSUPPORTED
โดยทั่วไปแล้วระบบไม่รองรับ DSP แต่ DSP ไม่รองรับคีย์เวิร์ดและภาษาที่รวมกัน แอปสามารถเลือกที่จะใช้การตรวจจับคำที่นิยมของซอฟต์แวร์STATE_HARDWARE_ENROLLED
การตรวจหาคําที่เลือกไว้พร้อมใช้งานแล้วและสามารถเริ่มต้นได้โดยเรียกใช้เมธอดstartRecognition()
STATE_HARDWARE_UNENROLLED
. โมเดลเสียงสำหรับวลีที่ขอไม่พร้อมใช้งาน แต่สามารถลงทะเบียนได้
ลงทะเบียนรูปแบบเสียงของการตรวจจับคําที่กระตุ้นให้ดำเนินการได้โดยใช้ IVoiceInteractionManagerService#updateKeyphraseSoundModel()
คุณสามารถลงทะเบียนหลายรุ่นในระบบได้ในเวลาเดียวกัน แต่จะมีเพียงรุ่นเดียวที่เชื่อมโยงกับ AlwaysOnHotwordDetector
การตรวจหาคําสั่งให้ดำเนินการ (DSP) อาจไม่พร้อมใช้งานในอุปกรณ์บางรุ่น นักพัฒนาแอป VIA ควรตรวจสอบความสามารถของฮาร์ดแวร์โดยใช้getDspModuleProperties()
วิธีนี้ ดูโค้ดตัวอย่างที่แสดงวิธีลงทะเบียนโมเดลเสียงได้ที่ VoiceEnrollment/src/com/android/test/voiceenrollment/EnrollmentUtil.java
ดูการบันทึกพร้อมกันเกี่ยวกับการจดจําคําสั่งให้ดําเนินการพร้อมกัน
การตรวจหาคําที่เปิดใช้งานซอฟต์แวร์
ตามที่ระบุไว้ข้างต้น การตรวจหาคําสั่งให้ดำเนินการ DSP อาจไม่พร้อมใช้งานในอุปกรณ์บางรุ่น (เช่น โปรแกรมจําลอง Android ไม่ได้ให้การจําลอง DSP) ในกรณีนี้ การจดจำเสียงด้วยซอฟต์แวร์เป็นทางเลือกเดียว VIA ต้องเข้าถึงอินพุตเสียงโดยใช้สิ่งต่อไปนี้เพื่อหลีกเลี่ยงการรบกวนแอปอื่นๆ ที่อาจต้องเข้าถึงไมโครโฟน
- การบันทึกเสียงต้องใช้ MediaRecorder.AudioSource.HOTWORD
- สิทธิ์การกันวงเงิน
android.Manifest.permission.CAPTURE_AUDIO_HOTWORD
ค่าคงที่ทั้ง 2 รายการนี้เป็น @hide
และใช้ได้กับแอปที่รวมกลุ่มเท่านั้น
จัดการอินพุตเสียงและการจดจำเสียง
ระบบจะใช้อินพุตเสียงโดยใช้คลาส MediaRecorder
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ API นี้ได้ที่ภาพรวมของ MediaRecorder นอกจากนี้ บริการโต้ตอบด้วยเสียงยังควรเป็นการใช้งานRecognitionService
ชั้นยอด แอปใดก็ตามในระบบที่ต้องใช้การจดจำเสียงจะใช้แพ็กเกจนี้เพื่อเข้าถึงความสามารถนี้ หากต้องการจดจําเสียงและเข้าถึงไมโครโฟน VIA ต้องกด android.permission.RECORD_AUDIO
แอปที่เข้าถึงการใช้งาน RecognitionService
ควรมีสิทธิ์นี้ด้วย
ก่อนที่จะมี Android 10 ระบบจะให้สิทธิ์เข้าถึงไมโครโฟนแก่แอปได้เพียงแอปเดียวในแต่ละครั้ง (ยกเว้นการตรวจหาคําสั่งให้ดำเนินการ ดูด้านบน) ตั้งแต่ Android 10 เป็นต้นไป คุณจะแชร์สิทธิ์เข้าถึงไมโครโฟนได้ ดูข้อมูลเพิ่มเติมได้ที่การแชร์ข้อมูล
เข้าถึงเอาต์พุตเสียง
เมื่อ VIA พร้อมที่จะให้คำตอบด้วยวาจา คุณควรทำตามหลักเกณฑ์ชุดถัดไปนี้
- เมื่อขอโฟกัสเสียงหรือจัดการเอาต์พุตเสียง แอปต้องใช้
AudioAttributes#USAGE_ASSISTANT
และAudioAttributes#CONTENT_TYPE_SPEECH
เป็นแอตทริบิวต์เสียง - ในระหว่างการจดจำคำพูด คุณต้องขอโฟกัสเสียงด้วย
AudioManage#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE
โปรดทราบว่าแอปสื่อบางแอปอาจไม่ตอบสนองต่อคําสั่งสื่ออย่างถูกต้อง (ดูการดําเนินการตามคําสั่งสื่อ) เมื่อนำโฟกัสเสียงออก