Ses Girişi

Ses girişi sayesinde eller serbest bir arayüz oluşturabilirsiniz. Glass, ses girişini kullanmak için üç yol sunar.

Ana sesli komutlar Glassware'i ana karttan başlatır, bağlamsal sesli komutlar bir etkinlik içinde işlem yapabilir ve sistemin konuşma tanıma etkinliği, kullanıcılardan serbest biçimli ses girişi almanıza olanak tanır.

Ana sesli komutlar

Bu sesli komutlar, Glassware'i ana karttan (saat kartı) başlatır. Ana sesli komutu verdiğinizde Glass, otomatik olarak yedek menü öğesi oluşturur. Kullanıcılar, Ana Kart'a dokunarak Glassware'i başlatmaya karar verirse otomatik olarak yedek menü öğesi oluşturur.

ok cam sesli ana menüsüne sesli komut eklemek için:

  1. res/xml/<my_voice_trigger>.xml uygulamasında sesli komut için, VoiceTriggers.Command içinde tanımlanan mevcut sesli komutlardan birini kullanan bir XML kaynağı oluşturun. Örneğin, "Koşu başlat"ı şu şekilde kullanabilirsiniz.

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

    Etkinliğinizi veya hizmetinizi başlatmadan önce kullanıcıdan ek bir ifade söylemesini isteyen bir sesli komut oluşturmak için ayrıca bir input öğesi ekleyin. Örneğin, "Güncelleme yayınla" seçeneğini kullanıyorsanız bunu yapmak isteyebilirsiniz.

    <?xml version="1.0" encoding="utf-8"?>
    <trigger command="POST_AN_UPDATE">
        <input prompt="@string/glass_voice_prompt" />
    </trigger>
    
  2. Android manifest'inizdeki com.google.android.glass.action.VOICE_TRIGGER işlemini kullanarak bir intent filtresi kaydedin. Niyet filtresi, sesli komutunuzu söyleyen kullanıcıları tespit ederse etkinliğinizi veya hizmetinizi başlatır.

    <?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. Etkinliğiniz veya hizmetiniz için bir android:icon özelliği belirtin. Bu şekilde Glass'ın ok, cam dokunma menüsünde Glassware'inize ait bir simge görüntülenebilir.

    <activity |service
        android:icon="@drawable/my_icon" ...>
      ...
    </activity | service>
    
  4. Sesli komutunuz sesli istem kullanır ve bir etkinlik başlatırsa aşağıdaki kodla (ör. onResume()) metne dönüştürülen bir metin alın:

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

    Sesli komut bir hizmeti başlatıyorsa onStartCommand() geri çağırmasında ekstra niyet mevcut olur:

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

Ayar kısıtlamaları

Glassware'i başlatmak için aşağıdaki özelliklerden birine veya tümüne ihtiyacınız varsa bunları res/xml/<my_voice_trigger>.xml kaynağında belirtin. Özellikler kullanılamıyorsa Glass, sesli komutu devre dışı bırakır:

  • camera
  • network
  • microphone

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

Bağlamsal sesli komutlar

Bağlamsal sesli komutlar, kullanıcıların çeşitli işlemler yapmasına olanak tanır. Standart Android menüsü API'leriyle bağlamsal sesli komutlar oluşturursunuz. Kullanıcılar menü öğelerini dokunmak yerine sesli komutlarla çağırabilirler.

Belirli bir etkinlik için bağlama dayalı sesli komutları etkinleştirmek üzere:

  1. Bağlamsal sesli komutları etkinleştirmek için istediğiniz etkinlikte getWindow().requestFeature(WindowUtils.FEATURE_VOICE_COMMANDS) çağrısını gerçekleştirin. Bu özellik etkinleştirildiğinde, bu etkinlik her odaklanıldığında ekranın alt alanında "ok cam" menüsü görünür.

  2. onCreatePanelMenu() alanını geçersiz kılın ve WindowUtils.FEATURE_VOICE_COMMANDS özelliğinin etkinleştirildiği büyük/küçük harf durumunu yönetin. Bu özellik etkinleştirildiğinde, bir menü kaynağını artırmak veya sesli menü sisteminizi oluşturmak için Menu.add() yöntemlerini çağırmak gibi tek seferlik bir menü kurulumu yapabilirsiniz.

  3. Kullanıcılar söylediklerinde sesli komutları işlemek için onMenuItemSelected() politikasını geçersiz kılın. Bir menü öğesini seçmeyi bitirdiğinizde, etkinlik odakta olduğu sürece "ok, cam" sesli komutu otomatik olarak ekranın altbilgi bölümünde yeniden görünür.

    Aşağıdaki kod, bağlamsal sesli komutları etkinleştirir, uygun olduğunda bir menü kaynağını şişirir ve söylendiğinde sesli komutları işler:

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

    Önceki etkinlik tarafından kullanılan menü kaynağı örneğini burada bulabilirsiniz. Hiyerarşik bir sesli menü sistemi için nasıl iç içe yerleştirilmiş menü öğeleri oluşturacağınızı öğrenin. Aşağıdaki örnekte, ilk menü öğesine ok cam, Köpekleri göster, Labrador şeklinde erişilebilir.

    <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. (İsteğe bağlı) WindowUtils.FEATURE_VOICE_COMMANDS öğesinin etkin olup olmadığını kontrol ederek onPreparePanel() değerini geçersiz kılın. Etkinleştirildiğinde menü sistemini ayarlamak için diğer faktörleri (ör. bazı ölçütlere göre belirli menü öğelerini ekleyip kaldırma gibi) yapabilirsiniz. Ayrıca, bazı kriterlere göre bağlamsal sesli menüleri açıp (true dönüşünü) ve kapalı düğmesini (false döndürme) de açabilirsiniz. Örneğin:

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

