[{"data":1,"prerenderedAt":22},["ShallowReactive",2],{"articolo-assistenti-vocali-e-text-to-speech-in-flutter-con-flutter-tts":3,"comments-article-assistenti-vocali-e-text-to-speech-in-flutter-con-flutter-tts":21},{"id":4,"title":5,"slug":6,"excerpt":7,"body":8,"cover_image":9,"video_url":10,"status":11,"published_at":12,"meta_title":13,"meta_description":14,"category":15,"author":19},51,"Assistenti vocali e text-to-speech in Flutter con flutter_tts","assistenti-vocali-e-text-to-speech-in-flutter-con-flutter-tts","Impara a integrare la sintesi vocale nelle tue app Flutter con il pacchetto flutter_tts: configurazione, gestione delle lingue, controllo di velocità e tono, e best practice per un'esperienza accessibile.","## Perché la sintesi vocale conta\n\nLa sintesi vocale (Text-To-Speech, o TTS) trasforma il testo in parlato ed è una funzionalità sempre più richiesta: dalle app di accessibilità agli assistenti vocali, dai lettori di articoli alle app educative. In Flutter, il pacchetto [`flutter_tts`](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fflutter_tts) offre un'interfaccia semplice e cross-platform (Android, iOS, Web, macOS, Windows) sfruttando i motori TTS nativi di ciascuna piattaforma.\n\nIn questo articolo vediamo come integrarlo, configurarlo e gestire i casi reali che incontrerai in produzione.\n\n## Installazione\n\nAggiungi la dipendenza al tuo `pubspec.yaml`:\n\n```yaml\ndependencies:\n  flutter_tts: ^4.2.0\n```\n\nSu **iOS**, apri `ios\u002FRunner\u002FInfo.plist` e assicurati che l'app abbia accesso ai servizi vocali. Su versioni recenti non serve un permesso esplicito per il TTS, ma è buona norma testare su dispositivo fisico perché il simulatore ha voci limitate.\n\nSu **Android** non è richiesto alcun permesso particolare, ma il motore TTS di Google deve essere installato (lo è di default sulla maggior parte dei dispositivi).\n\n## Primo utilizzo\n\nCreiamo una piccola classe wrapper che incapsula la logica TTS, così da tenerla separata dalla UI:\n\n```dart\nimport 'package:flutter_tts\u002Fflutter_tts.dart';\n\nclass TtsService {\n  final FlutterTts _tts = FlutterTts();\n\n  Future\u003Cvoid> init() async {\n    await _tts.setLanguage('it-IT');\n    await _tts.setSpeechRate(0.5); \u002F\u002F 0.0 - 1.0\n    await _tts.setVolume(1.0);     \u002F\u002F 0.0 - 1.0\n    await _tts.setPitch(1.0);      \u002F\u002F 0.5 - 2.0\n  }\n\n  Future\u003Cvoid> speak(String text) async {\n    if (text.trim().isEmpty) return;\n    await _tts.speak(text);\n  }\n\n  Future\u003Cvoid> stop() async {\n    await _tts.stop();\n  }\n\n  Future\u003Cvoid> pause() async {\n    await _tts.pause();\n  }\n}\n```\n\n> **Nota sulla `speechRate`**: la scala non è lineare tra le piattaforme. Su Android un valore di `1.0` corrisponde alla velocità normale, mentre su iOS lo stesso valore risulta molto più veloce. Il pacchetto normalizza in parte questo comportamento, ma è consigliabile testare su entrambe.\n\n## Gestire gli stati con i callback\n\nUn errore comune è non ascoltare lo stato del motore TTS. Sapere quando il parlato inizia, finisce o viene interrotto è fondamentale per aggiornare la UI (ad esempio evidenziare un pulsante \"stop\"):\n\n```dart\nenum TtsState { playing, stopped, paused, continued }\n\nclass TtsService {\n  final FlutterTts _tts = FlutterTts();\n  TtsState state = TtsState.stopped;\n\n  void setupHandlers({VoidCallback? onStateChange}) {\n    _tts.setStartHandler(() {\n      state = TtsState.playing;\n      onStateChange?.call();\n    });\n    _tts.setCompletionHandler(() {\n      state = TtsState.stopped;\n      onStateChange?.call();\n    });\n    _tts.setCancelHandler(() {\n      state = TtsState.stopped;\n      onStateChange?.call();\n    });\n    _tts.setPauseHandler(() {\n      state = TtsState.paused;\n      onStateChange?.call();\n    });\n    _tts.setErrorHandler((msg) {\n      state = TtsState.stopped;\n      debugPrint('Errore TTS: $msg');\n      onStateChange?.call();\n    });\n  }\n}\n```\n\n## Verificare la disponibilità della lingua\n\nNon tutte le voci sono installate su ogni dispositivo. Prima di impostare una lingua è buona prassi verificarne la disponibilità:\n\n```dart\nFuture\u003Cbool> isLanguageAvailable(String lang) async {\n  final available = await _tts.isLanguageAvailable(lang);\n  return available == true;\n}\n\nFuture\u003CList\u003CString>> getLanguages() async {\n  final langs = await _tts.getLanguages;\n  return List\u003CString>.from(langs);\n}\n```\n\nSe la lingua desiderata non è disponibile, puoi proporre all'utente un fallback o, su Android, aprire le impostazioni del motore TTS.\n\n## Evidenziare le parole durante la lettura\n\nUna funzionalità potente per app di lettura è l'evidenziazione progressiva del testo. `flutter_tts` fornisce un handler dedicato (supportato su Android e iOS 7+):\n\n```dart\n_tts.setProgressHandler((String text, int start, int end, String word) {\n  \u002F\u002F start ed end sono gli indici del carattere nel testo originale\n  \u002F\u002F aggiorna lo stato per evidenziare la parola corrente\n  debugPrint('Sto leggendo: \"$word\" ($start-$end)');\n});\n```\n\nCombinando questi indici con un `RichText` puoi colorare la porzione di testo in fase di lettura, creando un effetto karaoke molto apprezzato nelle app didattiche.\n\n## Un esempio di widget completo\n\n```dart\nclass ReaderScreen extends StatefulWidget {\n  const ReaderScreen({super.key});\n  @override\n  State\u003CReaderScreen> createState() => _ReaderScreenState();\n}\n\nclass _ReaderScreenState extends State\u003CReaderScreen> {\n  final _tts = FlutterTts();\n  bool _isPlaying = false;\n  final _testo = 'Benvenuto nella guida a flutter_tts, la sintesi vocale in Flutter.';\n\n  @override\n  void initState() {\n    super.initState();\n    _tts.setLanguage('it-IT');\n    _tts.setSpeechRate(0.5);\n    _tts.setCompletionHandler(() => setState(() => _isPlaying = false));\n  }\n\n  Future\u003Cvoid> _toggle() async {\n    if (_isPlaying) {\n      await _tts.stop();\n      setState(() => _isPlaying = false);\n    } else {\n      setState(() => _isPlaying = true);\n      await _tts.speak(_testo);\n    }\n  }\n\n  @override\n  void dispose() {\n    _tts.stop();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(title: const Text('Lettore vocale')),\n      body: Padding(\n        padding: const EdgeInsets.all(16),\n        child: Column(\n          children: [\n            Text(_testo, style: Theme.of(context).textTheme.bodyLarge),\n            const SizedBox(height: 24),\n            ElevatedButton.icon(\n              onPressed: _toggle,\n              icon: Icon(_isPlaying ? Icons.stop : Icons.play_arrow),\n              label: Text(_isPlaying ? 'Ferma' : 'Leggi'),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n```\n\n## Best practice\n\n- **Chiama sempre `stop()` nel `dispose`**: se l'utente esce dalla schermata mentre l'app parla, evitare che la voce continui in background migliora l'esperienza.\n- **Gestisci la sessione audio su iOS**: usa `setSharedInstance(true)` e configura le categorie audio con `setIosAudioCategory` se vuoi che il parlato conviva con altre app musicali o funzioni in modalità silenziosa.\n- **Testa su dispositivo reale**: i simulatori hanno un set ridotto di voci e alcune funzionalità (come il progress handler) possono comportarsi diversamente.\n- **Fai attenzione a `await speak`**: il completamento del `Future` restituito da `speak` dipende dalla configurazione della piattaforma. Per un controllo affidabile usa `awaitSpeakCompletion(true)` su Android.\n\n```dart\nawait _tts.awaitSpeakCompletion(true);\nawait _tts.speak('Questo Future si completa a fine lettura');\nprint('Lettura terminata');\n```\n\n## Conclusioni\n\nCon `flutter_tts` bastano poche righe per dare voce alle tue app, ma la vera differenza la fanno i dettagli: gestione degli stati, verifica delle lingue, configurazione della sessione audio e evidenziazione progressiva. Integrare la sintesi vocale non è solo una feature accattivante, ma un passo importante verso app più accessibili e inclusive.","https:\u002F\u002Fflutter.it\u002Fstorage\u002Farticles\u002F5d093cbb-43f7-4701-a24b-4b5ffa569a23.jpg",null,"published","2026-07-25T04:00:48+00:00","Text-to-speech in Flutter con flutter_tts: guida","Guida pratica alla sintesi vocale in Flutter con flutter_tts: configurazione, lingue, controllo di velocità e tono, evidenziazione parole e best practice.",{"id":16,"name":17,"slug":18},1,"Guide","guide",{"id":16,"name":20},"Flutter Bot",[],1785219596493]