Flutter语音识别插件ifly_speech_recognition的使用

Flutter语音识别插件ifly_speech_recognition的使用

根据科大讯飞的语音听写(流式版)WebAPI文档,实现60秒的语音识别功能。

安装

dependencies:
  ifly_speech_recognition: ^1.0.5

导入

import 'package:ifly_speech_recognition/ifly_speech_recognition.dart';

配置

  • 由于依赖flutter_sound此三方库,所以iOS需要添加对应配置:

    • XCode > Build Settings > Other Linker Flags: -lc++ -lstd++
  • 如果添加两个库后,出现error: ld: library not found for -lstd++,则可以只添加-lc++

使用

使用前说明:

  1. app_id app_key app_secret 需要到科大讯飞开放平台进行应用申请。
  2. 开启语音识别前,请确保麦克风相关权限的开启,具体可参考:permission_handler
初始化一个服务
SpeechRecognitionService _recognitionService = SpeechRecognitionService(
  appId: 'iflyAppId',
  appKey: 'iflyApiKey',
  appSecret: 'iflyApiSecret',
);

// 初始化语音识别服务
_recognitionService.initRecorder();
语音识别监听回调
// 语音识别回调
// 注意:必须在 [speechRecognition] 方法调用之前监听
_recognitionService.onRecordResult().listen((message) {
  // 语音识别成功,结果为 message

}, onError: (err) {
  // 语音识别失败,原因错误为 err

});

// 注意:必须在 [speechRecognition] 方法调用之前监听
_recognitionService.onStopRecording().listen((isAutomatic) {
  if (isAutomatic) {
    // 录音时间到达最大值60秒,自动停止

  } else {
    // 主动调用 stopRecord,停止录音

  }
});
开启录音
_recognitionService.startRecord();
停止录音
_recognitionService.stopRecord();
开始识别(主动调用)
_recognitionService.speechRecognition();

完整示例Demo

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:ifly_speech_recognition/ifly_speech_recognition.dart';
import 'package:permission_handler/permission_handler.dart';

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(),
      builder: EasyLoading.init(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  /// 语音识别
  SpeechRecognitionService _recognitionService = SpeechRecognitionService(
    appId: 'iflyAppId',
    appKey: 'iflyApiKey',
    appSecret: 'iflyApiSecret',
  );

  /// 麦克风是否授权
  bool _havePermission = false;

  /// 识别结果
  String? _result;

  [@override](/user/override)
  void initState() {
    super.initState();

    _initRecorder();
  }

  [@override](/user/override)
  dispose() {
    _recognitionService.dispose();
    super.dispose();
  }

  /// 获取/判断权限
  Future<bool> _checkPermission() async {
    final status = await Permission.microphone.status;
    if (!status.isGranted) {
      // 无权限,则请求权限
      PermissionStatus requestStatus = await Permission.microphone.request();
      return requestStatus == PermissionStatus.granted;
    } else {
      return true;
    }
  }

  /// 初始化语音转文字
  void _initRecorder() async {
    _havePermission = await _checkPermission();

    if (!_havePermission) {
      // 授权失败
      EasyLoading.showToast('请开启麦克风权限');
      return;
    }

    // 初始化语音识别服务
    await _recognitionService.initRecorder();

    // 语音识别回调
    _recognitionService.onRecordResult().listen((message) {
      EasyLoading.dismiss();
      setState(() {
        _result = message;
      });
    }, onError: (err) {
      EasyLoading.dismiss();
      debugPrint(err);
    });

    // 录音停止
    _recognitionService.onStopRecording().listen((isAutomatic) {
      if (isAutomatic) {
        // 录音时间到达最大值60秒,自动停止
      } else {
        // 主动调用 stopRecord,停止录音
      }
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('语音听写'),
      ),
      body: Center(
        child: Column(
          children: [
            ElevatedButton(
              onPressed: _startRecord,
              child: Text('开始录音'),
            ),
            ElevatedButton(
              onPressed: _stopRecord,
              child: Text('停止录音'),
            ),
            Padding(
              padding: const EdgeInsets.symmetric(vertical: 50),
              child: Text(_result ?? ''),
            ),
          ],
        ),
      ),
    );
  }

  /// 开始录音
  void _startRecord() async {
    if (!_havePermission) {
      EasyLoading.showToast('请开启麦克风权限');
      return;
    }

    EasyLoading.show(status: '正在录音');
    final r = await _recognitionService.startRecord();
    debugPrint('开启录音: $r');
  }

  /// 结束录音
  void _stopRecord() async {
    if (!_havePermission) {
      EasyLoading.showToast('请开启麦克风权限');
      return;
    }

    final r = await _recognitionService.stopRecord();
    debugPrint('关闭录音: $r');

    // 识别语音
    EasyLoading.show(status: 'loading...');
    _recognitionService.speechRecognition();
  }
}

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