Sesli ve dokunmatik menüler aynı anda destekleniyor

Bağlamsal sesli komutlar mevcut Android menüsü API'lerini kullandığından, halihazırda sahip olduğunuz kod ve kaynakların büyük bir kısmını dokunmatik menüler için yeniden kullanabilir ve aynı anda her iki menü türünü de destekleyebilirsiniz.

Tek yapmanız gereken, halihazırda birkaç yöntemle kontrol ettiğiniz WindowUtils.FEATURE_VOICE_COMMANDS özelliğine ek olarak Window.FEATURE_OPTIONS_PANEL özelliğini kontrol etmek ve ardından, dokunma gibi bazı kullanıcı işlemlerinde dokunma menüsünü açmak için bir mantık eklemektir.

Örneğin, önceki etkinliğe ait etkinliği buna benzer dokunma menüleri için destek eklemek üzere değiştirebilirsiniz (değişiklikler yorumlanır):

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

Bu değişikliklerle, menünüzü görüntülemek için dokunun veya ok cam diyebilirsiniz.

Geliştirme için liste dışı sesli komutları kullanma

Glassware'inizi dağıtmak istediğinizde, onaylanmış ana sesli komutları VoiceTriggers.Command ve onaylı bağlamsal sesli komutları ContextualMenus.Command dilinde kullanmanız gerekir.

GDK'da bulunmayan sesli komutları kullanmak isterseniz AndroidManifest.xml dosyanızda Android için izin isteyebilirsiniz:

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

Liste dışı ana sesli komutları kullanma

  1. res/values/strings.xml uygulamasında ses tetikleyicinizin adını tanımlayan bir dize değeri bildirin. İsteğe bağlı olarak, Glassware'i başlatmadan önce konuşma tanıma Glassware'i görüntülemek için bir sesli istem belirtin.

    <?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. res/xml/<my_voice_trigger>.xml uygulamasındaki ses tetikleyicisi için XML kaynağı oluşturun. Liste dışı sesli komutlarda, onaylanmış sesli komutlar için kullanılan command özelliği yerine keyword özelliğini kullanmanız gerekir. keyword özelliği, sesli komutu tanımlayan dize kaynağına başvuru olmalıdır. Bir etkinliği veya hizmeti hemen başlatan basit bir ses tetikleyicisi için trigger öğesini belirtmeniz yeterlidir:

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

    Etkinliğinizi veya hizmetinizi başlatmadan önce kullanıcıdan ek bir ifade söylemesini isteyen bir sesli tetikleyici oluşturmak için bir giriş öğesi de ekleyin:

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

Liste dışı içeriğe dayalı sesli komutları kullanma

Menü öğeleri oluştururken menü öğesinin başlığı için herhangi bir metni kullanın. Örneğin:

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

Konuşma tanıma başlatılıyor


Konuşma tanıma Glassware kullanıcıların konuşmasını bekler ve metne dönüştürüldükten sonra metni döndürür. Etkinliği başlatmak için:

  1. startActivityForResult() adlı kişiyi ACTION_RECOGNIZE_SPEECH niyetiyle arayın. Aktivite başlatılırken aşağıdaki amaç ekstraları desteklenir:
  2. Metne dönüştürülen metni EXTRA_RESULTS ekinden almak için onActivityResult() geri çağırmasını geçersiz kılın. Bu geri çağırma, kullanıcılar konuşmayı bitirdikten sonra çağrılır.

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