Flutter语音识别插件flutter_speech的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter语音识别插件flutter_speech的使用

插件简介

flutter_speech_recognition 是基于 rxlabz plugin 的Objective C和Java Flutter插件,用于在iOS10+/Android 4.1+和MacOS 10.15+上使用语音识别功能。

设置

iOS 和 MacOS

需要在 Info.plist 文件中添加以下键值对:

<key>NSMicrophoneUsageDescription</key>
<string>本应用需要访问您的麦克风</string>
<key>NSSpeechRecognitionUsageDescription</key>
<string>本应用需要语音识别权限</string>

Android

无需额外设置。

使用方法

以下是flutter_speech_recognition插件的基本使用方法,包括初始化、监听语音识别结果等操作。下面给出一个完整的示例代码,帮助您快速上手。

示例代码

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

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

const languages = [
  Language('Francais', 'fr_FR'),
  Language('English', 'en_US'),
  Language('Pусский', 'ru_RU'),
  Language('Italiano', 'it_IT'),
  Language('Español', 'es_ES'),
];

class Language {
  final String name;
  final String code;

  const Language(this.name, this.code);
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late SpeechRecognition _speech;

  bool _speechRecognitionAvailable = false;
  bool _isListening = false;

  String transcription = '';
  Language selectedLang = languages.first;

  @override
  void initState() {
    super.initState();
    activateSpeechRecognizer();
  }

