Flutter文本转语音插件livetexttospeechflutter的使用

Flutter文本转语音插件livetexttospeechflutter的使用

livetexttospeechflutter 是一个用于在 Flutter 应用中实现文本转语音功能的插件。本文将详细介绍如何使用该插件,并提供一个完整的示例。

获取开始

首先,确保你的 Flutter 环境已经配置好。你可以通过以下命令安装 livetexttospeechflutter 插件:

flutter pub add livetexttospeechflutter

示例代码

以下是使用 livetexttospeechflutter 的完整示例代码:

import 'dart:developer';
import 'dart:io';

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

import 'package:flutter/services.dart';

import 'package:livetexttospeechflutter/livetexttospeechflutter.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MyApp());
}

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

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

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  final _livetexttospeechflutterPlugin = Livetexttospeechflutter();

  late Livetexttospeechflutter _livespeechtotextPlugin;
  late String _recognisedText;
  String? _localeDisplayName = '';
  StreamSubscription<dynamic>? onSuccessEvent;

  bool microphoneGranted = false;

  [@override](/user/override)
  void initState() {
    super.initState();
    _livespeechtotextPlugin = Livetexttospeechflutter();

    _livespeechtotextPlugin.getLocaleDisplayName().then((value) => setState(
          () => _localeDisplayName = value,
    ));

    _recognisedText = '';

    // 初始化平台状态
    initPlatformState();
  }

  [@override](/user/override)
  void dispose() {
    onSuccessEvent?.cancel();
    super.dispose();
  }

  // 平台消息是异步的,因此我们在异步方法中初始化。
  Future<void> initPlatformState() async {
    String platformVersion;
    // 平台消息可能会失败,所以我们使用 try/catch 来处理 PlatformException。
    // 我们还处理了消息可能返回 null 的情况。
    try {
      platformVersion =
          await _livetexttospeechflutterPlugin.getPlatformVersion() ?? 'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    // 如果在异步平台消息还在飞行时,小部件从树中移除,我们希望丢弃回复而不是调用
    // setState 来更新我们的非存在的外观。
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('文本转语音'),
        ),
        body: Center(
          child: Column(
            children: [
              Text(_recognisedText),
              if (!microphoneGranted)
                ElevatedButton(
                  onPressed: () {
                    binding();
                  },
                  child: const Text("检查权限"),
                ),
              ElevatedButton(
                  onPressed: microphoneGranted
                      ? () {
                    print("开始按钮按下");
                    try {
                      _livespeechtotextPlugin.speak(_recognisedText);
                    } on PlatformException {
                      print('错误');
                    }
                  }
                      : null,
                  child: const Text('开始')),
              ElevatedButton(
                  onPressed: microphoneGranted
                      ? () {
                    print("停止按钮按下");
                    try {
                      _livespeechtotextPlugin.stop();
                    } on PlatformException {
                      print('错误');
                    }
                  }
                      : null,
                  child: const Text('停止')),
              Text("语言区域: $_localeDisplayName"),
            ],
          ),
        ),
      ),
    );
  }

  Future<dynamic> binding() async {
    onSuccessEvent?.cancel();

    return Future.wait([]).then((_) async {
      // 检查用户是否已经授予麦克风权限。
      var permissionStatus = await Permission.microphone.status;

      // 如果用户尚未授予权限,则提示他们授权。
      if (!microphoneGranted) {
        await Permission.microphone.request();

        // 检查用户是否已经授予权限。
        permissionStatus = await Permission.microphone.status;

        if (!permissionStatus.isGranted) {
          return Future.error('麦克风访问被拒绝');
        }
      }

      // 检查用户是否已经授予语音权限。
      if (Platform.isIOS) {
        var speechStatus = await Permission.speech.status;

        // 如果用户尚未授予权限,则提示他们授权。
        if (!microphoneGranted) {
          await Permission.speech.request();

          // 检查用户是否已经授予权限。
          speechStatus = await Permission.speech.status;

          if (!speechStatus.isGranted) {
            return Future.error('语音访问被拒绝');
          }
        }
      }

      return Future.value(true);
    }).then((value) {
      microphoneGranted = true;

      // 监听事件 "success"
      onSuccessEvent =
          _livespeechtotextPlugin.addEventListener("success", (value) {
            if (value.runtimeType != String) return;
            if ((value as String).isEmpty) return;

            setState(() {
              _recognisedText = value;
            });
          });

      setState(() {});
    }).onError((error, stackTrace) {
      // toast
      log(error.toString());
      // 打开应用设置
    });
  }
}

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

