Android 与给定列表最匹配的玻璃语音命令

Android 与给定列表最匹配的玻璃语音命令,android,voice-recognition,google-glass,google-gdk,Android,Voice Recognition,Google Glass,Google Gdk,使用Glass,您可以通过“OK,Glass”菜单启动应用程序,它似乎可以选择最接近的匹配项,除非命令在几英里之外,而且您可以明显地看到命令列表。 在应用程序内,或者在语音提示(在初始应用程序触发后)中是否有类似的列表并返回最接近的匹配项 随机(非真实世界)示例,一个显示颜色的应用程序,“OK Glass,显示红色” “显示颜色”可能是你的声音触发点,似乎与“最近邻”方法中的玻璃相匹配,但是“红色”只是作为自由文本读入,很容易被误认为是“恐惧”或“头部”,甚至是“阅读”,因为无法区分“阅读”和“

使用Glass,您可以通过“OK,Glass”菜单启动应用程序,它似乎可以选择最接近的匹配项,除非命令在几英里之外,而且您可以明显地看到命令列表。
在应用程序内,或者在语音提示(在初始应用程序触发后)中是否有类似的列表并返回最接近的匹配项

随机(非真实世界)示例,一个显示颜色的应用程序,“OK Glass,显示红色”

“显示颜色”可能是你的声音触发点,似乎与“最近邻”方法中的玻璃相匹配,但是“红色”只是作为自由文本读入,很容易被误认为是“恐惧”或“头部”,甚至是“阅读”,因为无法区分“阅读”和“红色”

是否有方法将预先批准的选项列表(红色、绿色、蓝色、橙色*等)传递到此阶段,或传递到应用程序内的另一个语音提示,以便用户在预期响应有限时(如主ok玻璃屏幕)可以查看列表并获得更准确的结果


*好吧,没有什么与橙色押韵,我们在那里可能很安全

您可以利用当多个活动或服务支持相同的语音触发器时出现的消歧步骤:只需在您的应用程序中有多个活动或服务支持
“显示颜色”
作为语音触发器,并用颜色选项标记它们

您的清单将类似于:

<application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:icon="@drawable/icon_50"
        >

    <activity
            android:name="com.mycompany.RedActivity"
            android:label="@string/red"
            android:icon="@drawable/icon_red"
            >
        <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/activity_start"
                />
    </activity>

    <activity
            android:name="com.mycompany.BlueActivity"
            android:label="@string/blue"
            android:icon="@drawable/icon_blue"
            >
        <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/activity_start"
                />
    </activity>
    <!-- ... -->
</application>


这些活动或服务只能作为“蹦床”来启动应用程序的主逻辑和颜色选择。

谷歌GDK还不支持此功能。但是,一些库中已经提供了必要的功能,只要GDK本机不支持,您就可以使用它们。 你必须做的是:

  • 从玻璃中拉出GlassVoice.apk:
    adb Pull/system/app/GlassVoice.apk

  • 使用dex2jar将此apk转换为jar文件

  • 将jar文件添加到构建路径

  • 现在,您可以像这样使用此库:

    public class VoiceActivity extends Activity {
    
        private VoiceInputHelper mVoiceInputHelper;
        private VoiceConfig mVoiceConfig;
    
            @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.voice_activity);
    
            String[] items = {"red", "green", "blue", "orange"};
            mVoiceConfig = new VoiceConfig("MyVoiceConfig", items);
            mVoiceInputHelper = new VoiceInputHelper(this, new MyVoiceListener(mVoiceConfig),
                    VoiceInputHelper.newUserActivityObserver(this));
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            mVoiceInputHelper.addVoiceServiceListener();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            mVoiceInputHelper.removeVoiceServiceListener();
        }
    
        public class MyVoiceListener implements VoiceListener {
            protected final VoiceConfig voiceConfig;
    
            public MyVoiceListener(VoiceConfig voiceConfig) {
                this.voiceConfig = voiceConfig;
            }
    
            @Override
            public void onVoiceServiceConnected() {
                mVoiceInputHelper.setVoiceConfig(mVoiceConfig, false);
            }
    
            @Override
            public void onVoiceServiceDisconnected() {
    
            }
    
            @Override
            public VoiceConfig onVoiceCommand(VoiceCommand vc) {
                String recognizedStr = vc.getLiteral();
                Log.i("VoiceActivity", "Recognized text: "+recognizedStr);
    
                return voiceConfig;
            }
    
            @Override
            public FormattingLogger getLogger() {
                return FormattingLoggers.getContextLogger();
            }
    
            @Override
            public boolean isRunning() {
                return true;
            }
    
            @Override
            public boolean onResampledAudioData(byte[] arg0, int arg1, int arg2) {
                return false;
            }
    
            @Override
            public boolean onVoiceAmplitudeChanged(double arg0) {
                return false;
            }
    
            @Override
            public void onVoiceConfigChanged(VoiceConfig arg0, boolean arg1) {
    
            }
        }
    
    }
    

    如果您还没有,那么您应该看看几周前添加到GDK中的内容。就在它发布的前一天,我遇到了与你完全相同的问题,第二天看了看,发现这对我帮助很大!:)

    谢谢,这似乎是一项有趣的工作,尽管感觉相当粗糙且无法维护,特别是如果你有一长串可能的选项,我想你不知道将来有什么计划更干净地支持这种类型的交互?@Alain你确定这个解决方案有效吗?因为我和本的处境一样。那么,处理语音触发意图的识别器会自动选择最近的标签吗?我是说。。如果它理解“读取”而不是“红色”,它会自动选择“红色”而不是“蓝色”,因为“红色”会被识别为更类似于它以前理解的“读取”字吗?使用这种方法时,识别器不会运行,而是,用于启动活动/服务的流程将根据其识别的内容触发正确的活动/服务。哦,好的。所以这只是一种排除错误识别演讲的巧妙方法(希望我理解正确)。我认为@blueshadow的解决方案更适合Bob的问题,不管怎样,你给了我一个很好的建议:谢谢,伙计;)我试过了。。它工作得很好。非常感谢你!我刚刚更新到XE16,它似乎不再工作了。更新后,我从/system/private app/GlassVoice.apk中提取新的apk,使用dex2jar对其进行转换,并将jar添加到我的构建路径中。运行了与XE12完全相同的代码。现在看来,VoiceListener在检测到第一个VoiceCommand之后,从未捕捉到任何VoiceCommand@blueshadow你知道为什么会这样,以及如何修复它吗?现在位置似乎是/system/priv-app。我从/system/priv-app中提取了GlassVoice.apk,并通过dex2jar工具获得了jar!但在方法VoiceListener.onVoiceCommand中也返回null,它似乎无法识别任何东西。我的glass是XE 17的最新版本。我找到了问题的解决方案——只需在onVoiceCommand中返回“null”。这是参考:我刚刚熟悉这个选项,但据说,VoiceTriggers.Command和contextalmenus.Command中没有列出的命令只能在开发模式下使用。也许我错过了什么,我可以在生产中使用我自己的命令?不,那是真的。在获得开发许可后,您将无法通过MyGlass分发您的玻璃器皿。不过有人提到,您可以提交自己的命令供批准,这样您就可以使用它们。是的,我知道我可以提交它们。无论如何,谢谢你。