  // 初始化语音识别器
  void activateSpeechRecognizer() {
    print('_MyAppState.activateSpeechRecognizer...');
    _speech = SpeechRecognition();
    
    // 设置可用性回调
    _speech.setAvailabilityHandler(onSpeechAvailability);
    // 设置开始识别回调
    _speech.setRecognitionStartedHandler(onRecognitionStarted);
    // 设置识别结果回调
    _speech.setRecognitionResultHandler(onRecognitionResult);
    // 设置识别完成回调
    _speech.setRecognitionCompleteHandler(onRecognitionComplete);
    // 设置错误处理回调
    _speech.setErrorHandler(errorHandler);

    // 激活语音识别器
    _speech.activate(selectedLang.code).then((res) {
      setState(() => _speechRecognitionAvailable = res);
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SpeechRecognition'),
          actions: [
            PopupMenuButton<Language>(
              onSelected: _selectLangHandler,
              itemBuilder: (BuildContext context) => _buildLanguagesWidgets,
            )
          ],
        ),
        body: Padding(
          padding: EdgeInsets.all(8.0),
          child: Center(
            child: Column(
              mainAxisSize: MainAxisSize.min,
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: [
                Expanded(
                  child: Container(
                    padding: const EdgeInsets.all(8.0),
                    color: Colors.grey.shade200,
                    child: Text(transcription),
                  ),
                ),
                _buildButton(
                  onPressed: _speechRecognitionAvailable && !_isListening
                      ? () => start()
                      : null,
                  label: _isListening
                      ? 'Listening...'
                      : 'Listen (${selectedLang.code})',
                ),
                _buildButton(
                  onPressed: _isListening ? () => cancel() : null,
                  label: 'Cancel',
                ),
                _buildButton(
                  onPressed: _isListening ? () => stop() : null,
                  label: 'Stop',
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }

  List<CheckedPopupMenuItem<Language>> get _buildLanguagesWidgets =>
      languages.map((l) => CheckedPopupMenuItem<Language>(
            value: l,
            checked: selectedLang == l,
            child: Text(l.name),
          )).toList();

  void _selectLangHandler(Language lang) {
    setState(() => selectedLang = lang);
  }

  Widget _buildButton({required String label, VoidCallback? onPressed}) => Padding(
        padding: EdgeInsets.all(12.0),
        child: ElevatedButton(
          onPressed: onPressed,
          child: Text(
            label,
            style: const TextStyle(color: Colors.white),
          ),
        ),
      );

  void start() => _speech.activate(selectedLang.code).then((_) {
        return _speech.listen().then((result) {
          print('_MyAppState.start => result $result');
          setState(() {
            _isListening = result;
          });
        });
      });

  void cancel() =>
      _speech.cancel().then((_) => setState(() => _isListening = false));

  void stop() => _speech.stop().then((_) {
        setState(() => _isListening = false);
      });

  void onSpeechAvailability(bool result) =>
      setState(() => _speechRecognitionAvailable = result);

  void onCurrentLocale(String locale) {
    print('_MyAppState.onCurrentLocale... $locale');
    setState(() => selectedLang = languages.firstWhere((l) => l.code == locale));
  }

  void onRecognitionStarted() {
    setState(() => _isListening = true);
  }

  void onRecognitionResult(String text) {
    print('_MyAppState.onRecognitionResult... $text');
    setState(() => transcription = text);
  }

  void onRecognitionComplete(String text) {
    print('_MyAppState.onRecognitionComplete... $text');
    setState(() => _isListening = false);
  }

  void errorHandler() => activateSpeechRecognizer();
}

关键点说明

  • 激活语音识别器:通过 _speech.activate() 方法激活语音识别器,并设置各种回调函数。
  • 开始监听:调用 _speech.listen() 方法开始监听用户的语音输入。
  • 取消监听:调用 _speech.cancel() 方法取消当前的语音识别任务。
  • 停止监听:调用 _speech.stop() 方法停止当前的语音识别任务。
  • 处理识别结果:通过 onRecognitionResult 回调函数获取并处理识别结果。

注意事项

  • 在iOS平台上,确保已经在 Info.plist 中添加了必要的权限描述。
  • 在实际应用中,可能需要根据具体需求调整语言选择逻辑和UI设计。

希望这个示例能帮助您更好地理解和使用 flutter_speech_recognition 插件!如果有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用flutter_speech插件进行语音识别的代码案例。flutter_speech插件允许你进行语音识别和文本到语音的转换。在这个例子中,我将重点介绍如何进行语音识别。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_speech: ^0.7.0  # 请检查最新版本号

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

2. 导入插件

在你的Dart文件中(例如main.dart),导入flutter_speech插件:

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

3. 使用插件进行语音识别

下面是一个简单的例子,展示了如何使用flutter_speech插件进行语音识别:

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

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

class SpeechRecognitionButton extends StatefulWidget {
  @override
  _SpeechRecognitionButtonState createState() => _SpeechRecognitionButtonState();
}

class _SpeechRecognitionButtonState extends State<SpeechRecognitionButton> {
  final FlutterSpeech _speech = FlutterSpeech();
  String _recognizedText = '';

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () async {
        bool hasPermission = await _speech.hasPermission();
        if (!hasPermission) {
          await _speech.requestPermission();
          hasPermission = await _speech.hasPermission();
        }

        if (hasPermission) {
          setState(() {
            _recognizedText = 'Listening...';
          });

          String result = await _speech.listen(
            locale: 'en-US', // 你可以设置为你需要的语言
            partialResults: true, // 是否返回部分结果
            listenFor: Duration(seconds: 10), // 监听时长
            cancelOnSilence: true, // 静音时是否取消
            prompt: 'Please speak', // 提示用户开始说话
            volumeBoost: true, // 是否增强音量
          );

          setState(() {
            _recognizedText = result;
          });
        } else {
          setState(() {
            _recognizedText = 'Permission Denied';
          });
        }
      },
      child: Text('Start Listening'),
    );
  }
}

4. 运行应用

确保你的设备或模拟器支持语音识别功能,然后运行你的Flutter应用。点击按钮后,应用将请求语音识别权限(如果尚未授予),然后开始监听用户的语音输入,并在按钮上显示识别的文本。

注意事项

  • 确保你的设备或模拟器上的语音识别功能已经启用。
  • 某些设备和操作系统版本可能不支持所有语言或功能。
  • 监听时间、是否返回部分结果等参数可以根据需要进行调整。

这个代码案例展示了如何在Flutter应用中使用flutter_speech插件进行基本的语音识别功能。你可以根据需要进行扩展和自定义。

回到顶部