You need to enable JavaScript to run this app. Xamarin Android应用SpeechRecognitionEngine不支持报错问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 14:06:03