我创建了一个简单的语音识别服务:为此我创建了一个 android.speech.RecognitionService的子类,并创建了一个活动来启动和停止此服务.

我的自定义语音识别服务通常使用默认的语音识别器,因为我的目标只是理解RecognitionService和RecognitionService.Callback类的工作原理.

public class SimpleVoiceService extends RecognitionService {

    private SpeechRecognizer m_EnginesR;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("SimpleVoiceService","Service started");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i("SimpleVoiceService","Service stopped");
    }

    @Override
    protected void onCancel(Callback listener) {
        m_EnginesR.cancel();
    }

    @Override
    protected void onStartListening(Intent recognizerIntent,Callback listener) {
        m_EnginesR.setRecognitionListener(new VoiceResultsListener(listener));
        m_EnginesR.startListening(recognizerIntent);
    }

    @Override
    protected void onStopListening(Callback listener) {
        m_EnginesR.stopListening();
    }


    /**
     * 
     */
    private class VoiceResultsListener implements RecognitionListener {

        private Callback m_UserSpecifiedListener;

        /**
         * 
         * @param userSpecifiedListener
         */
        public VoiceResultsListener(Callback userSpecifiedListener) {
            m_UserSpecifiedListener = userSpecifiedListener;
        }

        @Override
        public void onBeginningOfSpeech() {
            try {
                m_UserSpecifiedListener.beginningOfSpeech();
            } catch (remoteexception e) {
                e.printstacktrace();
            }
        }

        @Override
        public void onBufferReceived(byte[] buffer) {
            try {
                m_UserSpecifiedListener.bufferReceived(buffer);
            } catch (remoteexception e) {
                e.printstacktrace();
            }
        }

        @Override
        public void onEndOfSpeech() {
            try {
                m_UserSpecifiedListener.endOfSpeech();
            } catch (remoteexception e) {
                e.printstacktrace();
            }
        }

        @Override
        public void onError(int error) {
            try {
                m_UserSpecifiedListener.error(error);
            } catch (remoteexception e) {
                e.printstacktrace();
            }
        }

        @Override
        public void onEvent(int eventType,Bundle params) { ; }

        @Override
        public void onPartialResults(Bundle partialResults) {
            try {
                m_UserSpecifiedListener.partialResults(partialResults);
            } catch (remoteexception e) {
                e.printstacktrace();
            }
        }

        @Override
        public void onReadyForSpeech(Bundle params) {
            try {
                m_UserSpecifiedListener.readyForSpeech(params);
            } catch (remoteexception e) {
                e.printstacktrace();
            }
        }

        @Override
        public void onResults(Bundle results) {
            try {
                m_UserSpecifiedListener.results(results);
            } catch (remoteexception e) {
                e.printstacktrace();
            }
        }

        @Override
        public void onRmsChanged(float rmsdB) {
            try {
                m_UserSpecifiedListener.rmsChanged(rmsdB);
            } catch (remoteexception e) {
                e.printstacktrace();
            }
        }
    }

}

我使用以下活动启动和停止服务.

public class VoiceServiceStarteractivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Button startButton = new Button(this);
        startButton.setText("Start the service");
        startButton.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) { startVoiceService(); }
        });
        Button stopButton = new Button(this);
        stopButton.setText("Stop the service");
        stopButton.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) { stopVoiceService(); }
        });
        LinearLayout layout = new LinearLayout(this);
        layout.setorientation(LinearLayout.VERTICAL);
        layout.addView(startButton);
        layout.addView(stopButton);
        setContentView(layout);
    }

    private void startVoiceService() {
        startService(new Intent(this,SimpleVoiceService.class));
    }

    private void stopVoiceService() {
        stopService(new Intent(this,SimpleVoiceService.class));
    }
}

最后,我在AndroidManifest.xml上声明了我的服务(请参阅Android SDK文件夹中的VoiceRecognition示例).

<service android:name="SimpleVoiceService"
         android:label="@string/service_name" >

    <intent-filter>
        <action android:name="android.speech.RecognitionService" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</service>

