首页 > 解决方案 > 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”。我真的很感激在这件事上的任何帮助!

标签: dartflutterasync-awaittext-to-speechfuture

解决方案


这现在应该适用于最新的 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);
}

推荐阅读