Flutter:带有表单的 SpeechToTextProvider

问题描述 投票:0回答:1

我快要疯了

speech_to_text

在我的应用程序中,我有各种形式,每种形式都有不同的

TextFormFields
。 对于每个输入,我都必须连接一个麦克风,以便我可以转录所说的内容。 我已经用基本的
SpeechToText
实现了所有内容,但由于各种初始化,它带来了一些问题。 然后,我通过切换到
SpeechToTextProvider
并从插件提供的这段代码中获得灵感 来修改所有内容。

但是,我无法确保将口语文本逐字转录到输入中。 在

SpeechToText

 中,这是通过监听事件的 
onResult
 参数处理的,但这在提供者上不可用!

有人可以帮助我吗? 一千个感谢!

这里是一个表单的代码,为简单起见,只有一个输入:

class WeekForm extends StatefulWidget { const WeekForm({required this.week, super.key}); final Week week; @override State<WeekForm> createState() => _WeekFormState(); } class _WeekFormState extends State<WeekForm> { Week get week => widget.week; final _formKey = GlobalKey<FormState>(debugLabel: "WeekForm"); final TextEditingController _learnedController = TextEditingController(); String _lastTextChange = ''; void _setLastTextChange(inputKey, lastText) { setState(() { _lastTextChange = lastText; }); } void _saveLearn(week, appState) async { if (_formKey.currentState!.validate()) { week.learned = _learnedController.text; // save data to Firebase appState.setWeek(week); } } @override void initState() { ///fetched data from firebase showing on controller super.initState(); _learnedController.text = week.learned ?? ""; _setLastTextChange("learned", _learnedController.text); } @override Widget build(BuildContext context) { return Form( key: _formKey, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ // Add TextFormFields and ElevatedButton here. Row( children: [ Expanded( child: TextFormField( controller: _learnedController, decoration: const InputDecoration( border: OutlineInputBorder(), ), onChanged: (value) { _setLastTextChange("learned", value); }, ), ), SpeechProvider( key: const ValueKey("learned"), controller: _learnedController, lastInputChange: _lastTextChange, setLastInputChange: _setLastTextChange, ), ], ), Consumer<ApplicationState>( builder: (context, appState, _) => Align( alignment: Alignment.bottomRight, child: ElevatedButton( onPressed: () => _saveLearn(week, appState), child: const Text("Save"), ), ), ), ], ), ); } }
这是调用的代码

SpeechToTextProvider

import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:speech_to_text/speech_to_text_provider.dart'; class SpeechProvider extends StatefulWidget { const SpeechProvider({ super.key, required this.controller, required this.lastInputChange, required this.setLastInputChange, }); final TextEditingController controller; final String lastInputChange; final void Function(String, String) setLastInputChange; @override SpeechProviderState createState() => SpeechProviderState(); } class SpeechProviderState extends State<SpeechProvider> { String lastWords = ''; String lastStatus = ''; late SpeechToTextProvider speechProvider; void startListening() { if (speechProvider.isAvailable && speechProvider.isNotListening) { lastWords = ''; speechProvider.listen( // I want something like this!!! but this is available only in basic SpeechToText onResult: resultListener, ); } } void stopListening() { if (speechProvider.isListening) { speechProvider.stop(); widget.setLastInputChange((widget.key as ValueKey<dynamic>).value, widget.controller.text); setState(() {}); } } /// This callback is invoked each time new recognition results are /// available after `listen` is called. void resultListener() { var result = speechProvider.lastResult; if (result!.finalResult) { widget.setLastInputChange((widget.key as ValueKey<dynamic>).value, widget.controller.text); } else { setState(() { lastWords = result.recognizedWords; }); widget.controller.text = '${widget.lastInputChange} $lastWords'; } } @override Widget build(BuildContext context) { speechProvider = Provider.of<SpeechToTextProvider>(context); if (speechProvider.isNotAvailable) { return const Center( child: Text('Speech recognition not available, no permission or not available on the device.'), ); } return MicrophoneWidget(speechProvider.isListening, startListening, stopListening, key: UniqueKey()); } } class MicrophoneWidget extends StatelessWidget { const MicrophoneWidget(this.isListening, this.startListening, this.stopListening, {super.key}); final bool isListening; final void Function() startListening; final void Function() stopListening; @override Widget build(BuildContext context) { return TapRegion( onTapOutside: (tap) => isListening ? stopListening() : null, child: Padding( padding: const EdgeInsets.all(8.0), child: SizedBox( child: FloatingActionButton( onPressed: isListening ? stopListening : startListening, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(80.0)), ), child: Icon(isListening ? Icons.mic : Icons.mic_off), ), ), ), ); } }
    
flutter forms input speech-to-text
1个回答
0
投票
根据您的描述,我认为您希望有一种方法可以在有新产品时获得

SpeechRecognitionResult

SpeechToTextProvider
公开了一个
stream
 getter,您可以监听它并从它发出的事件中访问识别结果:

speechProvider.stream.listen((event) { final result = event.recognitionResult; });
    
© www.soinside.com 2019 - 2024. All rights reserved.