الإدخال الصوتي

يتيح لك الإدخال الصوتي إنشاء واجهة بدون لمس الجهاز. زجاج ثلاث طرق لاستخدام الإدخال الصوتي.

تبدأ الأوامر الصوتية الرئيسية في Glassware من بطاقة Home، والصوت السياقي ويمكن للأوامر تنفيذ الإجراءات داخل النشاط، كما أن كلام النظام يتيح لك نشاط التعرف على إدخال صوتي حر الشكل من المستخدمين.

الطلبات الصوتية الرئيسية

تتيح هذه الطلبات الصوتية تشغيل Glassware من بطاقة Home (بطاقة الساعة). عندما تريد للإشارة إلى طلب صوتي رئيسي، ينشئ Glass تلقائيًا عنصر قائمة باللمس كإجراء احتياطي إذا قرر المستخدمون بدء Glassware بالنقر على بطاقة الصفحة الرئيسية

لإضافة طلب صوتي إلى القائمة الرئيسية بصوت OK Glass، اتّبِع الخطوات التالية:

  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 في حسنًا، زجاج قائمة اللمس.

    <activity |service
        android:icon="@drawable/my_icon" ...>
      ...
    </activity | service>
    
  4. إذا كان الطلب الصوتي يستخدم موجّهًا صوتيًا وبدأ نشاطًا، يمكنك الحصول على أي نص منسوخ بالرمز التالي (كما في onResume()):

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

    إذا بدأ الطلب الصوتي خدمة، سيظهر intent الإضافية في 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>
    

الطلبات الصوتية السياقية

تسمح الأوامر الصوتية السياقية للمستخدمين بتنفيذ إجراءات من الأنشطة. يمكنك إنشاء أوامر صوتية سياقية باستخدام واجهات برمجة التطبيقات القياسية لقائمة Android يمكن للمستخدمين استدعاء عناصر القائمة باستخدام الأوامر الصوتية بدلاً من اللمس.

لتفعيل الأوامر الصوتية السياقية لنشاط معيّن:

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

إتاحة قوائم الصوت واللمس في الوقت نفسه

ولأن الأوامر الصوتية السياقية تستخدم واجهات برمجة التطبيقات الحالية لقائمة Android، يمكنك إعادة استخدام الكثير من التعليمات البرمجية والموارد التي لديك بالفعل لقوائم اللمس وتدعم في وقت واحد كلا النوعين من القوائم.

ما عليك سوى التحقّق من ميزة "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. تتوفّر عناصر intent الإضافية التالية عند بدء النشاط:
  2. إلغاء onActivityResult() لتلقي النص المكتوب من EXTRA_RESULTS النية الإضافية. ويتم طلب معاودة الاتصال هذه عندما ينتهي المستخدمون من التحدّث.

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