我是android studio和java的新手。我正在使用语音识别制作应用程序。该应用程序运行正常,但我决定调查此问题。
STT dialog screen after button is pressed
blank background layout if user pressed back or touch outside the STT dialog
如果用户说了什么,活动就可以了。但是,如果用户在对话框外按下或触摸。显示了一个我想避免的空白布局。
此STT活动将通过小部件和应用活动进行调用。
清单中的STT活动
<activity
android:name=".RecordActivity"
android:label="@string/title_record"
android:theme="@android:style/Theme.Dialog" />
通过Widget启动STT
Intent popUpIntent = new Intent(context, RecordActivity.class);
popUpIntent.setAction("com.XXX.XXX.FROM_WIDGET");
popUpIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
popUpIntent.putExtra("fileName", recordFile.getAbsolutePath());
context.startActivity(popUpIntent);
通过活动启动STT
Intent popUpIntent = new Intent(this, RecordActivity.class);
popUpIntent.putExtra("fileName", recordFile.getAbsolutePath());
startActivityForResult(popUpIntent , START_RECORD);
STT活动:
public class RecordActivity extends Activity implements RecognitionListener {
//
private static final int REQUEST_SPEECH_TO_TEXT = 1;
private String fileName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
promptSpeechInput();
// Read Filename
Intent intent = getIntent();
fileName = intent.getStringExtra("fileName");
}
public void onSubmit(View view) {
finish();
}
/**
* Receiving speech input
* */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_SPEECH_TO_TEXT: {
if (resultCode == RESULT_OK && null != data) {
// the resulting text is in the getExtras:
Bundle bundle = data.getExtras();
ArrayList<String> matches = bundle.getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
// Default
contentText = matches.get(0);
Uri audioUri = data.getData();
...
setResult(Activity.RESULT_OK, result);
finish();
}
break;
}
}
}
private void promptSpeechInput() {
Intent voiceIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
voiceIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
voiceIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
voiceIntent.putExtra("android.speech.extra.DICTATION_MODE", true); // can listen for a long time
voiceIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 10000);
voiceIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS, 5000);
voiceIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS, 5000);
voiceIntent.putExtra("android.speech.extra.GET_AUDIO_FORMAT", "audio/AMR");
voiceIntent.putExtra("android.speech.extra.GET_AUDIO", true);
try {
startActivityForResult(voiceIntent, REQUEST_SPEECH_TO_TEXT);
} catch (ActivityNotFoundException a) {
Toast.makeText(getApplicationContext(),
getString(R.string.record_audio_denied),
Toast.LENGTH_SHORT).show();
}
}
@Override
public void onReadyForSpeech(Bundle params) {
}
@Override
public void onBeginningOfSpeech() {
}
@Override
public void onRmsChanged(float rmsdB) {
}
@Override
public void onBufferReceived(byte[] buffer) {
}
@Override
public void onEndOfSpeech() {
}
@Override
public void onError(int error) {
}
@Override
public void onResults(Bundle results) {
}
@Override
public void onPartialResults(Bundle partialResults) {
}
@Override
public void onEvent(int eventType, Bundle params) {
}
}
在此活动中,请原谅我没有删除那些RecognitionListener方法,因为我打算自己嵌入这些方法,而不是在此活动中使用RecognizerIntent。
实际上,我使用Theme.NoDisplay解决了哔声有效的问题,但STT对话框在出现错误(即没有声音)之前不显示
清单中的STT部分
<activity
android:name=".RecordActivity"
android:label="@string/title_record"
android:theme="@android:style/Theme.NoDisplay" />
在我看来,几乎没有可能的解决方案:
1)也许一些intent.setAction(“”)或intent.setFlags()会有所帮助 - 大部分是可以实现的
2)“@ android:style / Theme.NoDisplay”实际上可能有用 - 首选
3)在touchizerIntent中添加finish()触摸动作和OnBackpressed - 不太喜欢
4)实现RecognitionListener - 如果以上都不起作用,我将采用这种方式。
5)在后台使用STT作为服务 - 需要更多的工作
=============================================== ================================
好的,谢谢你指出this link和我的选项(4)相同然后我有一些问题通过制作我自己的RecognitionListener来获取音频数据......(对不起,我不需要提及来自RecognizerIntent的文本和音频输出...问题后的问题),我已经用几行获取文本和音频来更新我的活动代码......
在我看来,为了获得音频数据,这种方法缺乏明显的资源。但是从this link我正在看一些代码示例,RecognitionService.Callback说关于bufferReceived
和RecognitionService.Callback是我现在想要了解的。
但回到这个问题,我想知道是否有人可以为我的问题提出一个更简单的方法,因为如果没有,我可能会提出选项6.
6)放置一个花哨的自定义布局来替换空白布局