Flutter语音助手功能插件voice_assistant的使用

Flutter语音助手功能插件voice_assistant的使用

voice-assistant

这是一个库,用于暴露设备特定的语音识别能力。

此插件包含一组类,使在Flutter中轻松使用底层平台的语音识别功能变得简单。它支持Android和iOS。该库的目标用例是命令和短语,而不是连续的语音转换或始终在线监听。

Android iOS
支持 SDK 21+ 10.0+

voice-assistant 实现指南

在iOS的info.plist中添加以下权限

<key>NSMicrophoneUsageDescription</key>
<string>本示例请求时会在设备麦克风上收听语音。</string>
<key>NSSpeechRecognitionUsageDescription</key>
<string>本示例会识别你所说的话并显示出来。</string>

在Android的AndroidManifest.xml中添加以下权限

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

特性

使用此插件可以在您的Flutter应用中:

  • 将语音转换为文本并进行搜索。
  • 将语音转换为文本并存储到本地存储。

开始使用

此插件依赖于flutter核心。

使用方法

要使用该插件,只需将voice_assistant: ^1.0.1添加到您的pubspec.yaml文件中并运行pub get

在您的包的pubspec.yaml中添加以下内容(然后运行隐式的dart pub get

voice_assistant: ^1.0.1

示例

import 'dart:convert';
import 'package:example/http_service.dart';
import 'package:voice_assistant/voice_assistant.dart';

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

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

  /// 这个小部件是您的应用程序的根。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '语音助手',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyAppPage(title: '语音助手'),
    );
  }
}

/// 示例项目主屏幕
class MyAppPage extends StatefulWidget {
  const MyAppPage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyAppPage> createState() => _MyAppPageState();
}

class _MyAppPageState extends State<MyAppPage> {
  String textStringValue = "";
  List<dynamic> searchedData = [];
  bool isSearching = false;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.white,
        iconTheme: const IconThemeData(
          color: Colors.black, // 更改您的颜色
        ),
        title: Text(widget.title, style: const TextStyle(color: Colors.black)),
        centerTitle: true,
        elevation: 2.5,
        actions: [
          InkWell(
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(
                    builder: (context) => const VoiceTextListView()),
              );
            },
            child: Container(
              margin: const EdgeInsets.only(right: 10),
              child: const Icon(Icons.list_alt),
            ),
          )
        ],
      ),
      body: Center(
        /// Center是一个布局小部件。它接受一个子元素并将其定位在父元素的中间。
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            SizedBox(
              height: 300,
              child: Align(
                alignment: Alignment.bottomCenter,
                child: VoiceToTextView(
                  micClicked: true,
                  isDoingBackgroundProcess: isSearching,
                  listenTextStreamCallBack: (String? value) {},
                  listenTextCompleteCallBack:
                      (String? value, ActionType actionTypeValue) async {
                    if (value!.isNotEmpty && actionTypeValue == ActionType.search) {
                      setState(() {
                        isSearching = true;
                      });
                      Map<String, dynamic> requestData = {
                        'keyword': value,
                        'search_type': 'varieties',
                        'latitude': 22.750741,
                        'longitude': 75.89564
                      };
                      String jsonStringResponse =
                          await httpService.getPosts(requestData);
                      Map<String, dynamic> responseData =
                          json.decode(jsonStringResponse);
                      if (responseData.isNotEmpty &&
                          responseData['success'] &&
                          responseData['data'].isNotEmpty) {
                        setState(() {
                          searchedData = responseData['data'];
                        });
                      }
                      setState(() {
                        isSearching = false;
                      });
                    } else {}
                  },
                ),
              ),
            ),
            Expanded(
              child: Column(
                children: [
                  ListView.builder(
                      shrinkWrap: true,
                      itemCount: searchedData.length,
                      itemBuilder: (BuildContext context, int index) {
                        return Padding(
                          padding: const EdgeInsets.only(
                              left: 10, right: 10, top: 10, bottom: 10),
                          child: Row(
                            children: [
                              const Icon(Icons.lens, size: 10),
                              const SizedBox(width: 10),
                              Expanded(
                                child: Text(
                                  searchedData[index]['title'],
                                  style: const TextStyle(fontSize: 18),
                                ),
                              )
                            ],
                          ),
                        );
                      }),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中集成和使用voice_assistant插件的示例代码。请注意,实际使用中可能需要根据插件的最新文档进行调整,因为插件的API可能会随时间变化。

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

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

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

接下来,在你的Flutter项目中,你可以按照以下步骤来初始化并使用voice_assistant插件。

1. 初始化插件

在你的主Activity或Dart文件的顶部导入插件:

import 'package:voice_assistant/voice_assistant.dart';

2. 请求权限

在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 {
  Map<Permission, PermissionStatus> statuses = await Permission.getPermissionsStatus([
    Permission.microphone,
    Permission.internet,
  ]);

  if (statuses[Permission.microphone] != PermissionStatus.granted ||
      statuses[Permission.internet] != PermissionStatus.granted) {
    Map<Permission, PermissionResult> results = await Permission.requestPermissions([
      Permission.microphone,
      Permission.internet,
    ]);

    if (results[Permission.microphone] != PermissionResult.granted ||
        results[Permission.internet] != PermissionResult.granted) {
      // 权限请求被拒绝
      print('Permissions were denied');
    }
  }
}

3. 初始化Voice Assistant

在你的主Dart文件中(例如main.dart),初始化Voice Assistant:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await requestPermissions();
  
  VoiceAssistant voiceAssistant = VoiceAssistant();
  
  runApp(MyApp(voiceAssistant: voiceAssistant));
}

class MyApp extends StatelessWidget {
  final VoiceAssistant voiceAssistant;

  MyApp({required this.voiceAssistant});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Voice Assistant Demo'),
        ),
        body: VoiceAssistantScreen(voiceAssistant: voiceAssistant),
      ),
    );
  }
}

4. 使用Voice Assistant

创建一个新的Widget来管理Voice Assistant的功能:

class VoiceAssistantScreen extends StatefulWidget {
  final VoiceAssistant voiceAssistant;

  VoiceAssistantScreen({required this.voiceAssistant});

  @override
  _VoiceAssistantScreenState createState() => _VoiceAssistantScreenState();
}

class _VoiceAssistantScreenState extends State<VoiceAssistantScreen> {
  String recognitionResult = '';

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text('Recognition Result: $recognitionResult'),
          ElevatedButton(
            onPressed: () async {
              // 开始语音识别
              bool isListening = await widget.voiceAssistant.startListening(
                onResult: (String result) {
                  setState(() {
                    recognitionResult = result;
                  });
                },
                onError: (String error) {
                  print('Error: $error');
                },
                onEnd: () {
                  print('Listening ended');
                },
              );

              if (!isListening) {
                print('Failed to start listening');
              }
            },
            child: Text('Start Listening'),
          ),
        ],
      ),
    );
  }
}

注意事项

  • 确保你按照插件的文档正确配置所有必要的依赖和权限。
  • 插件的API可能会变化,请参考最新的官方文档进行调整。
  • 在生产环境中,请处理更多的错误情况和用户交互逻辑。

以上是一个基本的Flutter语音助手功能插件voice_assistant的使用示例。你可以根据实际需求进一步扩展和优化。

回到顶部