ورودی صدا

ورودی صوتی به شما امکان می دهد یک رابط واقعاً بدون دست ایجاد کنید. Glass سه راه برای استفاده از ورودی صوتی در اختیار شما قرار می دهد.

دستورات صوتی اصلی Glassware را از کارت Home شروع می‌کنند، فرمان‌های صوتی متنی می‌توانند اقداماتی را در یک فعالیت انجام دهند، و فعالیت تشخیص گفتار سیستم به شما امکان می‌دهد ورودی صوتی به شکل آزاد را از کاربران دریافت کنید.

دستورات صوتی اصلی

این دستورات صوتی Glassware را از کارت Home (کارت ساعت) راه اندازی می کنند. هنگامی که یک فرمان صوتی اصلی را اعلام می کنید، اگر کاربران تصمیم بگیرند که Glassware شما را با ضربه زدن روی کارت Home شروع کنند، Glass به طور خودکار یک آیتم منوی لمسی را به عنوان یک بازگشت ایجاد می کند.

برای افزودن یک فرمان صوتی به منوی اصلی صدای شیشه ok :

  1. یک منبع XML برای فرمان صوتی در res/xml/<my_voice_trigger>.xml ایجاد کنید که از یکی از دستورات صوتی موجود تعریف شده در VoiceTriggers.Command استفاده کند. به عنوان مثال، در اینجا نحوه استفاده از "شروع یک اجرا" آمده است.

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

    برای ایجاد یک فرمان صوتی که از کاربر می خواهد قبل از شروع فعالیت یا خدمات شما یک عبارت اضافی را بیان کند، یک عنصر input نیز اضافه کنید. به عنوان مثال، اگر از "پست یک به روز رسانی" استفاده می کنید، ممکن است بخواهید این کار را انجام دهید.

    <?xml version="1.0" encoding="utf-8"?>
    <trigger command="POST_AN_UPDATE">
        <input prompt="@string/glass_voice_prompt" />
    </trigger>
    
  2. با استفاده از عملکرد com.google.android.glass.action.VOICE_TRIGGER در مانیفست Android خود، یک فیلتر قصد ثبت کنید. فیلتر قصد فعالیت یا خدمات شما را در صورت تشخیص کاربرانی که فرمان صوتی شما را بیان می کنند، شروع می کند.

    <?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 شما در منوی لمسی شیشه‌ای ok نمایش دهد.

    <activity |service
        android:icon="@drawable/my_icon" ...>
      ...
    </activity | service>
    
  4. اگر فرمان صوتی شما از یک فرمان صوتی استفاده می کند و فعالیتی را شروع می کند، هر متن رونویسی شده ای را با کد زیر دریافت کنید (مانند onResume() ):

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

    اگر فرمان صوتی یک سرویس را راه اندازی کند، هدف اضافی در پاسخ به تماس 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های منوی استاندارد اندروید می سازید، اما کاربران می توانند به جای لمس، آیتم های منو را با دستورات صوتی فراخوانی کنند.

برای فعال کردن دستورات صوتی متنی برای یک فعالیت خاص:

  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های منوی اندروید موجود استفاده می‌کنند، می‌توانید از بسیاری از کدها و منابعی که قبلاً در اختیار دارید برای منوهای لمسی دوباره استفاده کنید و به طور همزمان از هر دو نوع منو پشتیبانی کنید.

تنها کاری که باید انجام دهید این است که ویژگی 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 .

استفاده از دستورات صوتی فهرست نشده برای توسعه

وقتی می‌خواهید Glassware خود را توزیع کنید، باید از دستورات صوتی اصلی تأیید شده در 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>

شروع تشخیص گفتار


Glassware تشخیص گفتار منتظر می ماند تا کاربران صحبت کنند و پس از اتمام متن رونویسی شده را برمی گرداند. برای شروع فعالیت:

  1. startActivityForResult() با هدف ACTION_RECOGNIZE_SPEECH فراخوانی کنید. هنگام شروع فعالیت، موارد اضافی هدف زیر پشتیبانی می شوند:
  2. برای دریافت متن رونویسی شده از قصد اضافی EXTRA_RESULTS ، فراخوانی onActivityResult() را لغو کنید. این تماس پس از اتمام صحبت کاربران فراخوانی می شود.

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