在 Flutter 中创建语音识别应用程序时如何处理此错误?
How to deal with this error when you are creation a Speech Recognition app in flutter?
D/SpeechRecognitionPlugin(10845): onError : 3
I/flutter (10845): _platformCallHandler call speech.onSpeechAvailability false
I/flutter (10845): _platformCallHandler call speech.onError 3
I/flutter (10845): Unknown
这是我的脚本:
import 'package:flutter/material.dart'; import
'package:speech_recognition/speech_recognition.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget { @override Widget
build(BuildContext context) {
return MaterialApp(
home: VoiceHome(),
); } }
class VoiceHome extends StatefulWidget { @override _VoiceHomeState
createState() => _VoiceHomeState(); }
class _VoiceHomeState extends State<VoiceHome> { SpeechRecognition
_speechRecognition; bool _isAvailable = false; bool _isListening = false;
String resultText = "";
@override void initState() {
super.initState();
initSpeechRecognizer(); }
void initSpeechRecognizer() {
_speechRecognition = SpeechRecognition();
_speechRecognition.setAvailabilityHandler(
(bool result) => setState(() => _isAvailable = result),
);
_speechRecognition.setRecognitionStartedHandler(
() => setState(() => _isListening = true),
);
_speechRecognition.setRecognitionResultHandler(
(String speech) => setState(() => resultText = speech),
);
_speechRecognition.setRecognitionCompleteHandler(
() => setState(() => _isListening = false),
);
_speechRecognition.activate().then(
(result) => setState(() => _isAvailable = result),
); }
@override Widget build(BuildContext context) {
return Scaffold(
body: Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
FloatingActionButton(
child: Icon(Icons.cancel),
mini: true,
backgroundColor: Colors.deepOrange,
onPressed: () {
if (_isListening)
_speechRecognition.cancel().then(
(result) => setState(() {
_isListening = result;
resultText = "";
}),
);
},
),
FloatingActionButton(
child: Icon(Icons.mic),
onPressed: () {
if (_isAvailable && !_isListening)
_speechRecognition
.listen(locale: "en_US")
.then((result) => print('$result'));
},
backgroundColor: Colors.pink,
),
FloatingActionButton(
child: Icon(Icons.stop),
mini: true,
backgroundColor: Colors.deepPurple,
onPressed: () {
if (_isListening)
_speechRecognition.stop().then(
(result) => setState(() => _isListening = result),
);
},
),
],
),
Container(
width: MediaQuery.of(context).size.width * 0.8,
decoration: BoxDecoration(
color: Colors.cyanAccent[100],
borderRadius: BorderRadius.circular(6.0),
),
padding: EdgeInsets.symmetric(
vertical: 8.0,
horizontal: 12.0,
),
child: Text(
resultText,
style: TextStyle(fontSize: 24.0),
),
)
],
),
),
); } }
3其实是指录音错误。假设您使用 android 模拟器或设备进行测试。 Source
这会给你一些提示来解决你的问题。您是否在 androidManifest.xml 中添加了您的权限?
<manifest
xmlns:android="http://schemas.android.com/apk/res/android" package="cookmakeeasy.xion.flutter_app_arthas">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <-- this line
D/SpeechRecognitionPlugin(10845): onError : 3
I/flutter (10845): _platformCallHandler call speech.onSpeechAvailability false
I/flutter (10845): _platformCallHandler call speech.onError 3
I/flutter (10845): Unknown
这是我的脚本:
import 'package:flutter/material.dart'; import
'package:speech_recognition/speech_recognition.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget { @override Widget
build(BuildContext context) {
return MaterialApp(
home: VoiceHome(),
); } }
class VoiceHome extends StatefulWidget { @override _VoiceHomeState
createState() => _VoiceHomeState(); }
class _VoiceHomeState extends State<VoiceHome> { SpeechRecognition
_speechRecognition; bool _isAvailable = false; bool _isListening = false;
String resultText = "";
@override void initState() {
super.initState();
initSpeechRecognizer(); }
void initSpeechRecognizer() {
_speechRecognition = SpeechRecognition();
_speechRecognition.setAvailabilityHandler(
(bool result) => setState(() => _isAvailable = result),
);
_speechRecognition.setRecognitionStartedHandler(
() => setState(() => _isListening = true),
);
_speechRecognition.setRecognitionResultHandler(
(String speech) => setState(() => resultText = speech),
);
_speechRecognition.setRecognitionCompleteHandler(
() => setState(() => _isListening = false),
);
_speechRecognition.activate().then(
(result) => setState(() => _isAvailable = result),
); }
@override Widget build(BuildContext context) {
return Scaffold(
body: Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
FloatingActionButton(
child: Icon(Icons.cancel),
mini: true,
backgroundColor: Colors.deepOrange,
onPressed: () {
if (_isListening)
_speechRecognition.cancel().then(
(result) => setState(() {
_isListening = result;
resultText = "";
}),
);
},
),
FloatingActionButton(
child: Icon(Icons.mic),
onPressed: () {
if (_isAvailable && !_isListening)
_speechRecognition
.listen(locale: "en_US")
.then((result) => print('$result'));
},
backgroundColor: Colors.pink,
),
FloatingActionButton(
child: Icon(Icons.stop),
mini: true,
backgroundColor: Colors.deepPurple,
onPressed: () {
if (_isListening)
_speechRecognition.stop().then(
(result) => setState(() => _isListening = result),
);
},
),
],
),
Container(
width: MediaQuery.of(context).size.width * 0.8,
decoration: BoxDecoration(
color: Colors.cyanAccent[100],
borderRadius: BorderRadius.circular(6.0),
),
padding: EdgeInsets.symmetric(
vertical: 8.0,
horizontal: 12.0,
),
child: Text(
resultText,
style: TextStyle(fontSize: 24.0),
),
)
],
),
),
); } }
3其实是指录音错误。假设您使用 android 模拟器或设备进行测试。 Source
这会给你一些提示来解决你的问题。您是否在 androidManifest.xml 中添加了您的权限?
<manifest
xmlns:android="http://schemas.android.com/apk/res/android" package="cookmakeeasy.xion.flutter_app_arthas">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <-- this line