Флаттер текста в речь: произнесите несколько строк впоследствии с разными речевыми ставками - PullRequest
1 голос
/ 03 мая 2019

У меня проблема с пакетом Flutter Text To Speech.При нажатии на FloatingActionButton я хотел бы говорить / играть несколько строк (с разными речевыми скоростями) впоследствии.Однако при этом я могу слышать только последнюю строку, которую я передал в функцию, а не первую.

Как вы можете видеть из приведенного ниже кода, я попытался использовать асинхронностьпрограммирование (асинхронное / ожидание).

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);
}

При нажатии кнопки FloatingAction я ожидаю, что программа сначала выполнит функцию playTtsString1 («eins» со скоростью 0,5), а затем функцию playTtsString2 («zwei» со скоростью 1).

Однако почему-то я слышу только программу, говорящую "zwei".Я полагаю, что программа не ожидает завершения первой функции playTtsString1 и уже выполняет вторую функцию playTtsString2.Буду очень признателен за любую помощь в этом вопросе!

1 Ответ

0 голосов
/ 04 мая 2019
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;

  FlutterTts flutterTts;
  bool bolSpeaking = false;

  Future playTtsString1() async {
    bolSpeaking = true;
    currentTtsString = text1;
    currentSpeechRate = ttsSpeechRate1;
    await runTextToSpeech(currentTtsString, currentSpeechRate);
    return null;
  }

  Future playTtsString2() async {
    bolSpeaking = true;
    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 {
        // Play String 1
        await playTtsString1();

        // Check String 1 Finish
        new Future.delayed(new Duration(milliseconds: 100), () async {
            // loop until bolSpeaking = false
            while (bolSpeaking) {
              await Thread.sleep(100);
            }

            // play String 2
            await playTtsString2();
        }
      },
    )
  );
  }
}


Future<void> runTextToSpeech(String currentTtsString, double currentSpeechRate) async {
  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);

  flutterTts.setCompletionHandler(() {
    setState(() {
      // The following code(s) will be called when the TTS finishes speaking
      bolSpeaking = false;
    });
  });

  flutterTts.speak(currentTtsString);
}
...