Flutter后台语音识别插件background_stt的使用

Flutter后台语音识别插件background_stt的使用

安装

pubspec.yaml 文件中添加依赖项:

dependencies:
  background_stt: [LATEST_VERSION]

在 Dart 文件中导入插件:

import 'package:background_stt/background_stt.dart';

使用示例代码

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

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

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  var _service = BackgroundStt();
  String result = "Say something!";
  String confirmation = "";
  String confirmationReply = "";
  String voiceReply = "";
  var isListening = false;

  double _currentPitchValue = 1;
  double _currentRateValue = 1;

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

    setState(() {
      if (mounted) isListening = true;
    });

    _service.getSpeechResults().onData((data) {
      print("getSpeechResults: ${data.result} , ${data.isPartial} [STT Mode]");
      _doOnSpeechCommandMatch(data.result);

      setState(() {
        confirmation = "";
        confirmationReply = "";
        voiceReply = "";
        result = data.result!;
      });
    });

    _service.getConfirmationResults().onData((data) {
      print(
          "getConfirmationResults: Confirmation Text: ${data.confirmationIntent} , "
          "User Replied: ${data.confirmedResult} , "
          "Voice Input Message: ${data.voiceInput} , "
          "Is Confirmation Success?: ${data.isSuccess}");

      setState(() {
        confirmation = data.confirmationIntent!;
        confirmationReply = data.confirmedResult!;
      });
    });
    super.initState();
  }

  void _doOnSpeechCommandMatch(String? command) {
    if (command == "start") {
      _service.confirmIntent(
          confirmationText: "Do you want to start?",
          positiveCommand: "yes",
          negativeCommand: "no");
    } else if (command == "stop") {
      _service.confirmIntent(
          confirmationText: "Do you want to stop?",
          positiveCommand: "yes",
          negativeCommand: "no");
    } else if (command == "hello") {
      _service.confirmIntent(
          confirmationText: "Hello to you!",
          positiveCommand: "hi",
          negativeCommand: "bye");
    } else if (command == "address") {
      _service.confirmIntent(
          confirmationText: "What is the address?",
          positiveCommand: "yes",
          negativeCommand: "no",
          voiceInputMessage: "Is the address correct?",
          voiceInput: true);
    }

    setState(() {
      confirmation = "$command [Confirmation Mode]";
    });
  }

  void updateSpeaker() {
    print("setSpeaker: pitch($_currentPitchValue) rate($_currentRateValue)");
    _service.setSpeaker(_currentPitchValue / 100, _currentRateValue / 100);
  }

  [@override](/user/override)
  void dispose() {
    super.dispose();
    _service.stopSpeechListenService;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Background Speech-to-Text'),
        ),
        body: Center(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('$result\n\n'),
              confirmation.isNotEmpty
                  ? Text('Confirmation: $confirmation')
                  : Container(),
              confirmationReply.isNotEmpty
                  ? Text('Reply: $confirmationReply')
                  : Container(),
              voiceReply.isNotEmpty
                  ? Text('Voice Reply: $voiceReply')
                  : Container(),
              confirmation.isNotEmpty
                  ? RaisedButton(
                      child: Text("Cancel Confirmation"),
                      onPressed: () async {
                        await _service.cancelConfirmation;

                        setState(() {
                          result = "Say something!";
                          confirmation = "";
                          confirmationReply = "";
                          voiceReply = "";
                        });
                      },
                    )
                  : Container(),
              Visibility(
                child: RaisedButton(
                  child: Text("Pause Listening"),
                  onPressed: () async {
                    await _service.pauseListening();

                    setState(() {
                      result = "Speech listener Paused!";
                      confirmation = "";
                      confirmationReply = "";
                      voiceReply = "";
                      isListening = false;
                    });
                  },
                ),
                replacement: RaisedButton(
                  child: Text("Resume Listening"),
                  onPressed: () async {
                    await _service.resumeListening();

                    setState(() {
                      result = "Speech listener Resumed!";
                      confirmation = "";
                      confirmationReply = "";
                      voiceReply = "";
                      isListening = true;
                    });
                  },
                ),
                visible: isListening,
              ),
              RaisedButton(
                child: Text("Speak"),
                onPressed: () async {
                  var t = DateTime.now();
                  await _service.speak(
                      "Hello, time is ${t.hour}:${t.minute}:${t.second}",
                      false);

                  setState(() {
                    result = "Speech listener Paused!";
                    confirmation = "";
                    confirmationReply = "";
                    voiceReply = "";
                    isListening = false;
                  });
                },
              ),
              Slider(
                value: _currentPitchValue,
                min: 0,
                max: 100,
                divisions: 10,
                label: "Pitch: ${_currentPitchValue.round().toString()}",
                onChanged: ( (double value) {
                  setState(() {
                    _currentPitchValue = value;
                  });
                  updateSpeaker();
                },
              ),
              Slider(
                value: _currentRateValue,
                min: 0,
                max: 100,
                divisions: 10,
                label: "Rate: ${_currentRateValue.round().toString()}",
                onChanged: ( (double value) {
                  setState(() {
                    _currentRateValue = value;
                  });
                  updateSpeaker();
                },
              )
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中集成和使用background_stt插件进行后台语音识别的示例代码。这个插件允许你的应用在后台进行语音识别,非常适合需要持续监听语音输入的应用场景。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  background_stt: ^x.y.z  # 请替换为最新版本号

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

2. 配置Android权限

由于语音识别需要麦克风权限,你需要在AndroidManifest.xml中添加相关权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

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

    <application
        ... >
        ...
    </application>
</manifest>

3. 请求权限

在Flutter代码中,你需要请求麦克风权限。可以使用permission_handler插件来处理权限请求(如果尚未添加,请先添加permission_handler依赖)。

import 'package:permission_handler/permission_handler.dart';

Future<void> requestPermissions() async {
  var status = await Permission.microphone.status;
  if (!status.isGranted) {
    Map<Permission, PermissionStatus> permissions = await Permission.requestMultiple([Permission.microphone]);
    status = permissions[Permission.microphone]?.status ?? PermissionStatus.denied;
  }
  if (!status.isGranted) {
    // 处理权限被拒绝的情况
  }
}

4. 初始化并使用background_stt

下面是一个简单的示例,展示了如何初始化background_stt插件并处理语音识别结果:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Background STT Example'),
        ),
        body: MyHomePage(),
      ),
    );
  }
}

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

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

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

  Future<void> initBackgroundSTT() async {
    // 初始化插件
    await BackgroundSTT.initialize(
      onResult: (String result) {
        // 更新UI以显示识别结果
        setState(() {
          recognitionText = result;
        });
      },
      onError: (String error) {
        print("Error: $error");
      },
      onStatus: (String status) {
        print("Status: $status");
      },
    );

    // 请求麦克风权限
    await requestPermissions();

    // 开始语音识别
    await BackgroundSTT.startListening();
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text('Recognition Text:'),
          Text(recognitionText, style: TextStyle(fontSize: 20)),
        ],
      ),
    );
  }
}

注意事项

  1. 权限处理:确保在启动语音识别之前已经获得了必要的权限。
  2. 后台服务background_stt插件使用了Android的前台服务来保持应用在后台运行。你可能需要处理前台服务的通知。
  3. 电池优化:长时间运行语音识别可能会影响电池寿命,确保在不需要时停止监听。
  4. 隐私政策:在你的应用中添加隐私政策,告知用户你将如何处理和存储他们的语音数据。

这个示例代码提供了一个基本的框架,你可以根据自己的需求进行扩展和修改。

回到顶部