ในการใช้งานแอปพลิเคชันการโต้ตอบด้วยเสียง (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 นี้เป็นบัตรที่ใช้งานอยู่ เช่น การตรวจหาคำสั่งให้ดำเนินการ
- รายงานการสั่งงานด้วยเสียงที่รองรับ (ดูการแตะเพื่ออ่านด้วย Assistant)
- เปิดเซสชันการโต้ตอบด้วยเสียงจากหน้าจอล็อก (คีย์การ์ด)
ในรูปแบบที่ง่ายที่สุด การใช้งาน 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()
ไปใช้งานคือ
ที่จำเป็นต่อการจัดการ
แตะเพื่ออ่านของ Voice Assistant
ระบบจะใช้ VoiceInteractionSessionService เพื่อสร้างและ
โต้ตอบกับ VoiceInteractionSession เพราะมีหน้าที่เพียง 1 อย่าง
เพื่อเริ่มเซสชันใหม่เมื่อได้รับคำขอ
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
มีเมธอด Callback จำนวนมากที่
ดังที่อธิบายในส่วนต่อไปนี้ ดูรายการทั้งหมดในเอกสารสำหรับ VoiceInteractionSession
ใช้ขั้นตอนการตั้งค่า/การลงชื่อเข้าใช้
อาจมีการตั้งค่าและการลงชื่อเข้าใช้ในกรณีต่อไปนี้
- ในระหว่างการเริ่มต้นใช้งานอุปกรณ์ (วิซาร์ดการตั้งค่า)
- ระหว่างการสลับบริการโต้ตอบด้วยเสียง (การตั้งค่า)
- เมื่อเปิดใช้งานครั้งแรกเมื่อเลือกแอปไว้
สำหรับรายละเอียดเกี่ยวกับประสบการณ์ของผู้ใช้ที่แนะนำและคำแนะนำผ่านภาพ โปรดดูที่ ผู้ช่วยที่โหลดไว้ล่วงหน้า: คำแนะนำสำหรับ UX
ตั้งค่าระหว่างการสลับบริการเสียง
ผู้ใช้อาจเลือก VIA อย่างไม่เหมาะสมได้เสมอ กำหนดค่าแล้ว ซึ่งอาจเกิดขึ้นเนื่องจากสาเหตุต่อไปนี้
- ผู้ใช้ข้ามวิซาร์ดการตั้งค่าทั้งหมดหรือผู้ใช้ข้ามเสียง ขั้นตอนการกำหนดค่าการโต้ตอบ
- ผู้ใช้เลือก VIA คนละรายการกับที่กําหนดค่าระหว่างใช้อุปกรณ์ การเริ่มต้นใช้งาน
ไม่ว่าในกรณีใดก็ตาม VoiceInteractionService
จะมีวิธีกระตุ้นผู้ใช้ได้หลายวิธี
เพื่อตั้งค่าให้เสร็จสมบูรณ์:
- การช่วยเตือน
- ตอบกลับด้วยเสียงอัตโนมัติเมื่อผู้ใช้พยายามใช้งาน
หมายเหตุ: เราไม่แนะนำให้แสดงขั้นตอนการตั้งค่า VIA โดยไม่มีคำขอที่ชัดแจ้งจากผู้ใช้ ซึ่งหมายความว่า VIA ควรหลีกเลี่ยงโดยอัตโนมัติ การแสดงเนื้อหาบน HU ระหว่างการบูตอุปกรณ์หรือจากการที่ผู้ใช้เปลี่ยน หรือ ปลดล็อก
การช่วยเตือน
การแจ้งเตือนคือวิธีระบุความจำเป็นต้องตั้งค่าโดยไม่รบกวน และเพื่ออำนวยความสะดวกแก่ผู้ใช้ในการเข้าสู่การตั้งค่า Assistant
รูปที่ 2 การช่วยเตือน
วิธีการทำงานมีดังนี้
รูปที่ 3 ขั้นตอนการช่วยเตือน
ตอบกลับด้วยเสียง
นี่คือขั้นตอนที่ง่ายที่สุดในการนำไปใช้ โดยเป็นการเริ่มพูดเกี่ยวกับ
Callback ของ VoiceInteractionSession#onShow()
ซึ่งอธิบายให้ผู้ใช้ทราบว่า
ต้องทำจากนั้นขอให้ตั้งค่า (หากการตั้งค่าได้รับอนุญาต จะระบุสถานะข้อจำกัด UX)
ถ้าต้องการเริ่มขั้นตอนการตั้งค่า หากตั้งค่าไม่ได้ โปรดอธิบายข้อมูลนี้
ของคุณได้เช่นกัน
ตั้งค่าเมื่อใช้ครั้งแรก
ผู้ใช้อาจทริกเกอร์ VIA อย่างไม่เหมาะสมได้เสมอ กำหนดค่าแล้ว ในกรณีเช่นนี้
- แจ้งให้ผู้ใช้ทราบด้วยวาจาเกี่ยวกับสถานการณ์นี้ (เช่น "เพื่อให้ทำงานได้อย่างถูกต้อง เราต้องการให้คุณดำเนินการ 2-3 ขั้นตอน ... ")
- หากเครื่องมือการจำกัด UX อนุญาต (ดู UX_RESTricTIONS_NO_SETUP) ให้ถามผู้ใช้ว่าต้องการเริ่ม ขั้นตอนการตั้งค่า จากนั้นเปิดหน้าจอการตั้งค่าสำหรับ VIA
- หรือไม่เช่นนั้น (เช่น หากผู้ใช้กำลังขับรถ) ก็ฝากการแจ้งเตือนไว้ให้ผู้ใช้ ให้คลิกตัวเลือกเมื่อทำได้อย่างปลอดภัยแล้ว
สร้างหน้าจอตั้งค่าการโต้ตอบด้วยเสียง
หน้าจอการตั้งค่าและการลงชื่อเข้าใช้ควรพัฒนาเป็นกิจกรรมปกติ โปรดดู หลักเกณฑ์ UX และภาพสำหรับการพัฒนา UI ใน ผู้ช่วยที่โหลดไว้ล่วงหน้า: คำแนะนำสำหรับ UX
หลักเกณฑ์ทั่วไป
- VIA ควรให้ผู้ใช้รบกวนและกลับมาตั้งค่าต่อได้ทุกเมื่อ
- คุณไม่ควรอนุญาตให้ตั้งค่าหากการจำกัด
UX_RESTRICTIONS_NO_SETUP
มีผลบังคับใช้ โปรดดูรายละเอียดที่หัวข้อ หลักเกณฑ์เกี่ยวกับการรบกวนผู้ขับขี่ - หน้าจอการตั้งค่าควรตรงกับระบบการออกแบบของรถยนต์แต่ละคัน หน้าจอทั่วไป การจัดวาง ไอคอน สี และลักษณะอื่นๆ ควรสอดคล้องกับส่วนที่เหลือของ UI โปรดดู การปรับแต่ง เพื่อดูรายละเอียด
ใช้หน้าจอการตั้งค่า
รูปที่ 4 การผสานรวมการตั้งค่า
หน้าจอการตั้งค่าเป็นกิจกรรมตามปกติของ Android หากติดตั้งใช้งาน จุดแรกเข้า
ต้องได้รับการประกาศใน res/xml/interaction_service.xml
โดยเป็นส่วนหนึ่งของ VIA
ไฟล์ Manifest (โปรดดู
ไฟล์ Manifest)
ส่วนการตั้งค่าเป็นส่วนที่ดีในการตั้งค่าและลงชื่อเข้าใช้ต่อ (หากผู้ใช้ดำเนินการไม่เสร็จสิ้น
) หรือเสนอตัวเลือกออกจากระบบหรือเปลี่ยนผู้ใช้หากจำเป็น คล้ายกับการตั้งค่า
หน้าจอตามที่อธิบายข้างต้น หน้าจอเหล่านี้ควร
- ให้ตัวเลือกในการออกกลับไปยังหน้าจอก่อนหน้าในกลุ่มหน้าจอ (เช่น การตั้งค่ารถยนต์)
- ไม่อนุญาตขณะขับรถ โปรดดูรายละเอียดที่หัวข้อหลักเกณฑ์เกี่ยวกับการรบกวนผู้ขับขี่
- จับคู่ระบบการออกแบบยานพาหนะแต่ละระบบ โปรดดูรายละเอียดที่หัวข้อ การปรับแต่ง
ประกาศสิทธิ์ที่จำเป็นในไฟล์ Manifest
สิทธิ์ที่ VIA ต้องมีจะแบ่งออกเป็น 3 หมวดหมู่ ดังนี้
- สิทธิ์ลายเซ็นของระบบ นี่คือสิทธิ์ ให้สิทธิ์สำหรับ APK ที่ติดตั้งล่วงหน้าและลงชื่อโดยระบบเท่านั้น ผู้ใช้ให้สิทธิ์ไม่ได้ สิทธิ์เหล่านี้มีเพียง OEM เท่านั้นที่ให้สิทธิ์ได้ขณะสร้างอิมเมจระบบ โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับการรับสิทธิ์ลายเซ็นที่หัวข้อให้สิทธิ์ที่เป็นสิทธิ์ของระบบ
- สิทธิ์ที่อันตราย นี่คือสิทธิ์ที่ผู้ใช้ต้องมี ให้สิทธิ์โดยใช้กล่องโต้ตอบ PermissionsController OEM สามารถให้สิทธิ์ บางส่วนเหล่านี้ล่วงหน้า สิทธิ์สำหรับ VoiceInteractionService เริ่มต้น แต่เนื่องจากค่าเริ่มต้นนี้ อาจเปลี่ยนตามอุปกรณ์ แอปควรจะสามารถส่งคำขอ เมื่อจำเป็น
- สิทธิ์อื่นๆ นี่คือสิทธิ์อื่นๆ ทั้งหมดที่ ผู้ใช้ไม่ต้องดำเนินการใดๆ ได้รับสิทธิ์เหล่านี้โดยอัตโนมัติ จากระบบ
จากที่กล่าวมาข้างต้น ส่วนต่อไปนี้จะมุ่งเน้นเฉพาะการขอ สิทธิ์ที่เป็นอันตราย ควรขอสิทธิ์เฉพาะเมื่อผู้ใช้ ในหน้าจอลงชื่อเข้าใช้หรือการตั้งค่า
หากแอปไม่มีสิทธิ์ที่จำเป็นในการทำงาน ขั้นตอนที่แนะนำคือให้ใช้เสียงพูดเพื่ออธิบายสถานการณ์ให้ และการแจ้งเตือนเพื่อให้ค่าตอบแทนที่ผู้ใช้สามารถใช้เพื่อ ให้กลับไปที่หน้าจอการตั้งค่า VIA โปรดดูรายละเอียดที่หัวข้อ 1. การช่วยเตือน
ขอสิทธิ์ที่เป็นส่วนหนึ่งของหน้าจอการตั้งค่า
มีการขอสิทธิ์ที่เป็นอันตรายโดยใช้เมธอด ActivityCompat#requestPermission()
ปกติ (หรือเทียบเท่า) ดูรายละเอียดเกี่ยวกับวิธีขอสิทธิ์ได้ที่
ขอสิทธิ์ของแอป
รูปที่ 5 ขอสิทธิ์
สิทธิ์ตัวฟังการแจ้งเตือน
ในการใช้ขั้นตอน TTR ต้องได้รับการแต่งตั้ง VIA เป็น ตัวฟังการแจ้งเตือน นี่ไม่ใช่สิทธิ์ตามแต่ละสิทธิ์ แต่เป็น ที่ช่วยให้ระบบส่งการแจ้งเตือนไปยัง Listener ของคุณ หากต้องการทราบว่า VIA ได้รับสิทธิ์ในการเข้าถึงข้อมูลนี้หรือไม่ แอปสามารถ:
- (ไม่บังคับ) ตรวจสอบว่ามี Listener การแจ้งเตือนล่วงหน้าหรือไม่โดยใช้
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()
ก็สามารถแสดง 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 ด้วยการตั้งค่าหน้าต่างและแฟล็กกิจกรรมที่เหมาะสม
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" หรือ "Ok Google"
การตรวจจับคำสั่งให้ดำเนินการ DSP
Android ให้สิทธิ์เข้าถึงเครื่องมือตรวจจับคำสั่งให้ดำเนินการเปิดใช้อยู่เสมอที่ระดับ DSP โดย
ของAlwaysOnHotwordDetector
วิธีใช้การตรวจหาคำสั่งให้ดำเนินการที่มี CPU ต่ำ การใช้งานฟังก์ชันนี้คือ
แบ่งออกเป็น 2 ส่วน ดังนี้
- การสร้าง
AlwaysOnHotwordDetector
ให้เป็นอินสแตนซ์ - การลงทะเบียนรูปแบบเสียงการตรวจจับคำสั่งให้ดำเนินการ
การใช้งาน VoiceInteractionService สามารถสร้างตัวตรวจจับคำสั่งให้ดำเนินการได้โดยใช้
VoiceInteractionService#createAlwaysOnHotwordDetector()
,
ผ่านวลีคีย์เวิร์ดและภาษาที่ต้องการใช้ในการตรวจจับ ด้วยเหตุนี้ ฟิลด์
แอปจะได้รับ onAvailabilityChanged()
Callback ที่มีค่าที่เป็นไปได้ค่าใดค่าหนึ่งต่อไปนี้
STATE_HARDWARE_UNAVAILABLE
ความสามารถของ DSP ไม่พร้อมใช้งานบน อุปกรณ์ ในกรณีนี้จะใช้การตรวจหาคำสั่งให้ดำเนินการของซอฟต์แวร์STATE_HARDWARE_UNSUPPORTED
ไม่มีการสนับสนุน DSP โดยทั่วไป แต่ DSP ไม่รองรับการใช้วลีคีย์เวิร์ดและภาษาร่วมกันที่กำหนด แอปสามารถเลือกใช้ การตรวจหาคำสั่งให้ดำเนินการของซอฟต์แวร์STATE_HARDWARE_ENROLLED
การตรวจหาคำที่นิยมพร้อมใช้งานและสามารถเริ่มต้นได้โดย ซึ่งเรียกใช้เมธอดstartRecognition()
STATE_HARDWARE_UNENROLLED
รูปแบบเสียงสำหรับวลีคีย์เวิร์ดที่ขอไม่ใช่ พร้อมใช้งาน แต่ยังสามารถลงทะเบียนได้
ลงทะเบียนโมเดลเสียงการตรวจจับคำสั่งให้ดำเนินการได้โดยใช้ IVoiceInteractionManagerService#updateKeyphraseSoundModel()
สามารถลงทะเบียนโมเดลได้หลายโมเดลในระบบในช่วงเวลาหนึ่งๆ แต่จะมีได้เพียงโมเดลเดียวเท่านั้น
โมเดลเชื่อมโยงกับ AlwaysOnHotwordDetector
การตรวจหาคำสั่งให้ดำเนินการใน DSP อาจไม่พร้อมใช้งานในบางอุปกรณ์ ผ่านนักพัฒนาซอฟต์แวร์
ควรตรวจสอบความสามารถของฮาร์ดแวร์โดยใช้ 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
โปรดทราบว่าแอปสื่อบางแอปอาจตอบสนองคำสั่งสื่อไม่ถูกต้อง (ดู Fulfilling Media Commands) ขณะที่เสียง โฟกัสถูกนำออก