Voice Commands On Flutter Application

135 Views Asked by At

I tried to do give a command to the flutter application using voice commands and in the application there was a text to voice function. so when i tried to give read command using voice there was a repeat on that function. how to avoid the repeat.

I have tried to terminate the Listening function after getting one input but it dosen't work.

Tried to terminate the Listening function. but same error

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:newsapp/screens/News_Screen.dart';
import 'package:newsapp/utils/app_colors.dart';
import 'package:newsapp/utils/assets_constants.dart';
import 'package:webfeed/webfeed.dart';
import 'package:flutter_tts/flutter_tts.dart';
import 'package:url_launcher/url_launcher.dart';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter_speech/flutter_speech.dart';

const languages = const [
  // const Language('Francais', 'fr_FR'),
  const Language('English', 'en_US'),
  const Language('Pусский', 'ru_RU'),
  const Language('Italiano', 'it_IT'),
  const Language('Español', 'es_ES'),
];

class Language {
  final String name;
  final String code;

  const Language(this.name, this.code);
}

class BBCNews extends StatefulWidget {
  @override
  _BBCNewsState createState() => _BBCNewsState();
}

class _BBCNewsState extends State<BBCNews> {
  late SpeechRecognition _speech;
  FlutterTts flutterTts = FlutterTts();

  bool _speechRecognitionAvailable = false;
  bool _isListening = false;

  String transcription = '';
  String _currentLocale = 'en_US';
  //Language selectedLang = languages.first;

  @override
  initState() {
    super.initState();
    activateSpeechRecognizer();
  }

  void activateSpeechRecognizer() {
    //print('_MyAppState.activateSpeechRecognizer... ');
    _speech = SpeechRecognition();
    _speech.setAvailabilityHandler(onSpeechAvailability);
    _speech.setRecognitionStartedHandler(onRecognitionStarted);
    _speech.setRecognitionResultHandler(onRecognitionResult);
    _speech.setRecognitionCompleteHandler(onRecognitionComplete);
    _speech.setErrorHandler(errorHandler);
    _speech.activate('en_US').then((res) {
      setState(() => _speechRecognitionAvailable = res);
    });
  }

  var client = http.Client();

  Future myDevBlog() async {
    var response = await client
        
 .get(Uri.parse('http://feeds.bbci.co.uk/news/world/rss.xml'));

    var channel = RssFeed.parse(response.body);

    final item = channel.items;

    return item;
  }

  Future<void> openFeed(String url) async {
    if (await canLaunch(url)) {
      await launch(
        url,
        forceSafariVC: true,
        forceWebView: false,
      );

      return;
    }
  }

  rightIcon() {
    return const Icon(
      Icons.keyboard_arrow_right,
      color: Colors.grey,
      size: 30,
    );
  }

  

  @override
  Widget build(BuildContext context) {
    var currentIndex;
    return Scaffold(
      appBar: AppBar(
        backgroundColor: AppColors.primaryColor,

        //title: const Text('VoiceNews'),

        title: Image.asset(
          AssetConstants.iconPath,
          width: 150,
        ),

        elevation: 10.0,

        actions: [
          IconButton(
              onPressed: _speechRecognitionAvailable && !_isListening
                  ? () => start()
                  : null,
              icon: const Icon(Icons.play_arrow_rounded)),
          IconButton(
              onPressed: _isListening ? () => stop() : null,
              icon: const Icon(Icons.stop_circle))
        ],
      ),
      body: StreamBuilder(
        stream: myDevBlog().asStream(),
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            return ListView.builder(
              itemCount: snapshot.data.length,
              itemBuilder: (context, int index) {
                if (transcription.toLowerCase() == "play") {
                  // _isListening = false;
                  //stop();
                  print(transcription);
                  speak(snapshot.data[1].title);
                  var currentIndex = 0;
                } else if (transcription.toLowerCase() == "next") {
                  // _isListening = false;
                  speak(snapshot.data[2].title);
                  print(transcription);
                } else if (transcription.toLowerCase() == "all") {
                  // _isListening = false;
                  errorHandler();
                  //speak("Wrong Input");
                  //cancel();
                }
                return Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Card(
                    child: ListTile(
                      title: Text(snapshot.data[index].title),

                      subtitle: 

Text(snapshot.data[index].description),
    
                          //onTap: () => 
speak(snapshot.data[index].title),
    
                          // onTap: () => 
openFeed(snapshot.data[index].link),
    
                          onTap: () {
                            Navigator.push(
                              context,
                              MaterialPageRoute(
                                builder: (context) =>
                                    
   newsScreen(snapshot.data[index].link),
                                // Pass the arguments as part of the 
  RouteSettings. The
                                // DetailScreen reads the arguments 
 from these settings.
                                // settings: RouteSettings(
                                //   arguments: todos[index],
                                // ),
                              ),
                            );
                            print(snapshot.data[index].link);
                          },
    
                          onLongPress: () =>
                              
  speak(snapshot.data[index].description),
    
                          leading: Text((1 + index).toString()),
    
                          trailing: rightIcon(),
                        ),
                      ),
                    );
                  },
                );
              } else if (snapshot.hasError ||
                  snapshot.connectionState == ConnectionState.none) {
                return Center(
                  child: Text(snapshot.error.toString()),
                );
              }
    
              return const Center(
                child: CircularProgressIndicator(),
              );
            },
          ),
        );
      }
    
      // List<CheckedPopupMenuItem<Language>> get 
  _buildLanguagesWidgets => languages
     
    
      void start() => _speech.activate(_currentLocale).then((_) {
            return _speech.listen().then((result) {
              print('_MyAppState.start => result $result');
              
              setState(() {
                _isListening = result;
              });
            });
          });
    
      void cancel() =>
          _speech.cancel().then((_) => setState(() => _isListening = 
   false));
    
      void stop() => _speech.stop().then((_) {
            setState(() => _isListening = false);
          });
      void onSpeechAvailability(bool result) =>
          setState(() => _speechRecognitionAvailable = result);
      // void onCurrentLocale(String locale) {
      //   // print('_MyAppState.onCurrentLocale... $locale');
      //   setState(
      //       () => _currentLocale = languages.firstWhere((l) => 
    l.code == locale));
      // }
    
      void onRecognitionStarted() {
        setState(() => _isListening = true);
      }
    
      void onRecognitionResult(String text) {
        // print('_MyAppState.onRecognitionResult... $text');
        setState(() => transcription = text);
      }
    
      void onRecognitionComplete(String text) {
        //print('_MyAppState.onRecognitionComplete... $text');
        setState(() => _isListening = false);
      }
    
      void errorHandler() => activateSpeechRecognizer();
    
      void speak(String text) async {
        await flutterTts.speak(text);
    
        await flutterTts.setLanguage("en-US");
    
        await flutterTts.setPitch(1);
    
        await flutterTts.setSpeechRate(0.6);
      }
    }
0

There are 0 best solutions below