Java Android上的语音到文本

Java Android上的语音到文本,java,android,speech-recognition,speech,speech-to-text,Java,Android,Speech Recognition,Speech,Speech To Text,我期待着创建一个应用程序,其中有语音到文本 我意识到使用识别器的这种能力意图: 然而,我不想弹出一个新的意图,我想在我当前的应用程序中对某些点进行分析,我不希望它弹出一些东西,说明它正在尝试录制你的声音 有人知道如何最好地做到这一点吗。我可能正在考虑尝试Sphinx4——但我不知道它是否能在Android上运行——有人有任何建议或经验吗 我想知道是否可以修改这里的代码,使其不必费心显示UI或按钮,只需进行处理: 干杯,安卓内置的(通过intent启动的)是一个客户端活动,它捕获您的语音并将音频发

我期待着创建一个应用程序,其中有语音到文本

我意识到使用识别器的这种能力意图:

然而,我不想弹出一个新的意图,我想在我当前的应用程序中对某些点进行分析,我不希望它弹出一些东西,说明它正在尝试录制你的声音

有人知道如何最好地做到这一点吗。我可能正在考虑尝试Sphinx4——但我不知道它是否能在Android上运行——有人有任何建议或经验吗

我想知道是否可以修改这里的代码,使其不必费心显示UI或按钮,只需进行处理:


干杯,

安卓内置的(通过intent启动的)是一个客户端活动,它捕获您的语音并将音频发送到谷歌服务器进行识别。你可以建造类似的东西。你可以自己主持sphinx(或使用云识别服务,如Yapme.com),自己捕获语音,将音频发送到识别器,并将文本结果返回到你的应用程序。我不知道有什么方法可以在不使用安卓系统(或通过Chrome)的情况下利用谷歌识别服务

到目前为止,我所看到的普遍共识是,今天的智能手机没有足够的马力来进行斯芬克斯式的语音识别。您可能希望自己探索运行客户端识别器,但Google使用服务器识别

有关某些相关信息,请参阅:


如果您不想使用
RecognizerIntent
进行语音识别,您仍然可以使用该类进行语音识别。但是,使用该类比使用intent要复杂一点。作为最后一点,我强烈建议用户知道他被录制的时间,否则当他最终发现的时候,他可能会非常激动

编辑:一个小例子,灵感来自(但有所改变),

Intent Intent=新的意图(RecognizerIntent.ACTION\u recognizer\u SPEECH);
intent.putExtra(识别器intent.EXTRA_语言_模型,
识别者意图、语言、模型、自由形式);
intent.putExtra(识别器intent.EXTRA_调用_包,
“com.domain.app”);
语音识别器识别器=语音识别器
.createSpeechRecognizer(this.getApplicationContext());
RecognitionListener=新建RecognitionListener(){
@凌驾
公共结果(捆绑结果){
ArrayList voiceResults=结果
.getStringArrayList(SpeechRecognitor.RESULTS_RECOGNITION);
如果(voiceResults==null){
System.out.println(“无语音结果”);
}否则{
System.out.println(“打印匹配:”);
for(字符串匹配:voiceResults){
系统输出打印项次(匹配);
}
}
}
@凌驾
ReadyForSpeech上的公共void(Bundle参数){
System.out.println(“准备发言”);
}
/**
*错误\网络\超时=1;
*误差_网络=2;
*错误_AUDIO=3;
*错误_SERVER=4;
*错误_CLIENT=5;
*错误\语音\超时=6;
*错误\u不匹配=7;
*错误识别器忙=8;
*错误\u权限不足\u=9;
*
*@param错误代码在SpeechRecognitor中定义
*/
@凌驾
公共无效onError(内部错误){
System.err.println(“语音监听错误:+错误”);
}
@凌驾
开始时的公共无效fSpeech(){
System.out.println(“语音启动”);
}
@凌驾
已接收公共无效onBufferReceived(字节[]缓冲区){
//TODO自动生成的方法存根
}
@凌驾
公共无效onEndOfSpeech(){
//TODO自动生成的方法存根
}
@凌驾
public void onEvent(int eventType,Bundle参数){
//TODO自动生成的方法存根
}
@凌驾
public void onPartialResults(Bundle partialResults){
//TODO自动生成的方法存根
}
@凌驾
在RMSCHANGED上的公共无效(浮动rmsdB){
//TODO自动生成的方法存根
}
};
识别器。setRecognitionListener(listener);
识别器。惊人监听(意图);
重要提示:从UI线程运行此代码,并确保您具有所需的权限

<uses-permission android:name="android.permission.RECORD_AUDIO" />

在活动中执行以下操作:

Image button buttonSpeak = findView....;// initialize it.
buttonSpeak.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            promptSpeechInput();
        }
    });



private void promptSpeechInput() {
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
            getString(R.string.speech_prompt));
    try {
        startActivityForResult(intent, REQ_CODE_SPEECH_INPUT);
    } catch (ActivityNotFoundException a) {
        Toast.makeText(getApplicationContext(),
                getString(R.string.speech_not_supported),
                Toast.LENGTH_SHORT).show();
    }
}

    @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent 
     data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
        case REQ_CODE_SPEECH_INPUT: {
            if (resultCode == RESULT_OK && null != data) {

                result = data
                        .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);

      EditText input ((EditText)findViewById(R.id.editTextTaskDescription));
      input.setText(result.get(0)); // set the input data to the editText alongside if want to.

            }
            break;
        }

    }
}

添加对清单的权限:-

"android.permission.RECORD_AUDIO"
单击按钮时调用getSpeechInput()(使用侦听器)

public void getSpeechInput(){
意向意向=新意向(识别意向、行动、识别言语);
intent.putExtra(RecognizerIntent.EXTRA语言模型,RecognizerIntent.LANGUAGE模型自由形式);
intent.putExtra(RecognizerIntent.EXTRA_语言,Locale.getDefault());
if(intent.resolveActivity(getPackageManager())!=null){
startActivityForResult(意向,10);
}否则{
Toast.makeText(这是“您的设备不支持语音输入”,Toast.LENGTH_SHORT).show();
}
}
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
开关(请求代码){
案例10:
if(resultCode==RESULT\u OK&&data!=null){
ArrayList结果=data.getStringArrayListExtra(RecognizerIntent.EXTRA_结果);
Toast.makeText(this,result.get(0),Toast.LENGTH_SHORT.show();
}
打破
}
}

您是否试图询问是否需要在不调用UI的情况下录制语音。我想在不调用典型的speak now UI的情况下对文本进行语音转换-我想在我当前运行的应用程序的背景下完成。嘿-是的,他们会知道-这将是您看到的游戏的一部分-因此很明显,他们会想说话在这些特定点上。语音识别器类可能是我想要使用的-但是我喜欢它的使用示例?有一个!?我添加了一个小示例。这条路通畅
"android.permission.RECORD_AUDIO"
public void getSpeechInput() {

    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());

    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, 10);
    } else {
        Toast.makeText(this, "Your Device Don't Support Speech Input", Toast.LENGTH_SHORT).show();
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
        case 10:
            if (resultCode == RESULT_OK && data != null) {
                ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                Toast.makeText(this, result.get(0), Toast.LENGTH_SHORT).show();

            }
            break;
    }
}