Xamarin Android应用SpeechRecognitionEngine不支持报错问题咨询
Xamarin Android语音识别功能实现方案
报错原因说明
你调用的SpeechRecognitionEngine属于.NET Framework提供的Windows平台专属语音API,仅适配Windows桌面环境,没有做Android平台的原生实现,因此会抛出"Speech is not supported in this platform"错误。而TextToSpeech功能正常是因为Xamarin官方对Android原生TTS接口做了跨平台适配,二者不属于同一套API体系。
替代实现方案
Xamarin.Android已经原生绑定了Android系统提供的SpeechRecognizer组件,功能和SpeechRecognitionEngine一致,支持实时语音监听、离线/在线识别,实现步骤如下:
1. 配置权限
在AndroidManifest.xml中添加必备权限:
- 静态声明权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 若使用云端识别需额外添加 --> <uses-permission android:name="android.permission.INTERNET" />
- Android 6.0及以上版本需在运行时动态申请
RECORD_AUDIO权限,获得用户授权后才能启动识别。
2. 核心功能实现
第一步:检查设备支持性
部分定制ROM可能裁剪了系统语音识别组件,启动前先做校验:
if (!SpeechRecognizer.IsRecognitionAvailable(this)) { // 提示用户当前设备不支持语音识别 return; }
第二步:构造识别意图
var speechIntent = new Intent(RecognizerIntent.ActionRecognizeSpeech); // 设置识别模式为自由语音,适配无预设语法的通用识别场景 speechIntent.PutExtra(RecognizerIntent.ExtraLanguageModel, RecognizerIntent.LanguageModelFreeForm); // 设置识别语言,可指定为zh-CN、en-US等,默认用系统当前语言 speechIntent.PutExtra(RecognizerIntent.ExtraLanguage, Java.Util.Locale.Default.ToString()); // 开启临时结果返回,满足实时监听、边说边识别的需求 speechIntent.PutExtra(RecognizerIntent.ExtraPartialResults, true);
第三步:初始化识别器并启动监听
// 实例化语音识别器 var speechRecognizer = SpeechRecognizer.CreateSpeechRecognizer(this); // 设置识别回调监听器 speechRecognizer.SetRecognitionListener(new CustomRecognitionListener()); // 启动监听 speechRecognizer.StartListening(speechIntent);
第四步:实现自定义回调监听
自定义类实现IRecognitionListener接口,处理识别结果、错误、临时返回等逻辑:
public class CustomRecognitionListener : Java.Lang.Object, IRecognitionListener { // 识别完成返回最终结果 public void OnResults(Bundle results) { var matches = results.GetStringArrayList(SpeechRecognizer.ResultsRecognition); if (matches != null && matches.Count > 0) { string finalResult = matches[0]; // 处理最终识别结果 } } // 返回临时识别结果,满足实时监听需求 public void OnPartialResults(Bundle partialResults) { var partialMatches = partialResults.GetStringArrayList(SpeechRecognizer.ResultsRecognition); if (partialMatches != null && partialMatches.Count > 0) { string partialResult = partialMatches[0]; // 处理实时临时识别结果 } } // 其他接口方法按需实现,比如错误处理、音量变化回调等 public void OnError(int error) { /* 处理识别错误 */ } public void OnReadyForSpeech(Bundle @params) { } public void OnBeginningOfSpeech() { } public void OnRmsChanged(float rmsdB) { } public void OnBufferReceived(byte[] buffer) { } public void OnEndOfSpeech() { } public void OnEvent(int eventType, Bundle @params) { } }
注意事项
- 若需要使用离线识别,需提前引导用户在系统设置的「语言和输入法-语音识别」板块下载对应语言的离线识别包
- 若需要后台长期监听语音,需启动前台服务避免应用被系统回收,同时要处理权限被用户关闭、录音被其他应用占用的异常场景
内容的提问来源于stack exchange,提问作者He4ToEnT
相关产品推荐
相关产品推荐

