text_to_speech_macos 0.1.1 text_to_speech_macos: ^0.1.1 copied to clipboard
MacOS platform implementation of text_to_speech.
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:text_to_speech_platform_interface/text_to_speech_platform.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final String defaultLanguage = 'en-US';
TextToSpeechPlatform tts = TextToSpeechPlatform.instance;
String text = '';
double volume = 1; // Range: 0-1
double rate = 1.0; // Range: 0-2
double pitch = 1.0; // Range: 0-2
String? language;
String? languageCode;
List<String> languages = [];
List<String> languageCodes = [];
String? voice;
TextEditingController textEditingController = TextEditingController();
@override
void initState() {
super.initState();
textEditingController.text = text;
WidgetsBinding.instance?.addPostFrameCallback((_) {
initLanguages();
});
}
Future<void> initLanguages() async {
/// populate lang code (i.e. en-US)
languageCodes = await tts.getLanguages();
/// populate displayed language (i.e. English)
List<String>? displayLanguages = await tts.getDisplayLanguages();
if (displayLanguages == null) {
return;
}
languages.clear();
for (dynamic lang in displayLanguages) {
languages.add(lang as String);
}
/// get default language
final String? defaultLangCode = await tts.getDefaultLanguage();
if (defaultLangCode != null && languageCodes.contains(defaultLangCode)) {
languageCode = defaultLangCode;
} else {
languageCode = defaultLanguage;
}
language = await tts.getDisplayLanguageByCode(languageCode!);
/// get voice
voice = await getVoiceByLang(languageCode!);
if (mounted) {
setState(() {});
}
}
Future<String?> getVoiceByLang(String lang) async {
List<String>? voices = await tts.getVoiceByLang(languageCode!);
if (voices != null && voices.isNotEmpty) {
return voices.first;
}
return null;
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Text-to-Speech Example'),
),
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Center(
child: Column(
children: <Widget>[
TextField(
controller: textEditingController,
maxLines: 5,
decoration: InputDecoration(
border: OutlineInputBorder(),
hintText: 'Enter some text here...'),
onChanged: (String newText) {
setState(() {
text = newText;
});
},
),
Row(
children: <Widget>[
Text('Volume'),
Expanded(
child: Slider(
value: volume,
min: 0,
max: 1,
label: volume.round().toString(),
onChanged: (double value) {
initLanguages();
setState(() {
volume = value;
});
},
),
),
Text('(${volume.toStringAsFixed(2)})'),
],
),
Row(
children: <Widget>[
Text('Rate'),
Expanded(
child: Slider(
value: rate,
min: 0,
max: 2,
label: rate.round().toString(),
onChanged: (double value) {
setState(() {
rate = value;
});
},
),
),
Text('(${rate.toStringAsFixed(2)})'),
],
),
Row(
children: <Widget>[
Text('Pitch'),
Expanded(
child: Slider(
value: pitch,
min: 0,
max: 2,
label: pitch.round().toString(),
onChanged: (double value) {
setState(() {
pitch = value;
});
},
),
),
Text('(${pitch.toStringAsFixed(2)})'),
],
),
Row(
children: <Widget>[
Text('Language'),
SizedBox(
width: 20,
),
DropdownButton<String>(
value: language,
icon: const Icon(Icons.arrow_downward),
iconSize: 24,
elevation: 16,
style: const TextStyle(color: Colors.deepPurple),
underline: Container(
height: 2,
color: Colors.deepPurpleAccent,
),
onChanged: (String? newValue) async {
languageCode =
await tts.getLanguageCodeByName(newValue!);
voice = await getVoiceByLang(languageCode!);
setState(() {
language = newValue;
});
},
items: languages
.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
),
],
),
SizedBox(
height: 20,
),
Row(
children: <Widget>[
Text('Voice'),
SizedBox(
width: 20,
),
Text('${voice ?? '-'}'),
],
),
SizedBox(
height: 20,
),
Row(
children: <Widget>[
Expanded(
child: Container(
padding: EdgeInsets.only(right: 10),
child: ElevatedButton(
child: Text('Stop'),
onPressed: () {
tts.stop();
},
),
),
),
if (supportPause)
Expanded(
child: Container(
padding: EdgeInsets.only(right: 10),
child: ElevatedButton(
child: Text('Pause'),
onPressed: () {
tts.pause();
},
),
),
),
if (supportResume)
Expanded(
child: Container(
padding: EdgeInsets.only(right: 10),
child: ElevatedButton(
child: Text('Resume'),
onPressed: () {
tts.resume();
},
),
),
),
Expanded(
child: Container(
child: ElevatedButton(
child: Text('Speak'),
onPressed: () {
speak();
},
),
))
],
)
],
),
),
),
),
),
);
}
bool get supportPause => defaultTargetPlatform != TargetPlatform.android;
bool get supportResume => defaultTargetPlatform != TargetPlatform.android;
void speak() {
tts.setVolume(volume);
tts.setRate(rate);
if (languageCode != null) {
tts.setLanguage(languageCode!);
}
tts.setPitch(pitch);
tts.speak(text);
}
}