Flutter语音识别插件speech_xf的使用

Flutter语音识别插件speech_xf的使用

该插件集成了讯飞语音识别和语音合成功能,支持Android和iOS平台。

官网注册

  1. 注册账号 请参阅注册讯飞账号以获取更多信息。

  2. 创建应用并获取AppID

  3. 分别下载Android和iOS端的SDK

Android端配置

  1. 在项目的android/app/main目录下新建Jnilibs目录,并将demo/libs下的arm64-v8aarmeabi-v7a两个目录拷贝进去。

  2. 添加用户权限 在工程AndroidManifest.xml文件中添加如下权限:

<!-- 连接网络权限,用于执行云端语音能力 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!-- 读取网络信息状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 获取当前wifi状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 允许程序改变网络连接状态 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<!-- 读取手机信息权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!-- 读取联系人权限,上传联系人需要用到此权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<!-- 外存储写权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 外存储读权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!-- 配置权限,用来记录应用配置信息 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<!-- 手机定位信息,用来为语义等功能提供定位,提供更精准的服务 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- 如需使用人脸识别,还要添加:摄像头权限,拍照需要用到 -->
<uses-permission android:name="android.permission.CAMERA" />
  1. 添加混淆 如需在打包或者生成APK的时候进行混淆,请在proguard.pro中添加如下代码:
-keep class com.iflytek.**{*;}
-keepattributes Signature

iOS端配置

  1. Info.plist中添加以下权限:
<key>NSMicrophoneUsageDescription</key>
<string></string>
<key>NSLocationUsageDescription</key>
<string></string>
<key>NSLocationAlwaysUsageDescription</key>
<string></string>
<key>NSContactsUsageDescription</key>
<string></string>

注:建议真机测试。如果非要用模拟器,则使用Xcode打开项目。在Build Settings中找到Excluded Architectures,在debug中添加支持arm64架构。

添加依赖

pubspec.yaml文件中添加依赖:

dependencies:
  speech_xf: ^1.3.0

使用

初始化

void initSdk() async {
  await SpeechXf.init('这里是你在讯飞平台申请的appid');
}

使用内置界面

await SpeechXf.openNativeUIDialog(
  isDynamicCorrection: true,
  language: settingResult['language'],
  vadBos: settingResult['vadBos'],
  vadEos: settingResult['vadEos'],
  ptt: settingResult['ptt'],
);

无界面语音识别

await SpeechXf.startListening(
  isDynamicCorrection: false,
  language: settingResult['language'],
  vadBos: settingResult['vadBos'],
  vadEos: settingResult['vadEos'],
  ptt: settingResult['ptt'],
);

停止

await SpeechXf.stopListening();

取消

await SpeechXf.cancelListening();

语音听写结果监听

SpeechXf().onResult().listen((event) {
  if (event.error != null) {
    showToast(event.error!, position: ToastPosition.bottom);
  } else {
    if (event.result != null) {
      speechController.text = speechController.text + event.result!;
    }
    if (event.isLast == true) {
      showToast('结束说话...', position: ToastPosition.bottom);
    }
  }
});

上传用户热词

await SpeechXf.uploadUserWords(userWords);

音频流识别

await SpeechXf.audioRecognizer('iattest.wav');

开始语音合成

await SpeechXf.startSpeaking();

取消语音合成

await SpeechXf.stopSpeaking();

暂停语音合成

await SpeechXf.pauseSpeaking();

继续语音合成

await SpeechXf.resumeSpeaking();

循环播放(在initState中)

SpeechXf.onLoopSpeakingListener(
  onCompeleted: (onCompeleted) async {
    await startSpeaking();
  },
);

销毁语音合成器

SpeechXf.ttsDestroy();

销毁语音识别器

SpeechXf.iatDestroy();

音量变化回调

SpeechXf.onVolumeChanged(
  volume: (v) {
    showToast('当前音量:$v');
  },
  bytes: (bytes) {},
);

示例代码

以下是完整的示例代码,可以在example/lib/main.dart中找到。

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:oktoast/oktoast.dart';
import 'package:speech_xf_example/home_page.dart';

void main() {
  runApp(const MyApp());
  // 设置沉浸式状态栏,颜色透明
  SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values);
  SystemUiOverlayStyle systemUiOverlayStyle = const SystemUiOverlayStyle(
    statusBarColor: Colors.transparent,
    statusBarBrightness: Brightness.light, // 白色图标
    systemNavigationBarColor: Colors.white,
  );
  SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return OKToast(
      backgroundColor: const Color(0xFF3A3A3A),
      position: ToastPosition.center,
      radius: 8,
      textPadding: const EdgeInsets.symmetric(horizontal: 20, vertical: 14),
      child: MaterialApp(
        theme: ThemeData(useMaterial3: true),
        home: Scaffold(
          resizeToAvoidBottomInset: false,
          body: GestureDetector(
            onTap: () {
              FocusScopeNode currentFocus = FocusScope.of(context);
              if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) {
                FocusManager.instance.primaryFocus?.unfocus();
              }
            },
            child: const HomePage(),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter语音识别插件speech_xf的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter语音识别插件speech_xf的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用speech_xf插件进行语音识别的代码示例。speech_xf是一个用于实现语音识别功能的Flutter插件,支持Android和iOS平台。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加speech_xf的依赖:

dependencies:
  flutter:
    sdk: flutter
  speech_xf: ^最新版本号  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 导入插件

在你的Dart文件中导入插件:

import 'package:speech_xf/speech_xf.dart';

3. 请求权限(Android)

在Android上,你需要在AndroidManifest.xml中添加语音识别所需的权限:

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

此外,你还需要在运行时请求权限(例如使用permission_handler插件):

import 'package:permission_handler/permission_handler.dart';

// 请求权限
Future<void> requestPermissions() async {
  bool hasPermission = await Permission.microphone.status.isGranted;
  if (!hasPermission) {
    var status = await Permission.microphone.request();
    if (!status.isGranted) {
      // 处理权限被拒绝的情况
    }
  }
}

4. 使用语音识别功能

下面是一个完整的示例,展示如何使用speech_xf插件进行语音识别:

import 'package:flutter/material.dart';
import 'package:speech_xf/speech_xf.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Speech Recognition Demo'),
        ),
        body: Center(
          child: MyHomePage(),
        ),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _result = '';

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('语音识别结果: $_result'),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: _startListening,
          child: Text('开始语音识别'),
        ),
      ],
    );
  }

  Future<void> _startListening() async {
    try {
      // 开始语音识别
      String result = await SpeechXf.startListening();
      setState(() {
        _result = result;
      });
    } catch (e) {
      print('语音识别错误: $e');
    }
  }
}

注意事项

  1. 权限处理:确保在Android和iOS上都正确请求并处理权限。
  2. 错误处理:在生产代码中,添加更多的错误处理逻辑,以处理各种可能的异常情况。
  3. UI更新:在实际应用中,你可能需要更复杂的UI来显示识别结果或处理不同的状态。

通过以上步骤,你就可以在Flutter项目中使用speech_xf插件实现语音识别功能了。

回到顶部