Flutter实现tts语音播报

ops/2024/11/27 9:59:30/

 

目录

引言

flutter_tts%E4%BE%9D%E8%B5%96%C2%A0-toc" style="margin-left:40px;">添加flutter_tts依赖 

设置语言和发音人

macOS

Android

iOS

说话、停止、获取语言、设置语言、设置语音速率、获取声音、设置声音、设置音量、设置音高、是否语言可用、设置共享实例

监听平台

封装代码

使用案例


引言

随着移动应用的不断发展,用户对应用的交互体验要求越来越高。TTS(Text-to-Speech,文本转语音)技术可以让应用读出文本内容,从而提升用户体验,特别是对于视障用户或需要多任务处理的场景非常有用。本文将详细介绍如何在 Flutter 应用中使用 flutter_tts 库实现 TTS 功能。

flutter_tts%E4%BE%9D%E8%B5%96%C2%A0">添加flutter_tts依赖 

在 pubspec.yaml 文件中加

flutter_tts: ^4.0.2

然后执行

flutter pub get 

设置语言和发音人

  • 使用 setLanguage 方法设置语言
await flutterTts.setLanguage("zh-CN");  // 设置为中文
  • 使用 setVoice 方法选择不同的发音人:
await flutterTts.setVoice("female");  // 选择女性发音人

macOS

OSX version: 10.15

Android

将文件中的最低 Android sdk 版本更改为 21(或更高)android/app/build.gradle

minSdkVersion 21

更新 Kotlin Gradle 插件版本

将 Kotlin Gradle 插件的版本更改为1.9.10
如果你的项目是使用 3.19 之前的 Flutter 版本创建的,请转到android/build.gradle文件并更新ext.kotlin_version

ext.kotlin_version = '1.9.10'

否则,请转到android/settings.gradle并更新插件的版本org.jetbrains.kotlin.android

id "org.jetbrains.kotlin.android" version "1.9.10" apply false

针对 Android 11 且使用文本转语音功能的应用应在其清单元素TextToSpeech.Engine.INTENT_ACTION_TTS_SERVICE 中声明。queries

<queries><intent><action android:name="android.intent.action.TTS_SERVICE" /></intent>
</queries>

iOS

 设置共享音频实例(仅限 iOS)

await flutterTts.setSharedInstance(true);

使用可选模式设置音频类别和选项(仅限 iOS)。以下设置允许背景音乐和应用内音频会话同时继续

await flutterTts.setIosAudioCategory(IosTextToSpeechAudioCategory.ambient,[IosTextToSpeechAudioCategoryOptions.allowBluetooth,IosTextToSpeechAudioCategoryOptions.allowBluetoothA2DP,IosTextToSpeechAudioCategoryOptions.mixWithOthers],IosTextToSpeechAudioMode.voicePrompt
);

等待发言完成。

await flutterTts.awaitSpeakCompletion(true);

等待合成文件完成。

await flutterTts.awaitSynthCompletion(true);

 

说话、停止、获取语言、设置语言、设置语音速率、获取声音、设置声音、设置音量、设置音高、是否语言可用、设置共享实例

Future _speak() async{var result = await flutterTts.speak("Hello World");if (result == 1) setState(() => ttsState = TtsState.playing);
}Future _stop() async{var result = await flutterTts.stop();if (result == 1) setState(() => ttsState = TtsState.stopped);
}List<dynamic> languages = await flutterTts.getLanguages;await flutterTts.setLanguage("en-US");await flutterTts.setSpeechRate(1.0);await flutterTts.setVolume(1.0);await flutterTts.setPitch(1.0);await flutterTts.isLanguageAvailable("en-US");// iOS, Android and Web only
//see the "Pausing on Android" section for more info
await flutterTts.pause();// iOS, macOS, and Android only
// The last parameter is an optional boolean value for isFullPath (defaults to false)
await flutterTts.synthesizeToFile("Hello World", Platform.isAndroid ? "tts.wav" : "tts.caf", false);// Each voice is a Map containing at least these keys: name, locale
// - Windows (UWP voices) only: gender, identifier
// - iOS, macOS only: quality, gender, identifier
// - Android only: quality, latency, network_required, features 
List<Map> voices = await flutterTts.getVoices;await flutterTts.setVoice({"name": "Karen", "locale": "en-AU"});
// iOS, macOS only
await flutterTts.setVoice({"identifier": "com.apple.voice.compact.en-AU.Karen"});// iOS only
await flutterTts.setSharedInstance(true);// Android only
await flutterTts.speak("Hello World", focus: true);await flutterTts.setSilence(2);await flutterTts.getEngines;await flutterTts.getDefaultVoice;await flutterTts.isLanguageInstalled("en-AU");await flutterTts.areLanguagesInstalled(["en-AU", "en-US"]);await flutterTts.setQueueMode(1);await flutterTts.getMaxSpeechInputLength;await flutterTts.setAudioAttributesForNavigation();

监听平台