1 回复

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


live_text_to_speech_flutter 是一个 Flutter 插件,用于将文本转换为语音(TTS,Text-to-Speech)。它允许你在 Flutter 应用中轻松地实现文本朗读功能。以下是如何使用 live_text_to_speech_flutter 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  live_text_to_speech_flutter: ^1.0.0  # 请使用最新版本

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

2. 导入插件

在你的 Dart 文件中导入插件:

import 'package:live_text_to_speech_flutter/live_text_to_speech_flutter.dart';

3. 初始化 TTS

在使用 TTS 功能之前,你需要初始化 LiveTextToSpeech 实例:

LiveTextToSpeech tts = LiveTextToSpeech();

4. 设置语言和语音

你可以设置 TTS 的语言和语音。例如,设置为英语(美国):

await tts.setLanguage("en-US");
await tts.setVoice("com.apple.ttsbundle.Samantha-compact");

5. 朗读文本

使用 speak 方法来朗读文本:

await tts.speak("Hello, this is a text-to-speech example.");

6. 停止朗读

你可以使用 stop 方法来停止当前的朗读:

await tts.stop();

7. 设置语速和音量

你可以调整 TTS 的语速和音量:

await tts.setRate(1.0);  // 语速,范围通常是 0.0 到 1.0
await tts.setVolume(1.0); // 音量,范围通常是 0.0 到 1.0

8. 处理回调

你可以监听 TTS 的状态变化,例如开始朗读、结束朗读等:

tts.setStartHandler(() {
  print("TTS started");
});

tts.setCompletionHandler(() {
  print("TTS completed");
});

tts.setErrorHandler((error) {
  print("TTS error: $error");
});

9. 释放资源

在不需要 TTS 功能时,记得释放资源:

await tts.stop();
await tts.shutdown();

完整示例

以下是一个完整的示例,展示如何使用 live_text_to_speech_flutter 插件:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TTSExample(),
    );
  }
}

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

class _TTSExampleState extends State<TTSExample> {
  LiveTextToSpeech tts = LiveTextToSpeech();
  final TextEditingController _textController = TextEditingController();

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

  Future<void> _initializeTTS() async {
    await tts.setLanguage("en-US");
    await tts.setVoice("com.apple.ttsbundle.Samantha-compact");
    await tts.setRate(1.0);
    await tts.setVolume(1.0);

    tts.setStartHandler(() {
      print("TTS started");
    });

    tts.setCompletionHandler(() {
      print("TTS completed");
    });

    tts.setErrorHandler((error) {
      print("TTS error: $error");
    });
  }

  Future<void> _speak() async {
    String text = _textController.text;
    if (text.isNotEmpty) {
      await tts.speak(text);
    }
  }

  Future<void> _stop() async {
    await tts.stop();
  }

  [@override](/user/override)
  void dispose() {
    tts.stop();
    tts.shutdown();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Text-to-Speech Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _textController,
              decoration: InputDecoration(
                labelText: 'Enter text to speak',
              ),
            ),
            SizedBox(height: 20),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: [
                ElevatedButton(
                  onPressed: _speak,
                  child: Text('Speak'),
                ),
                ElevatedButton(
                  onPressed: _stop,
                  child: Text('Stop'),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部