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

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

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

คำสั่งเสียงหลัก

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

วิธีเพิ่มคำสั่งเสียงลงในเมนูหลักของ ok Glass

  1. สร้างทรัพยากร 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>
    
  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 เพิ่มเติมจะอยู่ใน 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 มาตรฐาน แต่ ผู้ใช้เรียกใช้รายการในเมนูด้วยคำสั่งเสียงแทนการแตะได้

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

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

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

// 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" />

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

  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>

กำลังเริ่มต้นการจดจำคำพูด


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

  1. โทร startActivityForResult() ด้วย Intent ACTION_RECOGNIZE_SPEECH ระบบรองรับ Intent เพิ่มเติมต่อไปนี้เมื่อเริ่มต้นกิจกรรม
  2. ลบล้าง 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);
    }