Để triển khai Ứng dụng tương tác bằng giọng nói (VIA), bạn cần hoàn thành các bước sau:
- Tạo một khung VIA.
- (không bắt buộc) Triển khai quy trình thiết lập/đăng nhập.
- (không bắt buộc) Triển khai màn hình Cài đặt.
- Khai báo các quyền bắt buộc trong tệp kê khai.
- Triển khai giao diện người dùng của thẻ thoại.
- Triển khai tính năng nhận dạng giọng nói (phải bao gồm cả việc triển khai API RecognitionService).
- Triển khai câu lệnh (không bắt buộc, bạn có thể triển khai API TextToSpeech).
- Triển khai phương thức thực hiện lệnh. Xem nội dung này trong phần Thực hiện lệnh.
Các phần sau đây mô tả cách hoàn thành từng bước được đề cập ở trên.
Tạo khung VIA
Tệp kê khai
Một ứng dụng được phát hiện là có tính năng Tương tác bằng giọng nói khi tệp kê khai có các thông tin sau:
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>
Trong ví dụ này:
- VIA phải hiển thị một dịch vụ mở rộng
VoiceInteractionService
, với bộ lọc ý định cho hành độngVoiceInteractionService.SERVICE_INTERFACE ("android.service.voice.VoiceInteractionService")
. - Dịch vụ này phải có quyền chữ ký hệ thống
BIND_VOICE_INTERACTION
. - Dịch vụ này phải bao gồm một tệp siêu dữ liệu
android.voice_interaction
để chứa những thông tin sau: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" />
Để biết thông tin chi tiết về từng trường, hãy xem R.styleable#VoiceInteractionService
.
Do tất cả VIA đều là dịch vụ nhận dạng giọng nói, nên bạn cũng phải đưa những thông tin sau vào tệp kê khai:
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>
Dịch vụ nhận dạng giọng nói cũng yêu cầu siêu dữ liệu sau:
res/xml/recognition_service.xml
<recognition-service xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="com.example.MyRecognizerSettingsActivity" />
VoiceInteractionService, VoiceInteractionSessionService và VoiceInteractionSession
Sơ đồ sau đây mô tả vòng đời của từng thực thể này:
Hình 1. Lifecycles
Như đã nêu trước đó, VoiceInteractionService
là điểm truy cập vào một VIA. Các trách nhiệm chính của dịch vụ này là:
- Khởi chạy mọi quy trình cần được chạy liên tục miễn là VIA này đang hoạt động. Ví dụ: phát hiện cụm từ kích hoạt.
- Báo cáo các thao tác bằng giọng nói được hỗ trợ (xem phần Nhấn để đọc của Trợ lý thoại).
- Chạy các phiên tương tác bằng giọng nói từ màn hình khoá (trình bảo vệ khoá).
Ở dạng đơn giản nhất, cách triển khai VoiceInteractionService sẽ có dạng như sau:
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; } ... }
Bạn cần triển khai VoiceInteractionService#onGetSupportedVoiceActions()
để xử lý tính năng Nhấn để đọc của Trợ lý thoại.
Hệ thống sử dụng VoiceInteractionSessionService để tạo và tương tác với VoiceInteractionSession. Lớp này chỉ có một trách nhiệm là bắt đầu các phiên mới khi được yêu cầu.
public class MyVoiceInteractionSessionService extends VoiceInteractionSessionService { @Override public VoiceInteractionSession onNewSession(Bundle args) { return new MyVoiceInteractionSession(this); } }
Cuối cùng, VoiceInteractionSession là nơi thực hiện hầu hết công việc. Một thực thể phiên có thể được sử dụng lại để hoàn tất nhiều lượt tương tác của người dùng. Trong AAOS, có một trình trợ giúp CarVoiceInteractionSession
giúp triển khai một số chức năng độc đáo dành cho ô tô.
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
có một tập hợp lớn các phương thức gọi lại được giải thích trong các phần sau. hãy xem tài liệu về VoiceInteractionSession
để biết danh sách đầy đủ.
Triển khai quy trình thiết lập/đăng nhập
Quá trình thiết lập và đăng nhập có thể diễn ra:
- Trong quá trình làm quen với thiết bị (Trình hướng dẫn thiết lập).
- Trong quá trình hoán đổi dịch vụ tương tác bằng giọng nói (Cài đặt).
- Trong lần chạy đầu tiên khi ứng dụng được chọn.
Để biết thông tin chi tiết về trải nghiệm người dùng được đề xuất và hướng dẫn trực quan, hãy xem bài viết Trợ lý được tải sẵn: Hướng dẫn về trải nghiệm người dùng.
Thiết lập trong quá trình hoán đổi dịch vụ thoại
Người dùng luôn có thể chọn một VIA chưa được định cấu hình đúng cách. Điều này có thể xảy ra vì:
- Người dùng đã bỏ qua hoàn toàn Trình hướng dẫn thiết lập hoặc bỏ qua bước định cấu hình tương tác bằng giọng nói.
- Người dùng đã chọn một VIA khác với VIA được định cấu hình trong quá trình thiết lập thiết bị.
Trong mọi trường hợp, VoiceInteractionService
có một số cách để khuyến khích người dùng hoàn tất quá trình thiết lập:
- Lời nhắc thông báo.
- Tự động trả lời bằng giọng nói khi người dùng cố gắng sử dụng tính năng này.
Lưu ý: Bạn không nên hiển thị quy trình thiết lập VIA nếu không có yêu cầu rõ ràng của người dùng. Điều này có nghĩa là các VIA phải tránh tự động hiển thị nội dung trên HU trong quá trình khởi động thiết bị hoặc do người dùng chuyển đổi hoặc mở khoá.
Thông báo nhắc nhở
Thông báo nhắc là một cách không gây phiền toái để cho biết cần thiết lập và cung cấp cho người dùng khả năng điều hướng vào quy trình thiết lập trợ lý.
Hình 2. Thông báo nhắc nhở
Quy trình này sẽ hoạt động như sau:
Hình 3. Quy trình nhắc nhở thông báo
Trả lời bằng giọng nói
Đây là quy trình đơn giản nhất để triển khai, bắt đầu một câu lệnh trên lệnh gọi lại VoiceInteractionSession#onShow()
, giải thích cho người dùng những việc cần làm, sau đó hỏi họ (nếu được phép thiết lập theo trạng thái Hạn chế trải nghiệm người dùng) xem họ có muốn bắt đầu quy trình thiết lập hay không. Nếu không thể thiết lập tại thời điểm đó, hãy giải thích trường hợp này.
Thiết lập trong lần đầu sử dụng
Người dùng luôn có thể kích hoạt một VIA chưa được định cấu hình đúng cách. Trong trường hợp như vậy:
- Thông báo cho người dùng về tình huống này bằng lời nói (ví dụ: "Để ứng dụng hoạt động đúng cách, bạn cần hoàn tất một vài bước … ").
- Nếu công cụ hạn chế trải nghiệm người dùng cho phép (xem UX_RESTRICTIONS_NO_SETUP), hãy hỏi người dùng xem họ có muốn bắt đầu quá trình thiết lập hay không, sau đó mở màn hình Cài đặt cho VIA.
- Nếu không (ví dụ: nếu người dùng đang lái xe), hãy để lại thông báo để người dùng nhấp vào lựa chọn đó khi thấy an toàn.
Tạo màn hình thiết lập tương tác bằng giọng nói
Bạn nên phát triển màn hình thiết lập và đăng nhập dưới dạng hoạt động thông thường. Xem các nguyên tắc về trải nghiệm người dùng và hình ảnh để phát triển giao diện người dùng trong phần Trợ lý được tải sẵn: Hướng dẫn về trải nghiệm người dùng.
Nguyên tắc chung:
- VIA phải cho phép người dùng tạm dừng và tiếp tục thiết lập bất cứ lúc nào.
- Không được phép thiết lập nếu quy định hạn chế
UX_RESTRICTIONS_NO_SETUP
đang có hiệu lực. Để biết thông tin chi tiết, hãy xem Nguyên tắc về việc làm mất tập trung của người lái xe. - Màn hình thiết lập phải khớp với hệ thống thiết kế của từng xe. Bố cục màn hình chung, biểu tượng, màu sắc và các khía cạnh khác phải nhất quán với phần còn lại của giao diện người dùng. Hãy xem phần Tuỳ chỉnh để biết thông tin chi tiết.
Triển khai màn hình cài đặt
Hình 4. Tích hợp phần cài đặt
Màn hình cài đặt là các hoạt động thông thường trên Android. Nếu được triển khai, điểm truy cập của chúng phải được khai báo trong res/xml/interaction_service.xml
như một phần của tệp kê khai VIA (xem Tệp kê khai).
Mục Cài đặt là nơi phù hợp để tiếp tục thiết lập và đăng nhập (nếu người dùng chưa hoàn tất) hoặc cung cấp tuỳ chọn đăng xuất hoặc chuyển đổi người dùng nếu cần. Tương tự như các màn hình Thiết lập được mô tả ở trên, các màn hình này phải:
- Cung cấp tuỳ chọn thoát về màn hình trước đó trong ngăn xếp màn hình (ví dụ: Cài đặt ô tô).
- Không được phép sử dụng khi đang lái xe. Để biết thông tin chi tiết, hãy xem Nguyên tắc về việc gây mất tập trung cho người lái xe.
- So khớp từng hệ thống thiết kế xe. Để biết thông tin chi tiết, hãy xem phần Tuỳ chỉnh.
Khai báo các quyền bắt buộc trong tệp kê khai
Các quyền mà VIA yêu cầu có thể được chia thành 3 danh mục:
- Quyền chữ ký hệ thống. Đây là những quyền chỉ được cấp cho các tệp APK được cài đặt sẵn và được hệ thống ký. Người dùng không thể cấp các quyền này, chỉ nhà sản xuất thiết bị gốc (OEM) mới có thể cấp các quyền đó khi tạo hình ảnh hệ thống. Để biết thêm thông tin về cách lấy quyền ký, hãy xem phần Cấp quyền đặc quyền của hệ thống.
- Quyền nguy hiểm. Đây là những quyền mà người dùng phải cấp bằng cách sử dụng hộp thoại PermissionsController. Nhà sản xuất thiết bị gốc (OEM) có thể cấp trước một số quyền này cho VoiceInteractionService mặc định. Tuy nhiên, do chế độ mặc định này có thể thay đổi tuỳ theo thiết bị, nên các ứng dụng có thể yêu cầu các quyền này khi cần.
- Các quyền khác. Đây là tất cả các quyền khác không yêu cầu người dùng can thiệp. Hệ thống sẽ tự động cấp các quyền này.
Do đó, phần sau đây chỉ tập trung vào việc yêu cầu các quyền nguy hiểm. Bạn chỉ nên yêu cầu quyền khi người dùng đang ở màn hình đăng nhập hoặc cài đặt.
Nếu ứng dụng không có các quyền cần thiết để hoạt động, thì quy trình được đề xuất là sử dụng câu lệnh thoại để giải thích tình huống cho người dùng và thông báo để cung cấp một tính năng mà người dùng có thể sử dụng để quay lại màn hình cài đặt VIA. Để biết thông tin chi tiết, hãy xem 1. Lời nhắc thông báo.
Yêu cầu quyền trong màn hình cài đặt
Các quyền có mức độ bảo vệ nguy hiểm được yêu cầu bằng phương thức ActivityCompat#requestPermission()
thông thường (hoặc tương đương). Để biết thông tin chi tiết về cách yêu cầu cấp quyền, hãy xem phần Yêu cầu cấp quyền cho ứng dụng.
Hình 5. Yêu cầu cấp quyền
Quyền của trình nghe thông báo
Để triển khai quy trình TTR, bạn phải chỉ định VIA làm trình nghe thông báo. Đây không phải là quyền, mà là một cấu hình cho phép hệ thống gửi thông báo đến trình nghe đã đăng ký. Để tìm hiểu xem VIA có được cấp quyền truy cập vào thông tin này hay không, ứng dụng có thể:
- (Không bắt buộc) Kiểm tra xem có trình nghe thông báo trước hay không bằng cách sử dụng
CarAssistUtils#assistantIsNotificationListener()
. Bạn có thể thực hiện việc này, ví dụ: trong quy trình thiết lập. - (Bắt buộc) Phản ứng với việc xử lý
CarVoiceInteractionSession#onShow()
bằng thao tácVOICE_ACTION_HANDLE_EXCEPTION
và ngoại lệEXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING
.
Nếu quyền truy cập này không được cấp trước, thì VIA sẽ chuyển hướng người dùng đến phần Quyền truy cập thông báo trong phần Cài đặt ô tô, bằng cách kết hợp các câu lệnh và thông báo. Bạn có thể sử dụng mã sau để mở phần thích hợp của ứng dụng cài đặt:
private void requestNotificationListenerAccess() { Intent intent = new Intent(Settings .ACTION_NOTIFICATION_LISTENER_SETTINGS); intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName()); startActivity(intent); }
Triển khai giao diện người dùng của thẻ thoại
Khi VoiceInteractionSession
nhận được lệnh gọi lại onShow()
, lớp này có thể hiển thị giao diện người dùng của thẻ thoại. Để biết nguyên tắc về hình ảnh và trải nghiệm người dùng khi triển khai thẻ thoại,hãy xem bài viết Trợ lý được tải sẵn: Hướng dẫn về trải nghiệm người dùng.
Hình 6. Hiển thị thẻ thoại
Có hai cách để triển khai giao diện người dùng này:
- Ghi đè
VoiceInteractionSession#onCreateContentView()
- Chạy một Hoạt động bằng
VoiceInteractionSession#startAssistantActivity()
Sử dụng onCreateContentView()
Đây là cách trình bày mặc định của thẻ thoại. Lớp cơ sở VoiceInteractionSession
tạo một cửa sổ và quản lý vòng đời của cửa sổ đó miễn là phiên thoại vẫn hoạt động. Ứng dụng phải ghi đè VoiceInteractionSession#onCreateContentView()
và trả về một thành phần hiển thị được đính kèm vào cửa sổ đó ngay khi phiên được tạo. Ban đầu, thành phần hiển thị này sẽ không hiển thị. Khi quá trình tương tác bằng giọng nói bắt đầu, khung hiển thị này sẽ hiển thị trên VoiceInteractionSession#onShow()
rồi ẩn trở lại trên 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); } … }
Khi sử dụng phương thức này, bạn nên điều chỉnh VoiceInteractionSession#onComputeInsets()
để tính đến các vùng bị che khuất trên giao diện người dùng.
Sử dụng startAssistantActivity()
Trong trường hợp này, VoiceInteractionSession
uỷ quyền xử lý giao diện người dùng biển báo bằng giọng nói cho một hoạt động thông thường. Khi sử dụng tuỳ chọn này, việc triển khai VoiceInteractionSession
phải tắt tính năng tạo cửa sổ nội dung mặc định (xem phần Sử dụng onCreateContentView()) trên lệnh gọi lại onPrepareShow()
. Tại VoiceInteractionSession#onShow()
, phiên sẽ bắt đầu hoạt động nhận dạng biển số bằng giọng nói bằng cách sử dụng VoiceInteractionSession#startAssistantActivity()
. Phương thức này khởi tạo giao diện người dùng bằng các chế độ cài đặt cửa sổ và cờ hoạt động thích hợp.
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); } … }
Để duy trì hoạt động liên lạc giữa hoạt động này và VoiceInteractionSession
, bạn có thể cần một tập hợp Ý định nội bộ hoặc liên kết dịch vụ. Ví dụ: khi VoiceInteractionSession#onHide()
được gọi, phiên phải có thể chuyển yêu cầu này đến hoạt động.
Lưu ý quan trọng. Trong Automotive, chỉ các hoạt động được chú thích đặc biệt hoặc các hoạt động có trong "danh sách cho phép" của UXR mới có thể hiển thị trong khi lái xe. Điều này cũng áp dụng cho các hoạt động bắt đầu bằng VoiceInteractionSession#startAssistantActivity()
. Hãy nhớ chú giải hoạt động bằng <meta-data
android:name="distractionOptimized" android:value="true"/>
hoặc đưa hoạt động này vào khoá systemActivityWhitelist
của tệp /packages/services/Car/service/res/values/config.xml
. Để biết thêm thông tin, hãy xem Nguyên tắc về việc làm mất tập trung của người lái xe.
Triển khai tính năng nhận dạng giọng nói
Trong phần này, bạn sẽ tìm hiểu cách triển khai tính năng nhận dạng giọng nói thông qua việc phát hiện và nhận dạng từ khoá kích hoạt. Từ kích hoạt là từ kích hoạt dùng để bắt đầu một truy vấn hoặc hành động mới bằng giọng nói. Ví dụ: "Ok Google" hoặc "Này Google".
Phát hiện cụm từ kích hoạt DSP
Android cung cấp quyền truy cập vào trình phát hiện cụm từ kích hoạt luôn bật ở cấp DSP thông qua AlwaysOnHotwordDetector
.
cách triển khai tính năng phát hiện cụm từ kích hoạt với CPU thấp. Việc sử dụng chức năng này được chia thành hai phần:
- Tạo bản sao của
AlwaysOnHotwordDetector
. - Đăng ký mô hình âm thanh phát hiện cụm từ kích hoạt.
Việc triển khai VoiceInteractionService có thể tạo trình phát hiện cụm từ kích hoạt bằng cách sử dụng VoiceInteractionService#createAlwaysOnHotwordDetector()
, truyền cụm từ khoá và ngôn ngữ mà họ muốn sử dụng để phát hiện. Do đó, ứng dụng sẽ nhận được lệnh gọi lại onAvailabilityChanged()
với một trong các giá trị có thể có sau:
STATE_HARDWARE_UNAVAILABLE
. Thiết bị không có chức năng DSP. Trong trường hợp này, tính năng Phát hiện cụm từ kích hoạt bằng phần mềm sẽ được sử dụng.STATE_HARDWARE_UNSUPPORTED
. Hỗ trợ DSP nói chung không có sẵn, nhưng DSP không hỗ trợ tổ hợp cụm từ khoá và ngôn ngữ nhất định. Ứng dụng có thể chọn sử dụng tính năng Phát hiện cụm từ kích hoạt bằng phần mềm.STATE_HARDWARE_ENROLLED
. Tính năng phát hiện cụm từ kích hoạt đã sẵn sàng và có thể bắt đầu bằng cách gọi phương thứcstartRecognition()
.STATE_HARDWARE_UNENROLLED
. Không có mô hình âm thanh cho cụm từ khoá được yêu cầu, nhưng bạn có thể đăng ký.
Bạn có thể đăng ký mô hình âm thanh phát hiện cụm từ kích hoạt bằng cách sử dụng IVoiceInteractionManagerService#updateKeyphraseSoundModel()
.
Có thể đăng ký nhiều mô hình trong hệ thống tại một thời điểm nhất định, nhưng chỉ có một mô hình được liên kết với AlwaysOnHotwordDetector
.
Tính năng phát hiện từ khoá bằng DSP có thể không hoạt động trên một số thiết bị. Nhà phát triển VIA nên kiểm tra các chức năng phần cứng bằng phương thức getDspModuleProperties()
. Để biết mã mẫu cho thấy cách đăng ký mô hình âm thanh, hãy xem VoiceEnrollment/src/com/android/test/voiceenrollment/EnrollmentUtil.java
.
Xem phần Ghi đồng thời liên quan đến việc nhận dạng cụm từ kích hoạt đồng thời.
Phát hiện cụm từ kích hoạt bằng phần mềm
Như đã chỉ ra ở trên, tính năng phát hiện cụm từ kích hoạt DSP có thể không có trên một số thiết bị (ví dụ: trình mô phỏng Android không cung cấp tính năng mô phỏng DSP). Trong trường hợp này, nhận dạng giọng nói bằng phần mềm là phương án thay thế duy nhất. Để tránh can thiệp vào các ứng dụng khác có thể cần quyền truy cập vào micrô, VIA phải truy cập vào đầu vào âm thanh bằng cách sử dụng:
- Tính năng ghi âm phải sử dụng MediaRecorder.AudioSource.HOTWORD.
- Giữ quyền
android.Manifest.permission.CAPTURE_AUDIO_HOTWORD
.
Cả hai hằng số này đều là @hide
và chỉ dành cho các ứng dụng đi kèm.
Quản lý tính năng nhận dạng giọng nói và đầu vào âm thanh
Phương thức nhập âm thanh sẽ được triển khai bằng lớp MediaRecorder.
Để biết thêm thông tin về cách sử dụng API này, hãy xem phần Tổng quan về MediaRecorder. Các dịch vụ tương tác bằng giọng nói cũng dự kiến sẽ là các hoạt động triển khai lớp RecognitionService
. Mọi ứng dụng trong hệ thống cần đến tính năng nhận dạng giọng nói đều sử dụng API này để truy cập vào tính năng này. Để nhận dạng giọng nói và có quyền truy cập vào micrô, VIA phải giữ android.permission.RECORD_AUDIO
.
Các ứng dụng truy cập vào quá trình triển khai RecognitionService
cũng sẽ có quyền này.
Trước Android 10, mỗi lần chỉ có một ứng dụng được cấp quyền truy cập vào micrô (ngoại trừ tính năng phát hiện cụm từ kích hoạt, xem ở trên). Kể từ Android 10, bạn có thể chia sẻ quyền truy cập vào micrô. Để biết thêm thông tin, hãy xem phần Chia sẻ đầu vào âm thanh.
Truy cập vào đầu ra âm thanh
Khi VIA đã sẵn sàng đưa ra câu trả lời bằng lời nói, bạn cần làm theo bộ nguyên tắc tiếp theo sau đây:
- Khi yêu cầu quyền phát âm thanh hoặc quản lý đầu ra âm thanh, ứng dụng phải sử dụng
AudioAttributes#USAGE_ASSISTANT
vàAudioAttributes#CONTENT_TYPE_SPEECH
làm thuộc tính âm thanh. - Trong quá trình nhận dạng lời nói, bạn phải yêu cầu quyền phát âm thanh bằng
AudioManage#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE
. Xin lưu ý rằng một số ứng dụng đa phương tiện có thể không phản ứng đúng cách với các lệnh đa phương tiện (xem phần Thực hiện lệnh đa phương tiện) khi tiêu điểm âm thanh của ứng dụng bị xoá.