dart - Flutter Text To Speech:随后用不同的 SpeechRates 说出几个字符串
问题描述
我对 Flutter Text To Speech 包有疑问。单击 FloatingActionButton 时,我想随后说出/播放几个字符串(具有不同的 Speechrates)。但是,这样做时,我只能听到传递给函数的最后一个字符串,而不是第一个。
正如您在下面的代码中看到的那样,我尝试使用异步编程(async / await)。
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter_tts/flutter_tts.dart';
class SpeakerClass extends StatefulWidget{
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return _SpeakerClassState();
}
}
class _SpeakerClassState extends State<SpeakerClass>{
String text1 = 'eins';
String text2 = 'zwei';
String text3 = 'drei';
String text4 = 'vier';
String currentTtsString;
double ttsSpeechRate1 = 0.5;
double ttsSpeechRate2 = 1.0;
double currentSpeechRate;
Future playTtsString1() async {
currentTtsString = text1;
currentSpeechRate = ttsSpeechRate1;
await runTextToSpeech(currentTtsString, currentSpeechRate);
return null;
}
Future playTtsString2() async {
currentTtsString = text2;
currentSpeechRate = ttsSpeechRate2;
await runTextToSpeech(currentTtsString, currentSpeechRate);
return null;
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: FloatingActionButton (
backgroundColor: Colors.blue,
child: Icon(Icons.volume_up, color: Colors.white),
onPressed: () async {
await playTtsString1();
await playTtsString2();
},
)
);
}
}
Future<void> runTextToSpeech(String currentTtsString, double currentSpeechRate) async {
FlutterTts flutterTts;
flutterTts = new FlutterTts();
await flutterTts.setLanguage("en-GB");
await flutterTts.setVolume(1.0);
await flutterTts.setPitch(1.0);
await flutterTts.isLanguageAvailable("en-GB");
await flutterTts.setSpeechRate(currentSpeechRate);
await flutterTts.speak(currentTtsString);
}
当按下 FloatingActionButton 时,我希望程序首先执行函数 playTtsString1(“eins”,速度为 0.5),然后执行函数 playTtsString2(“zwei”,速度为 1)。
但是,不知怎的,我只能听到程序说“zwei”。我猜程序不是在等待第一个函数“playTtsString1”完成,而是已经执行了第二个函数“playTtsString2”。我真的很感激在这件事上的任何帮助!
解决方案
这现在应该适用于最新的 flutter_tts 版本。
您只需要在说话发生之前设置 awaitSpeakCompletion。您可以像这样更新您的运行方法:
Future<void> runTextToSpeech(String currentTtsString, double currentSpeechRate) async {
FlutterTts flutterTts;
flutterTts = new FlutterTts();
await flutterTts.awaitSpeakCompletion(true);
await flutterTts.setLanguage("en-GB");
await flutterTts.setVolume(1.0);
await flutterTts.setPitch(1.0);
await flutterTts.isLanguageAvailable("en-GB");
await flutterTts.setSpeechRate(currentSpeechRate);
await flutterTts.speak(currentTtsString);
}
推荐阅读
- python - 如何计算召回率、精度和 f-measure?
- mp4 - 是否可以在 mp4 文件的一个轨道中存储多个视频段落,每个段落都有自己的参数?
- c++ - x86 asm 在 __declspec(naked) 函数中访问和编辑 stdcall 函数参数
- r - 避免在 .SD 越界索引期间创建 NA
- javascript - 在画布中裁剪图像
- java - 错误:没有找到 void org.webrtc.PeerConnectionFactory.initializeFieldTrials 的实现
- javascript - jQuery css 方法在 Wordpress 主题中不起作用
- python - 根据另一个df中最小/最大日期范围内的日期合并/加入熊猫
- ionic-framework - 如何删除多余的重新排序图标?
- flutter - 颤振:断点调试期间的 NoSuchMethodError