Flutter语音识别插件vais_speech的使用

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

Flutter语音识别插件vais_speech的使用

特性

  • 流式识别(最多1分钟)
  • 离线录音识别(最多1小时)

安装

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  vais_speech: [Current version]

如何使用?

VAIS Speech 分为两个部分:

  • 录制音频(支持离线和流式)
  • 上传音频并获取文本

开始前

Android:

AndroidManifest.xml 中设置录音相关的权限:

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

添加一个服务到应用中:

<service android:name="tsyliveaudiorecord.live_audio_record.AudioRecordService"/>

iOS:

Info.plist 中设置相同的权限:

<key>NSAppleMusicUsageDescription</key>
<string>App need to use music because of retrieving your need uploading file.</string>
<key>UIBackgroundModes</key>
<array>
    <string>audio</string>
    <string>fetch</string>
</array>

Flutter端:

初始化VAIS实例以使用:

final vaisSpeech = VaisSpeech('<YOUR_TOKEN>');

录制音频

VAIS Speech 提供了两种模式来使用:

  • 离线模式(默认)
  • 流式模式

步骤1: 获取VAIS Speech音频并初始化

final vaisSpeechAudio = vaisSpeech.vaisSpeechAudio; // 获取VAIS Speech音频
await vaisSpeechAudio.init(...); // 初始化它

.init() 函数的更多细节:

函数 属性
Future init(String path, {AudioFormat audioFormat, int sampleRate = 16000, RecordMode recordMode = RecordMode.Offline}) path: 录音路径 - recordMode: 录音模式

步骤2: 添加监听器以观察录制状态

此方法应在开始之前调用。

vaisSpeechAudio.addListener(listener);

addListener() 函数的更多细节:

函数 属性
addListener(VaisSpeechCallback listener) 查看更多的 VaisSpeechCallback
VaisSpeechCallback 包括三个方法: onGeneratedSpeechText / onDurationChanged / onConnectionChanged
  • onGeneratedSpeechText: 当有文本被转换时触发(仅限流式模式)
  • onConnectionChanged: 当与我们的服务连接关闭时触发(仅限流式模式)
  • onDurationChanged: 录制的持续时间(例如用于显示录制时长)

步骤3: 开始录制

await vaisSpeechAudio.start();

步骤4: 暂停录制(仅限离线模式)

尝试在流式模式下调用此方法将抛出异常。

await vaisSpeechAudio.pause();

步骤5: 恢复录制(仅限离线模式)

尝试在流式模式下调用此方法将抛出异常。

await vaisSpeechAudio.resume();

步骤6: 停止录制

await vaisSpeechAudio.stop();

上传录制的音频

录制完成后,调用 .startAsr() 上传本地音频。此函数将返回一个 AudioId

await vaisSpeechAudio.startAsr(...);

.startAsr() 函数的更多细节:

函数 属性
Future path: 你的本地音频文件路径 - finalName (可选): 自定义音频名称

跟踪录制音频的状态

var audioStatus = await vaisSpeechAudio.getProgress(...);

.getProgress() 函数的更多细节:

函数 属性
Future audio: 上传后的音频ID。这将返回一个 AudioStatus 模型
AudioStatus 包括: CREATED, QUEUED, PROCESSING, DONE, ERROR

获取录制音频的文本

final transcript = await vaisSpeechAudio.getTranscript()..data;

.getTranscript() 函数的更多细节:

函数 属性
Future audio: 上传后的音频ID。这将返回一个 TranscriptResponse 模型,你应该使用 .data 来获取文本列表

示例代码

以下是完整的示例代码:

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

import 'package:flutter/services.dart';
import 'package:toast/toast.dart';
import 'package:vais_speech/model/lyric/lyric.dart';
import 'package:vais_speech/vais_speech.dart';
import 'package:vais_speech_example/record.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({Key key,}) : super(key: key);

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

class _MyAppState extends State<MyApp> {
  final navigationKey = GlobalKey<NavigatorState>();

  [@override](/user/override)
  Widget build(BuildContext context) {
    final mContext = context;
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Voice Recognition',
      navigatorKey: navigationKey,
      initialRoute: 'record',
      routes: {
        'record': (_) => RecordScreen(),
      },
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用vais_speech插件进行语音识别的示例代码。vais_speech插件允许你轻松地在Flutter应用中实现语音识别功能。

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

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

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

接下来,你可以在你的Flutter应用中使用vais_speech插件。以下是一个简单的示例代码,展示了如何使用该插件进行语音识别:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Speech Recognition',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SpeechRecognitionScreen(),
    );
  }
}

class SpeechRecognitionScreen extends StatefulWidget {
  @override
  _SpeechRecognitionScreenState createState() => _SpeechRecognitionScreenState();
}

class _SpeechRecognitionScreenState extends State<SpeechRecognitionScreen> {
  String _recognizedText = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Speech Recognition Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Recognized Text:',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 10),
            Text(
              _recognizedText,
              style: TextStyle(fontSize: 24, color: Colors.black),
              textAlign: TextAlign.center,
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _startListening,
              child: Text('Start Listening'),
            ),
          ],
        ),
      ),
    );
  }

  Future<void> _startListening() async {
    VaisSpeech vaisSpeech = VaisSpeech();

    // 检查是否有语音识别权限
    bool hasPermission = await vaisSpeech.hasPermission();
    if (!hasPermission) {
      bool requestPermission = await vaisSpeech.requestPermission();
      if (!requestPermission) {
        // 处理权限被拒绝的情况
        _recognizedText = 'Permission Denied';
        setState(() {});
        return;
      }
    }

    // 开始监听语音
    vaisSpeech.setRecognitionListener(
      onResult: (String result) {
        setState(() {
          _recognizedText = result;
        });
      },
      onError: (String errorMessage) {
        setState(() {
          _recognizedText = 'Error: $errorMessage';
        });
      },
      onPartialResult: (String partialResult) {
        // 实时显示部分识别结果(可选)
        setState(() {
          _recognizedText = partialResult;
        });
      },
      onVolumeChanged: (double volume) {
        // 处理音量变化(可选)
        print('Volume: $volume');
      },
      onStatusChanged: (String status, Map<String, dynamic> extras) {
        // 处理状态变化(可选)
        print('Status: $status, Extras: $extras');
      },
    );

    // 开始语音识别
    bool isListening = await vaisSpeech.listen(
      locale: 'zh_CN', // 设置识别语言,例如中文简体
      prompt: '请说话', // 提示用户开始说话(可选)
    );

    if (isListening) {
      // 停止监听(示例中未立即停止,但你可以根据需要调用 vaisSpeech.stopListening())
      // await vaisSpeech.stopListening();
    } else {
      // 处理启动监听失败的情况
      _recognizedText = 'Failed to start listening';
      setState(() {});
    }
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮用于开始语音识别,以及一个文本显示区用于显示识别到的文本。vais_speech插件提供了各种回调方法,用于处理识别结果、错误、部分结果、音量变化和状态变化。

请确保在实际项目中处理权限请求的结果,并根据需要调整代码以适应你的具体需求。

回到顶部