然后我在Android设备上安装了这个应用程序,然后启动它:
– 当我启动服务时,它正常启动;
– 当我停下来时,它会正常停止.

但是,如果我在另一个活动中启动以下代码,则活动List仅包含一个元素,这是默认的语音识别器.

PackageManager pm = getPackageManager();
List<ResolveInfo> activities = pm.queryIntentActivities(
            new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH),0);

为什么我的语音识别器不会返回系统中的那些人?

解决方法

如果你想使用queryIntentActivities(新的Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH),0)来获取你的活动(VoiceServiceStarteractivity),那么你必须在应用程序的Manifest中声明这个活动处理RecognizerIntent.ACTION_RECOGNIZE_SPEECH,就像这样
<activity android:name="VoiceServiceStarteractivity">
  <intent-filter>
    <action android:name="android.speech.action.RECOGNIZE_SPEECH" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
  ...
</activity>

对于更具体的代码,请查看项目Kõnele(source code),该项目本质上是在Android上提供语音识别的接口的开源实现,即它包括:

> ACTION_RECOGNIZE_SPEECH
> ACTION_WEB_SEARCH
> RecognitionService

并使用开源语音识别服务器.

android – 如何注册自定义语音识别服务?的更多相关文章

  1. ios – 我可以安全地在@try catch块中包装’CoreData无法解决错误’错误

    )是的,我偶尔会得到’CoreData无法完成故障’的错误.在我的特定应用程序中,这通常发生在一种“数据绑定”过程中,因此我可以安全地丢弃故障对象并继续前进.我想通过在@try-catch块中包装数据绑定的循环内部并且只跳过我得到CoreData错误的行来完成此操作.我可以使用CoreData安全地执行此操作吗?

  2. 你如何压缩iOS上的Realm DB?

    我想定期在iOS上压缩一个Realm实例来恢复空间.我认为该过程是将数据库复制到临时位置,然后将其复制回来并使用新的default.realm文件.我的问题是Realm()就像一个单例并且回收对象,所以我无法真正关闭它并告诉它打开新的default.realm文件.这里的文档(https://realm.io/docs/objc/latest/api/Classes/RLMRealm.html)建

  3. ios – 使用开放耳朵进行语音识别时的精度非常低

    我的应用程序中使用耳朵进行语音识别.主要关注的是准确性.在一个安静的环境中,精确度约为50%,但在嘈杂的环境中情况会变得更糟.几乎没有任何东西被正确识别.目前我正在使用约300字的字典文件.我应该寻找哪些方面来提高准确度?

  4. ios – 捕获NSKeyedUnarchiver异常

    在Swift中,如果无法取消存档数据,NSKeyedUnarchiver.unarchiveObjectWithData(data)将抛出异常.在某些情况下,我们无法保证数据是否未损坏,例如从文件读取时.我不知道Swift中的try/catch机制,也不知道像canUnarchive这样有助于防止异常的方法.除了在Obj-C中实现try/catch之外,还有一个纯Swift解决方案来解决这个问题吗

  5. ios – 使用swift进行异常处理

    catch来处理它.如果故事板中没有视图控制器,则无法执行任何操作.这是程序员的错误,创建它的人应该处理这些问题.你不能因为这种错误而责怪iOS运行时.

  6. ios – Swift 3 – 将文件夹从主包复制到文档目录

    我的主要包中包含文件夹,我想在首次启动应用程序时将它们复制/剪切到文档目录,以便从那里访问它们.我见过一些例子,但他们都在Obj-C中,我正在使用Swift3.我怎么能这样做?解决方法我设法使用2个功能:

  7. Swift 2.0 try? 的替代方法

    你可以配合着if-let或者guard语句来使用try?但你可以试着写出try?实际上我也不太喜欢tryit这个名字,你用你喜欢的名字代替就好。你可以以同样的方法调用它:你仍然不能基于错误类型和错误细节来制定错误处理策略,但是这种实现方式也不像try?你也可以修改tryit函数,让它也能接受做错误处理的代码块,但因为要处理两种不同的代码块,这个函数就会变得相当臃肿。如果要用try而且又需要进行错误处理的话,你就必须得用do-catch或者像结果枚举之类的其它方法了。

  8. The Swift Programming Language 翻译 —— 错误处理

    Swift支持抛出、捕获、传递和操作等四种方式来处理程序运行时出现的可恢复性错误。表示错误类型在Swift中,错误类型用继承了ErrorType协议的类型来表示。Swift中处理错误的方式有如下四种:使用throw关键字继续向上传递这个错误、使用do-catch表达式处理这个错误、使用try?下面例子中的buyFavoriteSnack方法调用了vend方法,任何vend方法抛出的错误都将传递给他,他选择继续向上传递这些错误。x和y的类型是someThrowingFunction()的返回值类型对应的可选

  9. Swift 2 jSON Call can throw but it is not marked with try

    NSDictionary第一种用法:第二种用法:letjsonData=tryNSJSONSerialization.JSONObjectWithData(urlData!

  10. Swift2.0提供所try catch异常捕捉

    原代码中,AVAudioPlayer的构造函数有了可抛出错误的重载函数,现在的原型不接受第二个error参数,函数不再为failable,应使用trycatch捕捉异常

随机推荐

  1. bluetooth-lowenergy – Altbeacon库无法在Android 5.0上运行

    昨天我在Nexus4上获得了Android5.0的更新,并且altbeacon库停止了检测信标.似乎在监视和测距时,didEnterRegion和didRangeBeaconsInRegion都没有被调用.即使RadiusNetworks的Locate应用程序现在表现不同,一旦检测到信标的值,它们就不再得到更新,并且通常看起来好像信标超出了范围.我注意到的一点是,现在在logcat中出现以下行“B

  2. android – react-native动态更改响应者

    我正在使用react-native进行Android开发.我有一个视图,如果用户长按,我想显示一个可以拖动的动画视图.我可以使用PanResponder实现这一点,它工作正常.但我想要做的是当用户长按时,用户应该能够继续相同的触摸/按下并拖动新显示的Animated.View.如果您熟悉Google云端硬盘应用,则它具有类似的功能.当用户长按列表中的任何项目时,它会显示可拖动的项目.用户可以直接拖

  3. android – 是否有可能通过使用与最初使用的证书不同的证书对其进行签名来发布更新的应用程序

    是否可以通过使用与最初使用的证书不同的证书进行签名来发布Android应用程序的更新?我知道当我们尝试将这样的构建上传到市场时,它通常会给出错误消息.但有没有任何出路,比如将其标记为主要版本,指定市场中的某个地方?解决方法不,你不能这样做.证书是一种工具,可确保您是首次上传应用程序的人.所以总是备份密钥库!

  4. 如何检测Android中是否存在麦克风?

    ..所以我想在让用户访问语音输入功能之前检测麦克风是否存在.如何检测设备上是否有麦克风.谢谢.解决方法AndroidAPI参考:hasSystemFeature

  5. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

  6. android – 获得一首歌的流派

    我如何阅读与歌曲相关的流派?我可以读这首歌,但是如何抓住这首歌的流派,它存放在哪里?解决方法检查此代码:

  7. android – 使用textShadow折叠工具栏

    我有一个折叠工具栏的问题,在展开状态我想在文本下面有一个模糊的阴影,我使用这段代码:用:我可以更改textColor,它可以工作,但阴影不起作用.我为阴影尝试了很多不同的值.是否可以为折叠文本投射阴影?

  8. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  9. android – 为NumberPicker捕获键盘’Done’

    我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.(我知道,这个对话框还没有做它应该保留暂停和恢复状态的事情.)我想在软键盘或其他IME上执行“完成”操作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.看起来处理IME“Done”的最佳方法通常是在TextView上使用setonEditorActionListener.但我没有任何Te

  10. android – 想要在调用WebChromeClient#onCreateWindow时知道目标URL

    当我点击一个带有target=“_blank”属性的超链接时,会调用WebChromeClient#onCreateWindow,但我找不到新的窗口将打开的新方法?主页url是我唯一能知道的东西?我想根据目标网址更改应用行为.任何帮助表示赞赏,谢谢!

返回
顶部