Masukan Suara

Input suara memungkinkan Anda membuat antarmuka handsfree. Glass memberi Anda tiga cara untuk memanfaatkan input suara.

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

Perintah suara utama

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

Untuk menambahkan perintah suara ke menu utama suara ok Glass:

  1. Buat resource XML untuk perintah suara di res/xml/<my_voice_trigger>.xml yang menggunakan salah satu perintah suara yang ada yang ditentukan di VoiceTriggers.Command. Misalnya, berikut cara menggunakan "Mulai lari".

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

    Untuk membuat perintah suara yang meminta pengguna mengucapkan frasa tambahan sebelum memulai aktivitas atau layanan Anda, sertakan juga elemen input. Misalnya, Anda dapat melakukannya jika Anda menggunakan "Post a update".

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

    <?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 di menu sentuh ok, kaca.

    <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 akan 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 salah satu atau semua fitur berikut untuk memulai Glassware, tentukan fitur tersebut 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, bukan sentuhan.

Guna mengaktifkan perintah suara kontekstual untuk aktivitas tertentu:

  1. Panggil getWindow().requestFeature(WindowUtils.FEATURE_VOICE_COMMANDS) di aktivitas yang diinginkan untuk mengaktifkan perintah suara kontekstual. Dengan mengaktifkan fitur ini, menu "ok Glass" akan muncul di area footer layar setiap kali aktivitas ini menerima fokus.

  2. Ganti onCreatePanelMenu() dan tangani kasus ketika WindowUtils.FEATURE_VOICE_COMMANDS diaktifkan. Jika diaktifkan, di sinilah Anda akan melakukan penyiapan menu satu kali, seperti meng-inflate resource menu atau memanggil metode Menu.add() untuk membuat sistem menu suara.

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

    Kode berikut memungkinkan perintah suara kontekstual, meng-inflate resource menu jika sesuai, 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 adalah contoh resource menu yang digunakan oleh aktivitas sebelumnya. Perhatikan cara membuat item menu bertingkat untuk sistem menu suara hierarki. Pada contoh berikut, item menu pertama dapat diakses sebagai: 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. (Opsional) Ganti onPreparePanel(), periksa apakah WindowUtils.FEATURE_VOICE_COMMANDS diaktifkan atau tidak. Jika diaktifkan, di sinilah Anda dapat melakukan logika lain untuk menyiapkan sistem menu, seperti menambahkan dan menghapus item menu tertentu berdasarkan beberapa kriteria. Anda juga dapat mengaktifkan menu suara kontekstual (menampilkan true) dan menonaktifkan (menampilkan 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 resource yang telah Anda miliki untuk menu sentuh dan sekaligus mendukung kedua jenis menu.

Yang perlu Anda lakukan adalah memeriksa fitur Window.FEATURE_OPTIONS_PANEL selain fitur WindowUtils.FEATURE_VOICE_COMMANDS yang sudah Anda periksa dalam beberapa metode, lalu menambahkan logika untuk membuka menu sentuh pada beberapa tindakan pengguna, seperti ketukan.

Misalnya, Anda dapat mengubah contoh aktivitas sebelumnya untuk menambahkan dukungan bagi 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 tidak publik untuk pengembangan

Jika ingin mendistribusikan Glassware, Anda harus menggunakan perintah suara utama yang disetujui di VoiceTriggers.Command dan perintah suara kontekstual yang disetujui di ContextualMenus.Command.

Jika 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 dalam res/values/strings.xml yang menentukan nama pemicu suara Anda. Secara opsional, deklarasikan perintah suara untuk menampilkan Glassware pengenalan ucapan 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 tidak publik, Anda harus menggunakan atribut keyword, bukan atribut command yang digunakan untuk perintah suara yang disetujui. Atribut keyword harus merupakan referensi ke resource string yang menentukan perintah suara. Untuk pemicu suara sederhana yang segera memulai aktivitas atau layanan, cukup tentukan elemen trigger:

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

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

    <?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 untuk 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 menampilkan 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 callback onActivityResult() untuk menerima teks yang ditranskripsikan dari intent tambahan EXTRA_RESULTS. 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);
    }