当前位置: 首页 > 知识库问答 >
问题:

语音识别对话框显示网络未连接

易炳
2023-03-14

我正在制作一个使用语音识别的应用程序。它与Android KitKat 4.4.4(API 19)完美配合。但是当我在Nouget 7.0(API 24)或Lollipop语音识别对话框上尝试时,会显示网络未连接。

我有internet连接,并且在清单中添加了权限。可能是什么问题?

这是我的清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.woop.loudness">

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


<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".WebList" android:label="@string/app_name" />
    <activity android:name=".AddWeb" android:label="@string/app_name" />
    <!--<service android:enabled="true" android:name=".UartService" />-->
</application>

</manifest>

根据要求,我的主要活动:

public class MainActivity extends AppCompatActivity {

DBHelper myDb;

public int i;
public int b;

private static final int sampleRate = 44100;
private static final int bufferSizeFactor = 10;
public static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;
private final int MY_PERMISSIONS_RECORD_AUDIO = 1;

private AudioRecord audio;
private int bufferSize;
private ProgressBar level;
private Handler handler = new Handler();
private int lastLevel = 0;
Button btnView;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    myDb = new DBHelper(this);

    btnView = (Button) findViewById(R.id.button2);

    level = (ProgressBar) findViewById(R.id.progressbar_level);
    level.setMax(32676);

    bufferSize = AudioRecord.getMinBufferSize(sampleRate,
            AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT) * bufferSizeFactor;


    requestAudioPermissions();
        //audio.startRecording();

        Thread thread = new Thread(new Runnable() {
            public void run() {
                readAudioBuffer();
            }
        });

        thread.setPriority(Thread.currentThread().getThreadGroup().getMaxPriority());
        thread.start();

        handler.postDelayed(update, 100);


    btnView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent intent = new Intent(MainActivity.this, WebList.class);
            startActivity(intent);
        }
    });
}

private void readAudioBuffer() {
    try {
        short[] buffer = new short[bufferSize];
        int bufferReadResult;
        do {
            bufferReadResult = audio.read(buffer, 0, bufferSize);
            for (int i = 0; i < bufferReadResult; i++){
                if (buffer[i] > lastLevel) {
                    lastLevel = buffer[i];
                }
            }
            // if sound level is over 20000 start voice recognition
            if (lastLevel > 20000){
                lastLevel = 0;
                startVoiceRecognitionActivity();
                Thread.sleep(7000);
            }

        } while (bufferReadResult > 0 && audio.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void startVoiceRecognitionActivity() {


    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
            "Kalbėkite");
    startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
}

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

    if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {
        ArrayList matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);

        i = 0;


        if (matches.contains("Add") || matches.contains("add") || matches.contains("Pridėti") || matches.contains("pridėti")) {
            startActivity(new Intent(this, WebList.class));
        }

        if (matches.contains("List") || matches.contains("list") || matches.contains("Sąrašas") || matches.contains("sąrašas")) {
            startActivity(new Intent(this, AddWeb.class));
        }

        // Atidaro internetini puslapi
        Cursor web = myDb.getAllData();
                while (web.moveToNext()) {
                    if (matches.contains(web.getString(2))) {
                        b = i;
                        goToUrl();
                    }
                    i++;
                }
    }
}

private void goToUrl () {
    int temp = 0;
    WebView webview = new WebView(this);
    setContentView(webview);
    Cursor web = myDb.getAllData();
    while (web.moveToNext()) {
        if (temp == b) {
            webview.loadUrl("https://" + web.getString(1));
        }
        temp++;
    }
}

//delete this in final product
private Runnable update = new Runnable() {
    public void run() {
        MainActivity.this.level.setProgress(lastLevel);
        lastLevel *= .5;
        handler.postAtTime(this, SystemClock.uptimeMillis() + 500);
    }
};


