Masukan Suara

Input suara memungkinkan Anda membuat antarmuka yang benar-benar handsfree. Kaca memberi Anda tiga cara untuk menggunakan input suara.

Perintah suara utama memulai Glassware dari kartu Home, suara kontekstual perintah bisa mengeksekusi tindakan dalam suatu aktivitas, dan ucapan sistem memungkinkan Anda menerima input suara bentuk bebas dari pengguna.

Perintah suara utama

Perintah suara ini meluncurkan Glassware dari kartu Home (kartu Jam). Jika Anda mendeklarasikan perintah suara utama, Glass akan otomatis membuat item menu sentuh sebagai alternatif jika pengguna memutuskan untuk memulai Glassware Anda dengan mengetuk Kartu beranda.

Untuk menambahkan perintah suara ke menu utama ok kaca:

  1. Membuat resource XML untuk perintah suara di res/xml/<my_voice_trigger>.xml yang menggunakan salah satu perintah suara yang sudah ada didefinisikan dalam VoiceTriggers.Command. Misalnya, berikut cara menggunakan "Start a run".

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

    Untuk membuat perintah suara yang meminta pengguna mengucapkan sebelum memulai aktivitas atau layanan, sertakan input juga. Misalnya, Anda mungkin ingin melakukan ini jika Anda menggunakan "Posting pembaruan".

    <?xml version="1.0" encoding="utf-8"?>
    <trigger command="POST_AN_UPDATE">
        <input prompt="@string/glass_voice_prompt" />
    </trigger>
    
  2. Daftarkan filter intent menggunakan com.google.android.glass.action.VOICE_TRIGGER tindakan di Manifes Android. Filter intent memulai aktivitas atau layanan Anda jika mendeteksi pengguna yang mengucapkan perintah suara Anda.

    <?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. Deklarasikan atribut android:icon untuk aktivitas atau layanan Anda. Hal ini memungkinkan Glass menampilkan ikon untuk Glassware Anda di oke, kaca menu sentuhnya.

    <activity |service
        android:icon="@drawable/my_icon" ...>
      ...
    </activity | service>
    
  4. Jika perintah suara Anda menggunakan perintah suara dan memulai aktivitas, dapatkan teks yang ditranskripsikan dengan kode berikut (seperti dalam onResume()):

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

    Jika perintah suara memulai layanan, tambahan intent tersedia di Callback onStartCommand():

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

Menetapkan batasan

Jika Anda memerlukan satu atau semua fitur berikut untuk memulai Gelas Anda, menentukannya di resource res/xml/<my_voice_trigger>.xml. Jika fitur tidak tersedia, Glass akan menonaktifkan perintah suara:

  • camera
  • network
  • microphone

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

Perintah suara kontekstual

Perintah suara kontekstual memungkinkan pengguna melakukan tindakan dari aktivitas. Anda membuat perintah suara kontekstual dengan API menu Android standar, tetapi pengguna dapat memanggil item menu dengan perintah suara sebagai ganti sentuhan.

Guna mengaktifkan perintah suara kontekstual untuk aktivitas tertentu:

  1. Hubungi getWindow().requestFeature(WindowUtils.FEATURE_VOICE_COMMANDS) dalam aktivitas yang diinginkan untuk mengaktifkan perintah suara kontekstual. Dengan fitur ini diaktifkan, menu "ok kaca" akan muncul di area footer layar ketika aktivitas ini mendapatkan fokus.

  2. Mengganti onCreatePanelMenu() dan menangani kasus di mana WindowUtils.FEATURE_VOICE_COMMANDS diaktifkan. Jika diaktifkan, Anda dapat melakukan penyiapan menu satu kali, seperti meng-inflate resource menu atau memanggil Menu.add() untuk membuat sistem menu suara.

  3. Mengganti onMenuItemSelected() untuk menangani perintah suara saat pengguna mengucapkannya. Saat pengguna selesai memilih item menu, perintah suara "ok, kaca" secara otomatis akan muncul kembali di bagian footer layar, siap untuk menerima suara baru selama aktivitas tetap dalam fokus.

    Kode berikut memungkinkan perintah suara kontekstual, meng-inflate resource menu jika diperlukan, dan menangani perintah suara saat diucapkan:

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

    Berikut ini contoh sumber daya menu yang digunakan oleh aktivitas sebelumnya. Perhatikan cara membuat item menu bertingkat untuk suara hierarkis sistem menu. Dalam contoh berikut, item menu pertama dapat diakses sebagai: ok kaca, 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. (Opsional) Ganti onPreparePanel(), memeriksa apakah WindowUtils.FEATURE_VOICE_COMMANDS diaktifkan. Jika diaktifkan, di sinilah Anda dapat melakukan logika lain untuk menyiapkan sistem menu, seperti menambahkan dan menghapus item menu tertentu berdasarkan beberapa kriteria. Anda dapat aktifkan juga menu suara kontekstual (tampilkan true) dan nonaktifkan (tampilkan false) berdasarkan beberapa kriteria. Contoh:

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

