ป้อนข้อมูลด้วยเสียง

การป้อนข้อมูลด้วยเสียงช่วยให้คุณสร้างอินเทอร์เฟซแบบแฮนด์ฟรีได้อย่างแท้จริง Glass นําเสนอ 3 วิธีในการใช้การป้อนข้อมูลด้วยเสียง

คําสั่งเสียงหลักจะเริ่มการใช้งาน Glassware จากการ์ด Home, คําสั่งตามบริบทตามบริบทจะประมวลผลการทํางานภายในกิจกรรมได้ และกิจกรรมการจดจําคําพูดของระบบช่วยให้คุณได้รับอินพุตเสียงรูปแบบอิสระจากผู้ใช้

คําสั่งเสียงหลัก

คําสั่งเสียงเหล่านี้จะเปิดตัว Glassware จากการ์ด Home (การ์ดนาฬิกา) เมื่อคุณประกาศคําสั่งเสียงหลัก Glass จะสร้างรายการเมนูการสัมผัสเป็นโฆษณาสํารองโดยอัตโนมัติหากผู้ใช้ตัดสินใจเริ่มใช้ Glassware โดยแตะที่การ์ดในหน้าแรก

หากต้องการเพิ่มคําสั่งเสียงลงในเมนูหลักเสียงกระจก ให้ทําดังนี้

  1. สร้างทรัพยากร XML สําหรับคําสั่งเสียงใน res/xml/<my_voice_trigger>.xml ที่ใช้คําสั่งเสียงที่มีอยู่ซึ่งกําหนดไว้ใน VoiceTriggers.Command เช่น วิธีใช้ "เริ่มต้นการวิ่ง"

    <?xml version="1.0" encoding="utf-8"?>
    <trigger command="START_A_RUN" />
    

    หากต้องการสร้างคําสั่งเสียงที่แจ้งให้ผู้ใช้พูดวลีเพิ่มเติมก่อนเริ่มกิจกรรมหรือบริการของคุณ ให้ใส่องค์ประกอบ input ด้วย เช่น คุณอาจต้องดําเนินการนี้หากใช้ "โพสต์อัปเดต"

    <?xml version="1.0" encoding="utf-8"?>
    <trigger command="POST_AN_UPDATE">
        <input prompt="@string/glass_voice_prompt" />
    </trigger>
    
  2. ลงทะเบียนตัวกรอง 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>
    
  3. ประกาศแอตทริบิวต์ android:icon สําหรับกิจกรรมหรือบริการของคุณ ซึ่งจะทําให้ Glass แสดงไอคอนสําหรับ Glassware ใน เมนูสัมผัสกระจก

    <activity |service
        android:icon="@drawable/my_icon" ...>
      ...
    </activity | service>
    
  4. หากคําสั่งเสียงใช้ข้อความแจ้งด้วยเสียงและเริ่มกิจกรรม ให้รับข้อความข้อความถอดเสียงด้วยรหัสต่อไปนี้ (เช่น ใน onResume())

    ArrayList<String> voiceResults = getIntent().getExtras()
            .getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
    

    หากคําสั่งเสียงเริ่มบริการ Intent เพิ่มเติมจะพร้อมใช้งานในการเรียกกลับ onStartCommand() ดังนี้

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        ArrayList<String> voiceResults = intent.getExtras()
                .getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
        // ...
    }
    

การตั้งค่าข้อจํากัด

หากต้องการใช้ฟีเจอร์ต่อไปนี้อย่างน้อย 1 ฟีเจอร์เพื่อเริ่มใช้ Glassware ให้ระบุในทรัพยากร res/xml/<my_voice_trigger>.xml หากฟีเจอร์ดังกล่าวไม่พร้อมใช้งาน Glass จะปิดคําสั่งเสียง

  • camera
  • network
  • microphone

    <trigger command="POST_AN_UPDATE">
        <constraints
            camera="true"
            network="true" />
    </trigger>
    

คําสั่งเสียงตามบริบท

คําสั่งเสียงตามบริบทช่วยให้ผู้ใช้ดําเนินการจากกิจกรรมได้ คุณสร้างคําสั่งเสียงตามบริบทด้วย API เมนูของ Android มาตรฐานได้ แต่ผู้ใช้จะเรียกใช้รายการเมนูด้วยคําสั่งเสียงแทนการแตะได้

วิธีเปิดใช้คําสั่งเสียงตามบริบทสําหรับกิจกรรมใดกิจกรรมหนึ่ง

  1. เรียก getWindow().requestFeature(WindowUtils.FEATURE_VOICE_COMMANDS) ในกิจกรรมที่ต้องการเพื่อเปิดใช้คําสั่งเสียงตามบริบท เมื่อเปิดใช้งานฟีเจอร์นี้ เมนู "Ok Glass" จะปรากฏในพื้นที่ส่วนท้ายของหน้าจอเมื่อใดก็ตามที่กิจกรรมนี้โฟกัสอยู่

  2. ลบล้าง onCreatePanelMenu() และจัดการเคสที่เปิดใช้ WindowUtils.FEATURE_VOICE_COMMANDS หากเปิดใช้ ขั้นตอนนี้คือการตั้งค่าเมนูแบบครั้งเดียว เช่น การเพิ่มทรัพยากรเมนูหรือการเรียกเมธอด Menu.add() เพื่อสร้างระบบเมนูเสียง

  3. ลบล้าง 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 dog, 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>
    
  4. (ไม่บังคับ) ลบล้าง 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 ที่คุณตรวจสอบใน 2-3 วิธีอยู่แล้ว จากนั้นเพิ่มตรรกะเพื่อเปิดเมนูการแตะในการดําเนินการบางอย่างของผู้ใช้ เช่น การแตะ

เช่น คุณสามารถเปลี่ยนตัวอย่างกิจกรรมก่อนหน้าเพื่อเพิ่มการรองรับเมนูการแตะในลักษณะนี้ (แสดงความคิดเห็นเกี่ยวกับการเปลี่ยนแปลง)

// 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 เพื่อแสดงเมนูของคุณ

การใช้คําสั่งเสียงไม่เป็นสาธารณะสําหรับการพัฒนา

หากต้องการเผยแพร่ Glassware คุณต้องใช้คําสั่งเสียงหลักที่ได้รับอนุมัติใน VoiceTriggers.Command และคําสั่งเสียงตามบริบทที่ได้รับอนุมัติใน ContextualMenus.Command

หากต้องการใช้คําสั่งเสียงที่ไม่มีใน GDK คุณขอสิทธิ์ Android ในไฟล์ AndroidManifest.xml ได้โดยทําดังนี้

<uses-permission
     android:name="com.google.android.glass.permission.DEVELOPMENT" />

การใช้คําสั่งเสียงหลักที่ไม่เป็นสาธารณะ

  1. ประกาศค่าสตริงใน 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>
    
  2. สร้างทรัพยากร 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>

กําลังเริ่มการจดจําคําพูด


Glassware ที่จดจําคําพูดจะรอให้ผู้ใช้พูดและแสดงผล ข้อความที่ถอดเสียงหลังจากพูดเสร็จ วิธีเริ่มกิจกรรม

  1. โทร startActivityForResult() ด้วยความตั้งใจ ACTION_RECOGNIZE_SPEECH ระบบรองรับเจตนาพิเศษต่อไปนี้เมื่อเริ่มต้นกิจกรรม
  2. ลบล้างการเรียกกลับ onActivityResult() เพื่อรับข้อความที่ถอดเสียงจากตัวเลือก Intent ของ EXTRA_RESULTS ระบบจะโทรกลับนี้เมื่อผู้ใช้พูดจบ

    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);
    }