cloud_text_to_speech 2.1.0 cloud_text_to_speech: ^2.1.0 copied to clipboard
Single interface to Google, Microsoft and Amazon Text-To-Speech.
Cloud Text-To-Speech #
Single interface to Google, Microsoft, and Amazon Text-To-Speech. Flutter implementation of:
Features #
- Universal implementation for accessing all providers with one interface.
- Separate implementation for every provider so we could access every functionality.
- Sanitize SSML input per provider so we send only supported SSML elements.
- Locale names in English and native language so we could display language selector.
- Fake name generation for Google voices that are generated randomly based on voice locale.
- Accessible configurable output format (per provider), rate, and pitch.
Getting Started #
There are essentially two ways to use Cloud Text-To-Speech:
- Universal: Using TtsUniversal to be able to configure the TTS provider dynamically and us it.
- Single: Using Providers.google, Providers.microsoft, Providers.amazon to use the single provider at a time.
- Combine: Using Providers.combine to combine all providers and get all voices at once.
- Provider: Using TtsGoogle, TtsMicrosoft, TtsAmazon to get the most from provider's API.
Universal(Single) #
To init configuration use:
//Do init once and run it before any other method
TtsUniversal.init(
provider: Providers.amazon,
googleParams: InitParamsGoogle(apiKey: 'API-KEY'),
microsoftParams: InitParamsMicrosoft(
subscriptionKey: 'SUBSCRIPTION-KEY', region: 'eastus'),
amazonParams: InitParamsAmazon(
keyId: 'KEY-ID', accessKey: 'ACCESS-KEY', region: 'us-east-1'),
withLogs: true
);
To change provider use:
TtsUniversal.setProvider(Providers.microsoft);
To get the list of all voices use:
// Get voices
final voicesResponse = await TtsUniversal.getVoices();
final voices = voicesResponse.voices;
//Print all available voices
print(voices);
//Pick an English Voice
final voice = voices
.where((element) => element.locale.code.startsWith("en-"))
.toList(growable: false)
.first;
To convert TTS and get audio use:
//Generate Audio for a text
const text = "Amazon, Microsoft and Google Text-to-Speech API are awesome";
final ttsParams = TtsParamsUniversal(
voice: voice,
audioFormat: AudioOutputFormatUniversal.mp3_64k,
text: text,
rate: 'slow', // optional
pitch: 'default' // optional
);
final ttsResponse = await TtsUniversal.convertTts(ttsParams);
//Get the audio bytes.
final audioBytes = ttsResponse.audio.buffer.asByteData();
Universal(Combine) #
To init configuration use:
//Do init once and run it before any other method
TtsUniversal.init(
provider: Providers.combine,
googleParams: InitParamsGoogle(apiKey: 'API-KEY'),
microsoftParams: InitParamsMicrosoft(
subscriptionKey: 'SUBSCRIPTION-KEY', region: 'eastus'),
amazonParams: InitParamsAmazon(
keyId: 'KEY-ID', accessKey: 'ACCESS-KEY', region: 'us-east-1'),
withLogs: true
);
To change provider use:
TtsUniversal.setProvider(Providers.combine);
To get the list of all voices use:
// Get voices
final voicesResponse = await TtsUniversal.getVoices();
final voices = voicesResponse.voices;
//Print all available voices
print(voices);
//Pick an English Voice
final voice = voices
.where((element) => element.locale.code.startsWith("en-"))
.toList(growable: false)
.first;
To convert TTS and get audio use:
//Generate Audio for a text
const text = "Amazon, Microsoft and Google Text-to-Speech API are awesome";
final ttsParams = TtsParamsUniversal(
voice: voice,
audioFormat: AudioOutputFormatUniversal.mp3_64k,
text: text,
rate: 'slow', // optional
pitch: 'default' // optional
);
final ttsResponse = await TtsUniversal.convertTts(ttsParams);
//Get the audio bytes.
final audioBytes = ttsResponse.audio.buffer.asByteData();
Google #
To init configuration use:
//Do init once and run it before any other method
TtsGoogle.init(params: InitParamsGoogle(apiKey: "API-KEY"), withLogs: true);
To get the list of all voices use:
// Get voices
final voicesResponse = await TtsGoogle.getVoices();
final voices = voicesResponse.voices;
//Print all voices
print(voices);
//Pick an English Voice
final voice = voices
.where((element) => element.locale.code.startsWith("en-"))
.toList(growable: false)
.first;
To convert TTS and get audio use:
//Generate Audio for a text
final text = '<speak>Google<break time="2s"> Speech Service Text-to-Speech API is awesome!</speak>';
TtsParamsGoogle ttsParams = TtsParamsGoogle(
voice: voice,
audioFormat: AudioOutputFormatGoogle.mp3,
text: text,
rate: 'slow', // optional
pitch: 'default' // optional
);
final ttsResponse = await TtsGoogle.convertTts(ttsParams);
//Get the audio bytes.
final audioBytes = ttsResponse.audio.buffer.asByteData();
Microsoft #
To init configuration use:
//Do init once and run it before any other method
TtsMicrosoft.init(
params: InitParamsMicrosoft(
subscriptionKey: "SUBSCRIPTION-KEY", region: "eastus"),
withLogs: true
);
To get the list of all voices use:
// Get voices
final voicesResponse = await TtsMicrosoft.getVoices();
final voices = voicesResponse.voices;
//Print all voices
print(voices);
//Pick an English Voice
final voice = voices
.where((element) => element.locale.code.startsWith("en-"))
.toList(growable: false)
.first;
To convert TTS and get audio use:
//Generate Audio for a text
final text = '<speak>Microsoft<break time="2s"> Speech Service Text-to-Speech API is awesome!</speak>';
TtsParamsMicrosoft ttsParams = TtsParamsMicrosoft(
voice: voice,
audioFormat: AudioOutputFormatMicrosoft.audio48Khz192kBitrateMonoMp3,
text: text,
rate: 'slow', // optional
pitch: 'default' // optional
);
final ttsResponse = await TtsMicrosoft.convertTts(ttsParams);
//Get the audio bytes.
final audioBytes = ttsResponse.audio.buffer.asByteData();
Amazon #
To init configuration use:
//Do init once and run it before any other method
TtsAmazon.init(
params: InitParamsAmazon(keyId: 'KEY-ID', accessKey: 'ACCESS-KEY', region: 'us-east-1'),
withLogs: true
);
To get the list of all voices use:
// Get voices
final voicesResponse = await TtsAmazon.getVoices();
final voices = voicesResponse.voices;
//Print all voices
print(voices);
//Pick an English Voice
final voice = voices
.where((element) => element.locale.code.startsWith("en-"))
.toList(growable: false)
.first;
To convert TTS and get audio use:
//Generate Audio for a text
final text = '<speak>Amazon<break time="2s"> Speech Service Text-to-Speech API is awesome!</speak>';
TtsParamsAmazon ttsParams = TtsParamsAmazon(
voice: voice,
audioFormat: AudioOutputFormatAmazon.audio48Khz192kBitrateMonoMp3,
text: text,
rate: 'slow', // optional
pitch: 'default' // optional
);
final ttsResponse = await TtsAmazon.convertTts(ttsParams);
//Get the audio bytes.
final audioBytes = ttsResponse.audio.buffer.asByteData();
Notes #
There are things you should take care of:
- Securing of your API keys and credentials, they could be extracted from your mobile app.
- Sometimes Amazon Polly is not working in emulator, so you could get 403 error.
- For fixing SSML/XML before passing it to TTS Params, you could use the xml packages, method
XmlDocument.parse(ssml).toXmlString()
. - Audio has uniform format for all providers, it is Uint8List that you could use to play it or save it to file.
- Some player packages that are good fit are: audioplayers and assets_audio_player.