flutterTts.setStartHandler(() {setState(() {ttsState = TtsState.playing;});
});flutterTts.setCompletionHandler(() {setState(() {ttsState = TtsState.stopped;});
});flutterTts.setProgressHandler((String text, int startOffset, int endOffset, String word) {setState(() {_currentWord = word;});
});flutterTts.setErrorHandler((msg) {setState(() {ttsState = TtsState.stopped;});
});flutterTts.setCancelHandler((msg) {setState(() {ttsState = TtsState.stopped;});
});// Android, iOS and Web
flutterTts.setPauseHandler((msg) {setState(() {ttsState = TtsState.paused;});
});flutterTts.setContinueHandler((msg) {setState(() {ttsState = TtsState.continued;});
});

封装代码

// tts_service.dart
import 'package:flutter/material.dart';
import 'package:flutter_tts/flutter_tts.dart';class TtsService {final FlutterTts flutterTts = FlutterTts();Future<void> initTts() async {var availableLanguages = await flutterTts.getLanguages;print("Available languages: $availableLanguages");var isLanguageAvailable = await flutterTts.isLanguageAvailable("zh-CN");print("Is zh-CN available: $isLanguageAvailable");if (isLanguageAvailable) {await flutterTts.setLanguage("zh-CN"); // 设置语言为中文await flutterTts.setPitch(1.0); // 设置音调await flutterTts.setSpeechRate(1); // 设置语速} else {print("Language zh-CN is not available");}}Future<void> speak(String text) async {await initTts(); // 确保 TTS 服务已经初始化await flutterTts.speak(text); // 播放语音}
}

使用案例

class MyApp extends StatefulWidget {const MyApp({super.key});@override_MyAppState createState() => _MyAppState();
}class _MyAppState extends State<MyApp> {final TtsService ttsService = TtsService();@overridevoid initState() {super.initState();}@overrideWidget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: const Text('Flutter TTS Example')),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [ElevatedButton(onPressed: () async { await ttsService.speak("嘿嘿嘿哈哈哈"); },child: const Text('Speak'),),],),),),);}
}

 


http://www.ppmy.cn/ops/137046.html

相关文章

godot游戏引擎_瓦片集和瓦片地图介绍

在 Godot 中&#xff0c;TileSet 和 TileMap 是用于处理瓦片地图的两个关键概念&#xff0c;它们的作用和用途有明显的区别。以下是两者的详细对比&#xff1a; 1. TileSet&#xff08;瓦片集&#xff09; TileSet 是资源&#xff0c;定义瓦片的内容和属性。 特点&#xff1a…

【Electron学习笔记(二)】基于Electron开发应用程序

基于Electron开发本地应用程序 基于Electron开发本地应用程序前言正文1、创建 pages 目录2、创建 index.html 文件3 、创建 html.css 文件4 、main.js里引入页面5 、运行 start 命令6 、启用开发者模式7 、解决内容安全策略8、完善窗口行为9、配置自动重启&#xff0c;保存后自…

vue3+ts 我写了一个跟swagger.yml生成请求和响应实体(接口)

一、下载地址 swagger-to-ts: 使用python编写的一个根据swagger.yml生成vue3或ts的接口&#xff08;interface&#xff09;和类&#xff08;class&#xff09; - Gitee.com 进入下面页面&#xff0c;将这两个文件一起下载 二、配置 打开 config.toml 文件&#xff0c;修改ip为…

网络层协议IP

对于网络层我们直接通过IP协议来了解其内容 一.IP协议 首先我们先来了解几个概念&#xff1a; 主机&#xff1a;配有IP地址&#xff0c;但是不进行路由控制的设备 路由器&#xff1a;配有IP地址&#xff0c;同时进行路由控制的设备 节点&#xff1a;主机和路由器的统称 所以现在…

uni-app运行 安卓模拟器 MuMu模拟器

最近公司开发移动端系统&#xff0c;使用真机时每次调试的时候换来换去的麻烦&#xff0c;所以使用模拟器来调试方便。记录一下安装和连接的过程 一、安装MuMu模拟器 百度搜索MuMu模拟器并打开官网或者点这里MuMu模拟器官网 点击下载模拟器 安装模拟器&#xff0c;如果系统…

Oracle RMAN异机迁移恢复

Oracle RMAN异机迁移恢复 介绍 RMAN备份异机恢复几点说明&#xff1a; &#xff08;1&#xff09;RMAN异机恢复的时候&#xff0c;db name必须相同。 &#xff08;2&#xff09;如果恢复的路径和源库不一致&#xff0c;就需要在restorel时用set命令指定新位置。 准备异机恢…

PyTorch2

Tensor的常见操作&#xff1a; 获取元素值&#xff1a; 注意&#xff1a; 和Tensor的维度没有关系&#xff0c;都可以取出来&#xff01; 如果有多个元素则报错&#xff1b; import torch def test002():data torch.tensor([18])print(data.item())pass if __name__ &qu…

数字图像处理(6):除法运算、除法器

&#xff08;1&#xff09;当除数是常数时&#xff0c;可以先转化为乘法&#xff0c;再右移&#xff0c;乘法的N越大&#xff0c;计算误差越小。 如&#xff1a;计算x/122&#xff0c;可以看成&#xff08;x * 67&#xff09;>>13,N13,使用verilog实现&#xff1a; reg …