Search packages, repositories and app categories

Package detailsv2.3.2

cloud_text_to_speech

Single interface to Google, Microsoft and Amazon Text-To-Speech.

AndroidiOSWebmacOSWindowsLinux
30-day downloads
294
Likes
31
Pub points
120

Install package

flutter pub add cloud_text_to_speech

Package Overview

Package selection guidance compiled from public package information, community data, and project usage.

A unified Flutter package that provides a single interface to integrate text-to-speech functionality from Google, Microsoft, and Amazon cloud services. It simplifies voice output implementation across multiple platforms by abstracting provider-specific APIs. Developers can switch between providers with minimal code changes, enabling scalable and flexible TTS solutions in apps requiring natural-sounding speech synthesis. The package supports Android, iOS, Web, macOS, Windows, and Linux, making it ideal for cross-platform voice-enabled applications.

Use cases

  • Cross-platform voice assistants
  • E-learning applications with audio narration
  • Accessibility features in apps
  • Multilingual voice output
  • Automated voice responses in chatbots

Key features

  • Unified API for Google, Microsoft, and AWS TTS
  • Supports multiple languages and voices
  • Platform-agnostic implementation
  • Easy provider switching
  • Built-in error handling and retries
  • Real-time audio streaming support

Suitable for

  • Developers building multi-provider TTS apps
  • Apps needing consistent voice output across platforms
  • Projects requiring rapid prototyping of speech features
  • Teams using multiple cloud TTS services

Considerations

  • Requires API keys for each cloud provider
  • Billing applies based on usage volume
  • Network connectivity needed for cloud calls
  • Limited offline capabilities
  • Voice quality depends on selected provider and region

Original README

Original README snapshot from the linked source repository. Visit the repository for the latest content.

Cloud Text-To-Speech

Pub Version Pub Likes Pub Popularity Pub Points GitHub License GitHub Sponsor Buy Me a Coffee

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.

Feature Requests

We welcome and value your ideas and suggestions to improve this project! To submit and vote for feature requests, please visit our Feature Requests Board.

On the board, you can:

  • Submit new feature requests: Share your ideas on how we can enhance the project.
  • Vote on existing requests: Help prioritize the most popular features by voting for the ones you find most valuable.

Thank you for contributing to the development and improvement of Cloud Text-To-Speech!

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 TtsProviders.google, TtsProviders.microsoft, TtsProviders.amazon to use the single provider at a time.
    • Combine: Using TtsProviders.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: TtsProviders.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(TtsProviders.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: TtsProviders.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(TtsProviders.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 or web 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 package's, methods 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.

Categories

Dependencies

Dependency list 6 items

Source repository

Projects using this package

No data available yet.