Mendukung menu suara dan sentuh secara bersamaan

Karena perintah suara kontekstual menggunakan API menu Android yang ada, Anda dapat menggunakan kembali banyak kode dan sumber daya yang sudah Anda miliki untuk menu sentuh dan secara bersamaan mendukung kedua jenis menu.

Anda hanya perlu memeriksa fitur Window.FEATURE_OPTIONS_PANEL selain fitur WindowUtils.FEATURE_VOICE_COMMANDS yang sudah Anda kita periksa dalam beberapa metode, lalu tambahkan logika untuk membuka menu pada beberapa tindakan pengguna, seperti ketukan.

Misalnya, Anda dapat mengubah aktivitas sebelumnya contoh untuk menambahkan dukungan menu sentuh seperti ini (perubahan diberi komentar):

// 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) {
    ...
}

Dengan perubahan ini, Anda dapat mengetuk atau mengucapkan ok kaca untuk menampilkan menu Anda.

Menggunakan perintah suara yang tidak tercantum untuk pengembangan

Jika akan mendistribusikan Glassware, Anda harus menggunakan perintah suara di VoiceTriggers.Command dan menyetujui perintah suara kontekstual dalam ContextualMenus.Command

Jika Anda ingin menggunakan perintah suara yang tidak tersedia di GDK, Anda dapat meminta izin Android di file AndroidManifest.xml:

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

Menggunakan perintah suara utama yang tidak tercantum

  1. Deklarasikan nilai string di res/values/strings.xml yang menentukan nama pemicu suara Anda. Secara opsional, deklarasikan perintah suara untuk menampilkan pengenalan ucapan Glassware sebelum memulai Glassware Anda.

    <?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. Buat resource XML untuk pemicu suara di res/xml/<my_voice_trigger>.xml. Untuk perintah suara yang tidak terdaftar, Anda harus menggunakan atribut keyword, bukan atribut command yang digunakan untuk mendapatkan persetujuan perintah suara. Atribut keyword harus menjadi referensi ke string resource yang mendefinisikan perintah suara. Untuk pemicu suara sederhana yang memulai aktivitas atau layanan dengan segera, cukup tetapkan elemen trigger:

    <?xml version="1.0" encoding="utf-8"?>
    <trigger keyword="@string/glass_voice_trigger" />
    

    Untuk membuat pemicu suara yang meminta pengguna mengucapkan sebelum memulai aktivitas atau layanan Anda, sertakan elemen input juga:

    <?xml version="1.0" encoding="utf-8"?>
    <trigger keyword="@string/glass_voice_trigger">
        <input prompt="@string/glass_voice_prompt" />
    </trigger>
    

Menggunakan perintah suara kontekstual tidak publik

Saat membuat item menu, gunakan teks apa pun sebagai judul item menu. Contoh:

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

Memulai pengenalan ucapan


Pengenalan ucapan Glassware menunggu pengguna berbicara dan mengembalikan teks yang ditranskripsikan setelah selesai. Untuk memulai aktivitas:

  1. Panggil startActivityForResult() dengan intent ACTION_RECOGNIZE_SPEECH. Tambahan intent berikut didukung saat memulai aktivitas:
  2. Ganti onActivityResult() untuk menerima teks yang ditranskripsikan dari EXTRA_RESULTS intent tambahan. Callback ini dipanggil saat pengguna selesai berbicara.

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