Flutter语音识别插件azure_stt的使用

Flutter语音识别插件azure_stt的使用

获取开始

这个项目是一个新的Flutter项目,旨在作为一个插件包的基础。它包含特定的包,这些包包括Android和/或iOS平台的具体实现代码。

对于如何开始Flutter开发的帮助,请查看在线文档,其中提供了教程、示例、移动开发指导以及完整的API参考。


使用说明

本示例展示了如何使用azure_stt插件来实现语音识别功能。以下是完整的代码示例及说明。

示例代码

import 'dart:ffi';

import 'package:azure_stt/azure_continuous_recognition_callback.dart';
import 'package:azure_stt/azure_conversation_transcriber_callback.dart';
import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:azure_stt/azure_stt.dart';
import 'package:fluttertoast/fluttertoast.dart';

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

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

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

class _MyAppState extends State<MyApp>
    implements
        AzureContinuousRecognitionCallback,
        AzureConversationTranscriberCallback {
  String _platformVersion = 'Unknown'; // 平台版本
  String _result = ""; // 当前识别结果
  String subscriptionKey = "subscriptionKey"; // Azure订阅密钥
  String region = "region"; // Azure区域
  String translatorKey = "translatorKey"; // 翻译服务密钥
  String translatorRegion = "translatorRegion"; // 翻译服务区域
  bool recording = false; // 是否正在录音
  final _azureSttPlugin = AzureStt(); // 插件实例
  List<String> texts = List.empty(growable: true); // 保存转录文本

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

  // 初始化插件状态
  Future<void> initPlatformState() async {
    String platformVersion;
    try {
      _azureSttPlugin.initAzureTranslatorConfig(translatorKey, translatorRegion);
      _azureSttPlugin.setAzureContinuousRecognitionCallback(this);
      _azureSttPlugin.setAzureConversationTranscriberCallback(this);
      platformVersion = await _azureSttPlugin.getPlatformVersion() ??
          'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }
    if (!mounted) return;
    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Azure STT 插件示例'),
        ),
        body: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('运行在: $_platformVersion\n'), // 显示平台版本
            TextButton(
              onPressed: () async {
                _azureSttPlugin.initAzureConfig(subscriptionKey, region);
                var result = await _azureSttPlugin.startConversation(
                  "zh-CN", // 目标语言
                  false, // 是否自动检测语言
                  samplerRate: 16000, // 采样率
                  bitRate: 16, // 位宽
                  channel: 1, // 声道数
                  autoTranslate: true, // 是否自动翻译
                  fromLang: "en", // 源语言
                  toLang: "zh-CN", // 目标语言
                );
                setState(() {
                  _result = result ?? "";
                });
                var buffer = await rootBundle.load("assets/katiesteve.wav"); // 加载音频文件
                var total = buffer.lengthInBytes;
                var l = 1024;
                var offset = 0;
                while (offset < total) {
                  var r = (l + offset) <= total ? l : (total - offset);
                  Uint8List list = buffer.buffer.asUint8List(offset, r);
                  offset += r;
                  await _azureSttPlugin.writeAudioBuffer(list); // 分块写入音频数据
                }
              },
              child: Text("开始录音"),
            ),
            TextButton(
              onPressed: () async {
                setState(() {
                  _result = "";
                  texts.clear();
                  recording = false;
                });
                var result = await _azureSttPlugin.stopConversation(); // 停止录音
              },
              child: Text("停止录音"),
            ),
            TextButton(
              onPressed: () async {
                var result = await _azureSttPlugin.translate("你好呀", "", "en"); // 测试翻译
                setState(() {
                  _result = result ?? "";
                });
              },
              child: Text("测试翻译"),
            ),
            Text('语音录制中: $recording\n'), // 显示录制状态
            ...texts.map((e) => Text('$e\n')), // 显示转录文本
            Text('当前识别结果: $_result\n'), // 显示当前识别结果
          ],
        ),
      ),
    );
  }

  // 回调方法
  [@override](/user/override)
  void onCanceledEvent(msg) {
    _azureSttPlugin.stopConversation(); // 停止录音
    Fluttertoast.showToast(
        msg: "ErrorCode:${msg["errorCode"]},ErrorDetails:${msg["errorDetails"]},Reason:${msg["reason"]}", // 显示错误信息
        toastLength: Toast.LENGTH_LONG,
        gravity: ToastGravity.CENTER,
        timeInSecForIosWeb: 1,
        backgroundColor: Colors.red,
        textColor: Colors.white,
        fontSize: 16.0);
  }

  [@override](/user/override)
  void onRecognizedEvent(msg) {
    print(msg); // 打印识别结果
  }

  [@override](/user/override)
  void onRecognizingEvent(msg) {
    setState(() {
      _result = msg; // 更新当前识别结果
    });
  }

  [@override](/user/override)
  void onSessionStartedEvent(msg) {
    print(msg);
    setState(() {
      recording = true; // 开始录音
    });
  }

  [@override](/user/override)
  void onSessionStoppedEvent(msg) {
    print(msg);
    setState(() {
      recording = false; // 停止录音
    });
  }

  [@override](/user/override)
  void onSpeechEndDetectedEvent(msg) {
    print("当前对话结束了"); // 对话结束
  }

  [@override](/user/override)
  void onSpeechStartDetectedEvent(msg) {
    print("当前对话开始了"); // 对话开始
  }

  [@override](/user/override)
  void onTranscribedEvent(String speakerId, String srcText, String transText,
      int transType, bool transSuccess, int beginTime, int endTime, int transTime) {
    setState(() {
      texts.add("${speakerId}~${beginTime}-${endTime}:${transText}"); // 添加转录文本
    });
  }

  [@override](/user/override)
  void onTranscribingEvent(String speakerId, String srcText, String transText,
      int transType, bool transSuccess, int beginTime, int endTime, int transTime) {
    setState(() {
      _result = "${speakerId}~${beginTime}-${endTime}:${transText}"; // 更新实时转录结果
    });
  }
}

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