private void requestAudioPermissions() {
    if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.RECORD_AUDIO)
            != PackageManager.PERMISSION_GRANTED) {

        //When permission is not granted by user, show them message why this permission is needed.
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.RECORD_AUDIO)) {
            Toast.makeText(this, "Please grant permissions to record audio", Toast.LENGTH_LONG).show();

            //Give user option to still opt-in the permissions
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.RECORD_AUDIO},
                    MY_PERMISSIONS_RECORD_AUDIO);

        } else {
            // Show user dialog to grant permission to record audio
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.RECORD_AUDIO},
                    MY_PERMISSIONS_RECORD_AUDIO);
        }
    }
    //If permission is granted, then go ahead recording audio
    else if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.RECORD_AUDIO)
            == PackageManager.PERMISSION_GRANTED) {


        audio = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate,
                AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
                bufferSize);
        //Go ahead with recording audio now
        audio.startRecording();
    }
}
}

共有1个答案

黎同
2023-03-14

我已复制了您的代码,您遇到错误,请停止调试“选定的应用程序”

原因:com.google.Android应用程序。gsa。已共享。例外GsaIOException:错误代码:393237 |错误代码:393222 |无法开始录制,状态为:1

这是因为您仍在录制/捕获主要活动中的数据,而没有释放音频,我在此处添加了它,它工作正常,但不要忘记再次重新启动它

public void startVoiceRecognitionActivity() {

audio.stop();
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
    RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
    "Kalbėkite");
startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
}
 类似资料:
  • 我会尝试在没有Google对话框的情况下使用语音识别,但在启动应用程序时不会只发出哔哔声。我在清单文件中添加了权限音频记录和Internet。我希望你告诉我并帮助我找到错误...我在Log cat上没有错误...我想在用户打招呼时循环一个Toast显示一个Mesage Regognition OK,列表视图显示结果。

  • 在Netbeans中,我创建了一个GUI项目,该项目使用框架前端,我可以添加组件并双击以编辑其事件。我指的是有“源”、“设计”和“历史”选项卡的窗口。 以下是组件和关系: 1-打开文件选择器的按钮。 2-显示文件选择器结果的文本区域。如果用户选择一个文件,它将在文本区域显示文件名;否则它会写“被用户取消”。 3-同时,如果用户选择了一个文件,我想打开一个“please wait”(请等待)对话框,

  • im a<代码>。Net(Asp.Net)开发者和我迫切需要在我的一个网站上使用语音识别 但问题是,无论我在哪里读到这两个平台中的任何一个,我都会发现这一点。Net的替代方案需要在连续听写之前进行培训,我倾向于选择这一个,因为我已经是一个。Net开发人员<我在哪里也找不到这两者之间的比较<我不介意为中的狮身人面像设计一个包装。Net或使用已有的几种方法中的一种,但值得吗 存在比较的链接 或者可能同

  • 如何使用REST API(带javascript SDK)Bing语音API实现连续语音识别? 使用do Javascript SDK示例:https://github.com/Microsoft/Cognitive-Speech-STT-JavaScript只能用麦克风转录短句

  • 由于连接到不同的API,我目前正在开发一个工具,允许我阅读所有的通知。 它工作得很好,但现在我想用一些声音命令来做一些动作。 就像当软件说“一封来自Bob的邮件”时,我想说“阅读”或“存档”。 我的软件是通过一个节点服务器运行的,目前我没有任何浏览器实现,但它可以是一个计划。 在NodeJS中,启用语音到文本的最佳方式是什么? 我在它上面看到了很多线程,但主要是使用浏览器,如果可能的话,我希望在一

  • 语音识别是以语音为研究对象,通过语音信号处理和模式识别让机器自动识别和理解人类口述的语言。语音识别技术就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的高技术。语音识别是一门涉及面很广的交叉学科,它与声学、语音学、语言学、信息理论、模式识别理论以及神经生物学等学科都有非常密切的关系。语音识别技术正逐步成为计算机信息处理技术中的关键技术,语音技术的应用已经成为一个具有竞争性的新兴高技术产