1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- import 'dart:io';
- import 'package:flutter_tts/flutter_tts.dart';
- import '../models/index.dart';
- import 'log_util.dart';
- class FlutterTTSHelper {
- // 单例
- static final FlutterTTSHelper instance = FlutterTTSHelper._internal();
- factory FlutterTTSHelper() => instance;
- FlutterTTSHelper._internal();
- final FlutterTts _tts = FlutterTts();
- TtsState ttsState = TtsState.stopped;
- /// 初始化
- Future<void> init() async {
- await _tts.awaitSpeakCompletion(true);
- await _tts.setLanguage("zh-CN"); // 语言
- await _tts.setSpeechRate(0.5); // 语速
- await _tts.setVolume(0.8); // 声音
- _tts.setStartHandler(() {
- OLogger.i('FlutterTts start playing ......');
- ttsState = TtsState.playing;
- });
- _tts.setCompletionHandler(() {
- OLogger.i('FlutterTts play completion ......');
- ttsState = TtsState.stopped;
- });
- _tts.setCancelHandler(() {
- OLogger.i('FlutterTts cancel play ......');
- ttsState = TtsState.stopped;
- });
- _tts.setPauseHandler(() {
- OLogger.i('FlutterTts paused play ......');
- ttsState = TtsState.paused;
- });
- _tts.setContinueHandler(() {
- OLogger.i('FlutterTts Continue play ......');
- ttsState = TtsState.continued;
- });
- _tts.setErrorHandler((msg) {
- OLogger.e('FlutterTts error $msg');
- ttsState = TtsState.stopped;
- });
- OLogger.i('TTS init completed!');
- }
- /// 当前状态
- TtsState currentState() {
- return ttsState;
- }
- /// 开始说话
- Future<void> speak(String msg) async {
- if (ttsState != TtsState.stopped) {
- await stop();
- }
- if (Platform.isIOS) {
- await _tts.setSharedInstance(true);
- await _tts.setIosAudioCategory(IosTextToSpeechAudioCategory.ambientSolo, [IosTextToSpeechAudioCategoryOptions.defaultToSpeaker]);
- }
- final result = await _tts.speak(msg);
- OLogger.i('用户指令 TTS speak $result');
- }
- /// 结束说话
- Future<void> stop() async {
- final result = await _tts.stop();
- OLogger.i('用户指令 TTS stoped $result');
- }
-
- }
|