1 回复

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


azure_stt 是一个用于在 Flutter 应用中集成 Azure 语音识别服务的插件。它允许你将语音转换为文本,适用于需要语音输入功能的应用程序。以下是如何在 Flutter 项目中使用 azure_stt 插件的基本步骤。

1. 添加依赖

首先,你需要在项目的 pubspec.yaml 文件中添加 azure_stt 插件的依赖。打开 pubspec.yaml 文件并添加以下内容:

dependencies:
  flutter:
    sdk: flutter
  azure_stt: ^0.0.1  # 请确保使用最新的版本号

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

2. 获取 Azure 语音服务密钥和区域

在使用 azure_stt 插件之前,你需要一个 Azure 语音服务的订阅密钥和区域。你可以在 Azure 门户中创建一个语音服务资源,并获取这些信息。

3. 初始化插件

在你的 Dart 代码中,首先导入 azure_stt 插件,然后使用你的 Azure 订阅密钥和区域初始化插件。

import 'package:azure_stt/azure_stt.dart';

void initializeAzureSTT() async {
  String subscriptionKey = 'YOUR_AZURE_SUBSCRIPTION_KEY';
  String region = 'YOUR_AZURE_REGION'; // 例如:'westus'

  AzureSTT azureSTT = AzureSTT();
  await azureSTT.initialize(subscriptionKey: subscriptionKey, region: region);
}

4. 开始语音识别

你可以使用 startRecognition 方法来开始语音识别。这个方法会返回一个 Stream,你可以监听这个 Stream 来获取识别结果。

void startRecognition(AzureSTT azureSTT) {
  azureSTT.startRecognition().listen((result) {
    print('识别结果: $result');
  }).onError((error) {
    print('识别错误: $error');
  });
}

5. 停止语音识别

当你想要停止语音识别时,可以调用 stopRecognition 方法。

void stopRecognition(AzureSTT azureSTT) {
  azureSTT.stopRecognition();
}

6. 完整示例

以下是一个完整的示例,展示了如何在 Flutter 应用中使用 azure_stt 插件进行语音识别。

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

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

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

class _MyAppState extends State<MyApp> {
  AzureSTT _azureSTT;
  String _recognizedText = '';

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

  void initializeAzureSTT() async {
    _azureSTT = AzureSTT();
    await _azureSTT.initialize(
      subscriptionKey: 'YOUR_AZURE_SUBSCRIPTION_KEY',
      region: 'YOUR_AZURE_REGION',
    );
  }

  void startRecognition() {
    _azureSTT.startRecognition().listen((result) {
      setState(() {
        _recognizedText = result;
      });
    }).onError((error) {
      print('识别错误: $error');
    });
  }

  void stopRecognition() {
    _azureSTT.stopRecognition();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Azure STT 示例'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('识别结果: $_recognizedText'),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: startRecognition,
                child: Text('开始识别'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: stopRecognition,
                child: Text('停止识别'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
回到顶部