はじめに
FlutterのSpeech to Textを使用する流れを、簡単にまとめておきます。
やること
1.マイクボタンの作成
2.ios(Info.plist), Android(AndroidManifest.xml)に 音声認識とマイクを許可するようにコードを追加
3.iosの場合、マイクボタンを押した時のサウンドがないので追加(pubspec.yamlのassets以下に音声データのパスを追記)
4.各音声メソッドの初期化など
実装例
1.マイクボタンの作成
sample1.dart
floatingActionButton: FloatingActionButton(
// マイクボタンを押した時、音声認識をスタートさせる
onPressed: () async {
if (await speechToText.hasPermission && speechToText.isNotListening) {
await startListening();
} else if (speechToText.isListening) {
await stopListening();
} else {
initSpeechToText();
}
},
child: Icon(Icons.mic),
),
2.ios(Info.plist), Android(AndroidManifest.xml)に 音声認識とマイクを許可するようにコードを追加。
Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- 音声とマイクの許可のため、以下の4行を追加 -->
<key>NSSpeechRecognitionUsageDescription</key>
<string>For use sound input with ChatGPT</string>
<key>NSMicrophoneUsageDescription</key>
<string>For use sount input with ChatGPT</string>
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.takuya.voistant.voistant">
<!-- 音声とマイクの許可 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
<!-- AndroidSDKを30以降にしている場合、以下のqueries句を追加する必要がある。 -->
<queries>
<intent>
<action android:name="android.speech.RecognitionService" />
</intent>
</queries>
3.iosの場合、マイクボタンを押した時のサウンドがないので、追加してやる。(pubspec.yamlのassets以下に音声データのパスを追記)
※ 音声データは以下のリンクから
pabspec.yaml
assets:
- assets/sounds/
4.各音声メソッドの初期化など
sample2.dart
class _HomePageState extends State<HomePage> {
// 音声入力の設定
final speechToText = SpeechToText();
String lastWords = "";
@override
void initState() {
// TODO: implement initState
super.initState();
initSpeechToText();
}
Future<void> initSpeechToText() async {
await speechToText.initialize();
setState(() {});
}
/// Each time to start a speech recognition session
Future<void> startListening() async {
await speechToText.listen(onResult: onSpeechResult);
setState(() {});
}
Future<void> stopListening() async {
await speechToText.stop();
setState(() {});
}
void onSpeechResult(SpeechRecognitionResult result) {
setState(() {
lastWords = result.recognizedWords;
});
}
@override
void dispose() {
// TODO: implement dispose
super.dispose();
speechToText.stop();
}
参考