การป้อนข้อมูลด้วยเสียงช่วยให้คุณสร้างอินเทอร์เฟซแบบแฮนด์ฟรีได้อย่างแท้จริง กระจก ทำให้คุณสามารถใช้การป้อนข้อมูลด้วยเสียงได้ 3 วิธี
คำสั่งเสียงหลักจะเริ่มต้น Glassware จากการ์ด Home ซึ่งเป็นเสียงตามบริบท สามารถดำเนินการต่างๆ ภายในกิจกรรมได้ และเสียงพูดของระบบ กิจกรรมการจดจำเสียงช่วยให้คุณได้รับการป้อนข้อมูลด้วยเสียงในรูปแบบอิสระจากผู้ใช้
คำสั่งเสียงหลัก
คำสั่งเสียงเหล่านี้จะเปิด Glassware จากการ์ด Home (การ์ดนาฬิกา) เมื่อคุณ ประกาศคำสั่งเสียงหลัก Glass สร้างรายการเมนูการแตะโดยอัตโนมัติ เป็นทางเลือกสำรองหากผู้ใช้ตัดสินใจเริ่มใช้งาน Glassware ด้วยการแตะที่ การ์ดหน้าแรก
วิธีเพิ่มคำสั่งเสียงลงในเมนูหลักของ ok Glass
สร้างทรัพยากร XML สำหรับคำสั่งเสียงใน
res/xml/<my_voice_trigger>.xml
ที่ใช้คำสั่งเสียงรายการใดรายการหนึ่งที่มีอยู่ กำหนดไว้ในVoiceTriggers.Command
เช่น วิธีใช้ "เริ่มรัน" มีดังนี้<?xml version="1.0" encoding="utf-8"?> <trigger command="START_A_RUN" />
เพื่อสร้างคำสั่งเสียงที่แจ้งให้ผู้ใช้พูดภาษาเพิ่มเติม วลีก่อนเริ่มกิจกรรมหรือบริการ ให้ใส่
input
ของ Google ได้ ตัวอย่างเช่น คุณอาจต้องการทำเช่นนี้หากคุณ โดยใช้ตัวเลือก "โพสต์อัปเดต"<?xml version="1.0" encoding="utf-8"?> <trigger command="POST_AN_UPDATE"> <input prompt="@string/glass_voice_prompt" /> </trigger>
ลงทะเบียนตัวกรอง Intent โดยใช้
com.google.android.glass.action.VOICE_TRIGGER
การดำเนินการใน ไฟล์ Manifest ของ Android ตัวกรอง Intent จะเริ่มกิจกรรมหรือบริการ หากตรวจพบว่าผู้ใช้พูดคำสั่งเสียง<?xml version="1.0" encoding="utf-8"?> <application ...> <activity | service ...> <intent-filter> <action android:name= "com.google.android.glass.action.VOICE_TRIGGER" /> </intent-filter> <meta-data android:name="com.google.android.glass.VoiceTrigger" android:resource="@xml/my_voice_trigger" /> </activity | service> // ... </application>
ประกาศแอตทริบิวต์
android:icon
สำหรับกิจกรรมหรือบริการ วิธีนี้ช่วยให้ Glass แสดงไอคอนสำหรับ Glassware ของคุณใน ตกลง กระจกแตะเมนู<activity |service android:icon="@drawable/my_icon" ...> ... </activity | service>
หากคำสั่งเสียงใช้พรอมต์ด้วยเสียงและเริ่มกิจกรรม ให้ ข้อความที่ถอดเสียงใดๆ ซึ่งมีรหัสต่อไปนี้ (เช่น
onResume()
)ArrayList<String> voiceResults = getIntent().getExtras() .getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
หากคำสั่งเสียงเริ่มต้นบริการ Intent เพิ่มเติมจะอยู่ใน Callback
onStartCommand()
:@Override public int onStartCommand(Intent intent, int flags, int startId) { ArrayList<String> voiceResults = intent.getExtras() .getStringArrayList(RecognizerIntent.EXTRA_RESULTS); // ... }
การตั้งค่าข้อจำกัด
หากต้องการฟีเจอร์อย่างใดอย่างหนึ่งต่อไปนี้เพื่อเริ่มการทำงานของ Glassware
ให้ระบุในทรัพยากร res/xml/<my_voice_trigger>.xml
หากใช้ฟีเจอร์ดังกล่าวไม่ได้ Glass จะปิดใช้คำสั่งเสียงดังนี้
camera
network
microphone
<trigger command="POST_AN_UPDATE"> <constraints camera="true" network="true" /> </trigger>
คำสั่งเสียงตามบริบท
คำสั่งเสียงตามบริบทจะช่วยให้ผู้ใช้ดำเนินการจากกิจกรรมต่างๆ ได้ คุณสร้างคำสั่งเสียงตามบริบทด้วย API เมนู Android มาตรฐาน แต่ ผู้ใช้เรียกใช้รายการในเมนูด้วยคำสั่งเสียงแทนการแตะได้
วิธีเปิดใช้คำสั่งเสียงตามบริบทสำหรับกิจกรรมบางอย่าง
โทร
getWindow().requestFeature(
WindowUtils.FEATURE_VOICE_COMMANDS
)
ในกิจกรรมที่ต้องการเพื่อเปิดใช้คำสั่งเสียงตามบริบท เมื่อมีฟีเจอร์นี้ เปิดใช้เมนู "ok Glass" อยู่บริเวณส่วนท้ายของหน้าจอ เมื่อใดก็ตามที่กิจกรรมนี้มีสมาธิลบล้าง
onCreatePanelMenu()
และจัดการกรณีที่WindowUtils.FEATURE_VOICE_COMMANDS
ไว้ หากเปิดใช้ คุณจะเห็นการตั้งค่าเมนูแบบครั้งเดียว เช่น การขยายขนาดเมนูดังกล่าว ทรัพยากรของเมนูหรือการเรียกใช้Menu.add()
วิธีสร้างระบบเมนูเสียงของคุณลบล้าง
onMenuItemSelected()
เพื่อรองรับคำสั่งเสียงเมื่อผู้ใช้พูด เมื่อผู้ใช้ดำเนินการเสร็จแล้ว เลือกรายการในเมนู ระบบจะใช้คำสั่งเสียง "Ok Glass" โดยอัตโนมัติ ปรากฏขึ้นอีกครั้งในส่วนส่วนท้ายของหน้าจอ พร้อมยอมรับเสียงใหม่ ตราบใดที่กิจกรรมยังโฟกัสอยู่โค้ดต่อไปนี้เปิดใช้คำสั่งเสียงตามบริบท ทำให้ทรัพยากรเมนูสูงเกินจริง ตามความเหมาะสม และจัดการคำสั่งเสียงเมื่อมีการพูด
public class ContextualMenuActivity extends Activity { @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); // Requests a voice menu on this activity. As for any other // window feature, be sure to request this before // setContentView() is called getWindow().requestFeature(WindowUtils.FEATURE_VOICE_COMMANDS); setContentView(R.layout.activity_main); } @Override public boolean onCreatePanelMenu(int featureId, Menu menu) { if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) { getMenuInflater().inflate(R.menu.main, menu); return true; } // Pass through to super to setup touch menu. return super.onCreatePanelMenu(featureId, menu); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) { switch (item.getItemId()) { case R.id.dogs_menu_item: // handle top-level dogs menu item break; case R.id.cats_menu_item: // handle top-level cats menu item break; case R.id.lab_menu_item: // handle second-level labrador menu item break; case R.id.golden_menu_item: // handle second-level golden menu item break; case R.id.calico_menu_item: // handle second-level calico menu item break; case R.id.cheshire_menu_item: // handle second-level cheshire menu item break; default: return true; } return true; } // Good practice to pass through to super if not handled return super.onMenuItemSelected(featureId, item); } }
นี่คือตัวอย่างของทรัพยากรเมนูที่กิจกรรมก่อนหน้าใช้ สังเกตวิธีสร้างรายการเมนูแบบซ้อนสำหรับเสียงแบบลำดับชั้น ระบบเมนู ในตัวอย่างต่อไปนี้ รายการแรกในเมนูสามารถ เข้าถึงได้เป็น ok Glass, Show me dogs, Labrador
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Use the constants defined in the ContextualMenus.Command enum--> <item android:id="@+id/dogs_menu_item" android:title="@string/show_me_dogs"> <menu> <item android:id="@+id/lab_menu_item" android:title="@string/labrador" /> <item android:id="@+id/golden_menu_item" android:title="@string/golden" /> </menu> </item> <item android:id="@+id/cats_menu_item" android:title="@string/show_me_cats"> <menu> <item android:id="@+id/cheshire_menu_item" android:title="@string/cheshire" /> <item android:id="@+id/calico_menu_item" android:title="@string/calico" /> </menu> </item> </menu>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Use the constants defined in the ContextualMenus.Command enum--> <item android:id="@+id/play_menu_item" android:title="PLAY_MUSIC" /> <item android:id="@+id/pause_menu_item" android:title="PAUSE_MUSIC" /> </menu>
(ไม่บังคับ) ลบล้าง
onPreparePanel()
กำลังตรวจสอบว่าWindowUtils.FEATURE_VOICE_COMMANDS
เปิดใช้อยู่ หากเปิดใช้ คุณจะใช้ตรรกะอื่นๆ เพื่อตั้งค่าระบบเมนูได้ เช่น การเพิ่มและนำรายการในเมนูบางรายการออกตามเกณฑ์บางอย่าง คุณสามารถ สลับเมนูเสียงตามบริบทเป็นเปิด (กลับtrue
) และปิดด้วย (แสดงผลfalse
) ตามเกณฑ์บางอย่าง เช่นprivate boolean mVoiceMenuEnabled; ... @Override public boolean onPreparePanel(int featureId, View view, Menu menu) { if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) { // toggle this boolean on and off based on some criteria return mVoiceMenuEnabled; } // Good practice to call through to super for other cases return super.onPreparePanel(featureId, view, menu); }
รองรับเสียงและเมนูการแตะพร้อมกัน
เนื่องจากคำสั่งเสียงตามบริบทจะใช้ API เมนู Android ที่มีอยู่ คุณสามารถใช้โค้ดและทรัพยากรจำนวนมากที่มีอยู่แล้วสำหรับเมนูสัมผัส และรองรับเมนูทั้ง 2 ประเภทในเวลาเดียวกัน
เพียงแค่ตรวจหาฟีเจอร์Window.FEATURE_OPTIONS_PANEL
นอกเหนือจากฟีเจอร์ WindowUtils.FEATURE_VOICE_COMMANDS
ที่คุณ
กำลังตรวจสอบด้วยวิธีการต่างๆ แล้วเพิ่มตรรกะเพื่อเปิดการแตะ
เมนูในการดําเนินการบางอย่างของผู้ใช้ เช่น การแตะ
เช่น คุณอาจเปลี่ยนกิจกรรมก่อนหน้า ตัวอย่างเพื่อเพิ่มการสนับสนุนสำหรับเมนูการแตะแบบนี้ (มีการแสดงความคิดเห็นการเปลี่ยนแปลง):
// 1. Check for Window.FEATURE_OPTIONS_PANEL
// to inflate the same menu resource for touch menus.
@Override
public boolean onCreatePanelMenu(int featureId, Menu menu) {
if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS ||
featureId == Window.FEATURE_OPTIONS_PANEL) {
...
}
// 2. Check for Window.FEATURE_OPTIONS_PANEL
// to handle touch menu item selections.
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS ||
featureId == Window.FEATURE_OPTIONS_PANEL) {
...
}
สำหรับการเปลี่ยนแปลงเหล่านี้ คุณสามารถแตะหรือพูดว่า Ok Glass เพื่อแสดง เมนู
การใช้คำสั่งเสียงที่ไม่เป็นสาธารณะเพื่อการพัฒนา
เมื่อต้องการแจกจ่ายเครื่องแก้ว คุณต้องใช้
คำสั่งเสียงใน
VoiceTriggers.Command
และอนุมัติคำสั่งเสียงตามบริบทแล้ว
ContextualMenus.Command
หากคุณต้องการใช้คำสั่งเสียงที่ไม่มีใน GDK
คุณขอสิทธิ์ Android ในไฟล์ AndroidManifest.xml
ได้
<uses-permission
android:name="com.google.android.glass.permission.DEVELOPMENT" />
การใช้คำสั่งเสียงหลักที่ไม่เป็นสาธารณะ
ประกาศค่าสตริงใน
res/values/strings.xml
ที่กำหนด ชื่อทริกเกอร์เสียงของคุณ เลือกประกาศพรอมต์เสียง (ไม่บังคับ) เพื่อแสดง Glassware การจดจำคำพูดก่อนเริ่ม Glassware ของคุณ<?xml version="1.0" encoding="utf-8"?> <resources> <string name="glass_voice_trigger">read me a story</string> <string name="glass_voice_prompt">what story?</string> </resources>
สร้างทรัพยากร XML สำหรับทริกเกอร์เสียงใน
res/xml/<my_voice_trigger>.xml
สำหรับคำสั่งเสียงที่ไม่เป็นสาธารณะ คุณควรใช้ แอตทริบิวต์keyword
แทนแอตทริบิวต์command
ที่ใช้สำหรับอนุมัติ คำสั่งเสียง แอตทริบิวต์keyword
ควรเป็นการอ้างอิงไปยังสตริง ที่กำหนดคำสั่งเสียง สำหรับทริกเกอร์เสียงง่ายๆ ที่เริ่มต้น กิจกรรมหรือบริการได้ทันที เพียงระบุเอลิเมนต์trigger
:<?xml version="1.0" encoding="utf-8"?> <trigger keyword="@string/glass_voice_trigger" />
เพื่อสร้างทริกเกอร์เสียงที่แจ้งให้ผู้ใช้พูดเพิ่ม วลีก่อนเริ่มกิจกรรมหรือบริการ ให้ใส่องค์ประกอบอินพุต รวมทั้ง
<?xml version="1.0" encoding="utf-8"?> <trigger keyword="@string/glass_voice_trigger"> <input prompt="@string/glass_voice_prompt" /> </trigger>
การใช้คำสั่งเสียงตามบริบทที่ไม่เป็นสาธารณะ
เมื่อสร้างรายการในเมนู ให้ใช้ข้อความใดก็ได้เป็นชื่อรายการเมนู เช่น
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Use the constants defined in the ContextualMenus.Command enum-->
<item
android:id="@+id/pizza_menu_item"
android:title="@string/find_pizza" />
</menu>
กำลังเริ่มต้นการจดจำคำพูด
กลาสแวร์การรู้จำคำพูดกำลังรอให้ผู้ใช้พูดและส่งคืน ข้อความที่ถอดเสียงหลังจากที่ทำเสร็จแล้ว วิธีเริ่มกิจกรรม
- โทร
startActivityForResult()
ด้วย IntentACTION_RECOGNIZE_SPEECH
ระบบรองรับ Intent เพิ่มเติมต่อไปนี้เมื่อเริ่มต้นกิจกรรม ลบล้าง
onActivityResult()
Callback เพื่อรับข้อความที่ถอดเสียงจากEXTRA_RESULTS
Intent เพิ่มเติม ระบบจะเรียกใช้ Callback นี้เมื่อผู้ใช้พูดเสร็จprivate static final int SPEECH_REQUEST = 0; private void displaySpeechRecognizer() { Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); startActivityForResult(intent, SPEECH_REQUEST); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == SPEECH_REQUEST && resultCode == RESULT_OK) { List<String> results = data.getStringArrayListExtra( RecognizerIntent.EXTRA_RESULTS); String spokenText = results.get(0); // Do something with spokenText. } super.onActivityResult(requestCode, resultCode, data); }