Ses Girişi

Ses girişi ile gerçekten eller serbest bir arayüz oluşturabilirsiniz. Glass, ses girişini üç farklı şekilde kullanmanızı sağlar.

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

Ana sesli komutlar

Bu sesli komutlar Ana Sayfa kartından (Saat kartı) Glassware'i başlatır. Bir ana sesli komut bildirdiğinizde, kullanıcılar Glassware hizmetini Ana Sayfa kartına dokunarak başlatmaya karar verirse Glass otomatik olarak yedek olarak bir dokunma menü öğesi oluştururlar.

Ok Glass sesli ana menüsüne sesli komut eklemek için:

  1. res/xml/<my_voice_trigger>.xml uygulamasındaki 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" özelliğinin nasıl kullanılacağı burada açıklanmaktadır.

    <?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 input öğesi de ekleyin. Örneğin, "Güncelleme yayınla" 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. Amaç filtresi, sesli komutunuzu konuşan kullanıcıların olduğunu algılarsa 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 beyan edin. Bu şekilde Glass, tamam, cam dokunma menüsünde Glassware'iniz için bir simge görüntüleyebilir.

    <activity |service
        android:icon="@drawable/my_icon" ...>
      ...
    </activity | service>
    
  4. Sesli komutunuz sesli istem kullanıp etkinlik başlatırsa aşağıdaki kodu içeren, metne dönüştürülen metinleri alın (ör. onResume()):

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

    Sesli komut bir hizmet başlatırsa Intent extra, onStartCommand() geri çağırmasında kullanılabilir:

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

Kısıtlamalar ayarlama

Glassware uygulamanızı 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ğlama dayalı sesli komutlar

Bağlama dayalı sesli komutlar, kullanıcıların etkinliklerdeki işlemleri gerçekleştirmesine olanak tanır. Bağlama dayalı sesli komutları standart Android menü API'leriyle oluşturursunuz ancak kullanıcılar menü öğelerini dokunmak yerine sesli komutlarla çağırabilirler.

Belirli bir etkinlikle ilgili olarak bağlama dayalı sesli komutları etkinleştirmek için:

  1. İçeriğe dayalı sesli komutları etkinleştirmek için istediğiniz etkinlikte getWindow().requestFeature(WindowUtils.FEATURE_VOICE_COMMANDS) numaralı telefonu arayın. Bu özellik etkinleştirildiğinde, bu etkinliğe odaklanıldığında ekranın alt bilgi alanında "ok Glass" menüsü görünür.

  2. onCreatePanelMenu() değerini geçersiz kılın ve WindowUtils.FEATURE_VOICE_COMMANDS özelliğinin etkinleştirildiği destek kaydını ele alın. Bu ayar etkinleştirilirse tek seferlik menü ayarlarını (ör. menü kaynağını şişirme veya sesli menü sisteminizi oluşturmak için Menu.add() yöntemlerini çağırma) yapabilirsiniz.

  3. Kullanıcılar söylediğinde sesli komutları işlemek için onMenuItemSelected() kodunu geçersiz kılın. Kullanıcılar bir menü öğesini seçdiklerinde, etkinlik odakta kaldığı sürece "ok, Glass" sesli komutu otomatik olarak ekranın altbilgi bölümünde yeniden görünür ve yeni bir sesli komutu kabul etmeye hazır olur.

    Aşağıdaki kod, bağlamsal sesli komutları etkinleştirir, uygun olduğunda 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ğının bir örneğini burada bulabilirsiniz. Hiyerarşik bir ses menüsü sistemi için iç içe yerleştirilmiş menü öğelerini nasıl oluşturabileceğinize dikkat edin. Aşağıdaki örnekte ilk menü öğesine şu şekilde erişilebilir: ok cam, Köpekleri göster, 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. (İsteğe bağlı) WindowUtils.FEATURE_VOICE_COMMANDS'in etkin olup olmadığını kontrol ederek onPreparePanel() değerini geçersiz kılın. Etkinleştirildiğinde, menü sistemini ayarlamak için başka işlemler yapabilirsiniz. Örneğin, bazı ölçütlere dayalı olarak belirli menü öğelerini ekleyip kaldırabilirsiniz. Ayrıca, bazı ölçütlere göre içeriğe dayalı sesli menüleri açabilir (döndür true) ve kapatabilirsiniz (dönüş false). Ö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üleri aynı anda destekleme

Bağlamsal sesli komutlar mevcut Android menü API'lerini kullandığından, dokunmatik menüler için sahip olduğunuz kod ve kaynakların çoğunu yeniden kullanabilir ve aynı anda her iki menü türünü de destekleyebilirsiniz.

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

Örneğin, önceki etkinlik örneğini değiştirerek aşağıdaki gibi dokunma menüleri için destek ekleyebilirsiniz (değişikliklere yorum yapılı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 Glass demeniz yeterli.

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

Glassware uygulamanızı dağıtmak istediğinizde VoiceTriggers.Command ürününde onaylanmış ana sesli komutları, ContextualMenus.Command içinde de onaylanmış içeriğe dayalı sesli komutları kullanmanız gerekir.

GDK'da bulunmayan sesli komutları kullanmak isterseniz AndroidManifest.xml dosyanızdan bir Android izni isteyebilirsiniz:

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

Liste dışı ana sesli komutları kullanma

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

    <?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 bölgesinde ses tetikleyici için XML kaynağı oluşturun. Liste dışı sesli komutlarda, onaylanmış sesli komutlar için kullanılan command özelliği yerine keyword özelliğini kullanmalısınız. keyword özelliği, sesli komutu tanımlayan dize kaynağına referans olmalıdır. Bir etkinliği veya hizmeti hemen başlatan basit bir sesli tetikleyici 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ışı bağlamsal sesli komutları kullanma

Menü öğelerini oluştururken menü öğesinin başlığı için herhangi bir metin 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 Bardağı, kullanıcıların konuşmasını bekler ve metne dönüştürülen metni bitirdikten sonra geri getirir. Etkinliği başlatmak için:

  1. ACTION_RECOGNIZE_SPEECH niyetiyle startActivityForResult() numaralı telefonu ara. Etkinliği başlatırken aşağıdaki intent ekstraları desteklenir:
  2. EXTRA_RESULTS intent ekstrasından metne dönüştürülen metni almak için onActivityResult() geri çağırmasını geçersiz kılın. Bu geri çağırma, kullanıcı konuşmayı bitirdiğinde ç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);
    }