1 回复

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


当然,以下是如何在Flutter应用中使用ifly_speech_recognition插件进行语音识别的代码示例。这个插件是用于集成科大讯飞(iFLYTEK)语音识别服务的。

首先,确保你已经在pubspec.yaml文件中添加了ifly_speech_recognition依赖:

dependencies:
  flutter:
    sdk: flutter
  ifly_speech_recognition: ^最新版本号 # 请替换为实际最新版本号

然后,运行flutter pub get来获取依赖。

接下来,是具体的代码实现。在这个例子中,我们将展示如何初始化插件、开始语音识别、停止语音识别以及处理识别结果。

1. 导入必要的包

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

2. 创建一个Flutter应用并添加必要的UI组件

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SpeechRecognitionPage(),
    );
  }
}

class SpeechRecognitionPage extends StatefulWidget {
  @override
  _SpeechRecognitionPageState createState() => _SpeechRecognitionPageState();
}

class _SpeechRecognitionPageState extends State<SpeechRecognitionPage> {
  final IflySpeechRecognition _iflySpeechRecognition = IflySpeechRecognition();
  String _recognitionResult = '';

  @override
  void initState() {
    super.initState();
    // 初始化插件,配置参数如APPID等(请替换为你的实际APPID)
    _iflySpeechRecognition.init({
      'appid': '你的APPID',
      'language': 'zh_cn', // 中文
      'accent': 'mandarin', // 普通话
      'vad_eos': 3000, // 语音尾端静音检测时间(毫秒)
      'sample_rate': 16000, // 采样率
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('语音识别示例'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              '识别结果: $_recognitionResult',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                // 开始语音识别
                await _startRecognition();
              },
              child: Text('开始识别'),
            ),
            SizedBox(height: 10),
            ElevatedButton(
              onPressed: () async {
                // 停止语音识别
                await _stopRecognition();
              },
              child: Text('停止识别'),
            ),
          ],
        ),
      ),
    );
  }

  Future<void> _startRecognition() async {
    try {
      // 开始监听语音输入
      _iflySpeechRecognition.startListening(
        onVolumeChanged: (volume) {
          // 音量变化回调(可选)
          print('音量: $volume');
        },
        onResult: (result, isLast) {
          // 识别结果回调
          setState(() {
            _recognitionResult += result;
            if (isLast) {
              _recognitionResult += '\n'; // 结果结束,换行
            }
          });
        },
        onError: (error) {
          // 错误回调
          print('错误: $error');
        },
      );
    } catch (e) {
      print('开始识别失败: $e');
    }
  }

  Future<void> _stopRecognition() async {
    try {
      // 停止监听语音输入
      await _iflySpeechRecognition.stopListening();
    } catch (e) {
      print('停止识别失败: $e');
    }
  }
}

3. 配置Android和iOS项目

Android:

android/app/src/main/AndroidManifest.xml中添加必要的权限:

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

并在android/app/build.gradle中添加以下内容以支持多DEX文件(如果需要):

android {
    ...
    defaultConfig {
        ...
        multiDexEnabled true
    }
}

iOS:

ios/Runner/Info.plist中添加麦克风权限请求:

<key>NSMicrophoneUsageDescription</key>
<string>应用需要访问麦克风以进行语音识别</string>

确保你已经按照科大讯飞的开发者文档完成了其他必要的配置,比如获取APPID并配置相关的服务。

以上就是在Flutter中使用ifly_speech_recognition插件进行语音识别的完整示例。这个示例包括了初始化插件、开始和停止语音识别以及处理识别结果的基本流程。

回到顶部