[{"data":1,"prerenderedAt":22},["ShallowReactive",2],{"articolo-speech-to-text-in-flutter-convertire-la-voce-in-testo-con-speech-to-text":3,"comments-article-speech-to-text-in-flutter-convertire-la-voce-in-testo-con-speech-to-text":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},52,"Speech-to-Text in Flutter: convertire la voce in testo con speech_to_text","speech-to-text-in-flutter-convertire-la-voce-in-testo-con-speech-to-text","Guida pratica al riconoscimento vocale in Flutter con il pacchetto speech_to_text: configurazione, permessi, gestione degli stati e trascrizione in tempo reale su Android e iOS.","## Introduzione\n\nIl riconoscimento vocale (speech-to-text) permette agli utenti di interagire con le app parlando invece di digitare. È utile per barre di ricerca vocali, note dettate, funzioni di accessibilità o assistenti conversazionali. In Flutter il pacchetto [`speech_to_text`](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fspeech_to_text) sfrutta le API native di Android e iOS per offrire una trascrizione affidabile e in tempo reale.\n\nIn questo articolo vedremo come integrarlo passo dopo passo, gestendo permessi, stati e risultati parziali.\n\n## Installazione\n\nAggiungiamo la dipendenza al `pubspec.yaml`:\n\n```yaml\ndependencies:\n  speech_to_text: ^7.0.0\n  permission_handler: ^11.3.1\n```\n\n### Configurazione Android\n\nNel file `android\u002Fapp\u002Fsrc\u002Fmain\u002FAndroidManifest.xml` aggiungiamo i permessi e la query per il servizio di riconoscimento:\n\n```xml\n\u003Cuses-permission android:name=\"android.permission.RECORD_AUDIO\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.INTERNET\" \u002F>\n\n\u003Cqueries>\n    \u003Cintent>\n        \u003Caction android:name=\"android.speech.RecognitionService\" \u002F>\n    \u003C\u002Fintent>\n\u003C\u002Fqueries>\n```\n\nAssicurati inoltre di avere `minSdkVersion` almeno a 21.\n\n### Configurazione iOS\n\nNel file `ios\u002FRunner\u002FInfo.plist` aggiungiamo le descrizioni per l'uso del microfono e del riconoscimento vocale:\n\n```xml\n\u003Ckey>NSMicrophoneUsageDescription\u003C\u002Fkey>\n\u003Cstring>L'app usa il microfono per il riconoscimento vocale\u003C\u002Fstring>\n\u003Ckey>NSSpeechRecognitionUsageDescription\u003C\u002Fkey>\n\u003Cstring>L'app converte la tua voce in testo\u003C\u002Fstring>\n```\n\n## Inizializzazione\n\nIl primo passo è creare un'istanza di `SpeechToText` e inizializzarla. Il metodo `initialize` restituisce `true` se il riconoscimento è disponibile sul dispositivo:\n\n```dart\nimport 'package:speech_to_text\u002Fspeech_to_text.dart';\n\nclass SpeechService {\n  final SpeechToText _speech = SpeechToText();\n  bool _available = false;\n\n  Future\u003Cbool> init() async {\n    _available = await _speech.initialize(\n      onStatus: (status) => print('Stato: $status'),\n      onError: (error) => print('Errore: ${error.errorMsg}'),\n    );\n    return _available;\n  }\n}\n```\n\nGli stati principali passati a `onStatus` sono `listening`, `notListening` e `done`. Sono utili per aggiornare l'interfaccia (ad esempio mostrando un'animazione mentre l'app ascolta).\n\n## Avviare l'ascolto\n\nUna volta inizializzato il servizio, avviamo l'ascolto con `listen`. Il callback `onResult` riceve un oggetto `SpeechRecognitionResult` con la trascrizione:\n\n```dart\nFuture\u003Cvoid> startListening(void Function(String) onText) async {\n  if (!_speech.isAvailable) return;\n\n  await _speech.listen(\n    onResult: (result) {\n      onText(result.recognizedWords);\n    },\n    localeId: 'it_IT',\n    listenFor: const Duration(seconds: 30),\n    pauseFor: const Duration(seconds: 3),\n    listenOptions: SpeechListenOptions(\n      partialResults: true,\n      cancelOnError: true,\n    ),\n  );\n}\n\nvoid stopListening() => _speech.stop();\n```\n\nAlcuni parametri chiave:\n\n- **`localeId`**: la lingua da riconoscere. Usa `_speech.locales()` per ottenere l'elenco delle lingue supportate dal dispositivo.\n- **`listenFor`**: durata massima dell'ascolto.\n- **`pauseFor`**: tempo di silenzio dopo cui l'ascolto si interrompe automaticamente.\n- **`partialResults`**: se `true`, `onResult` viene invocato man mano che l'utente parla, permettendo la trascrizione in tempo reale.\n\nIl campo `result.finalResult` indica se la trascrizione è definitiva o ancora parziale.\n\n## Esempio completo di widget\n\nEcco un widget che integra il riconoscimento vocale con gestione dei permessi tramite `permission_handler`:\n\n```dart\nimport 'package:flutter\u002Fmaterial.dart';\nimport 'package:permission_handler\u002Fpermission_handler.dart';\nimport 'package:speech_to_text\u002Fspeech_to_text.dart';\n\nclass VoiceInputScreen extends StatefulWidget {\n  const VoiceInputScreen({super.key});\n\n  @override\n  State\u003CVoiceInputScreen> createState() => _VoiceInputScreenState();\n}\n\nclass _VoiceInputScreenState extends State\u003CVoiceInputScreen> {\n  final SpeechToText _speech = SpeechToText();\n  bool _isListening = false;\n  String _text = 'Premi il microfono e parla';\n\n  Future\u003Cvoid> _toggleListening() async {\n    if (_isListening) {\n      await _speech.stop();\n      setState(() => _isListening = false);\n      return;\n    }\n\n    final status = await Permission.microphone.request();\n    if (!status.isGranted) return;\n\n    final available = await _speech.initialize(\n      onStatus: (s) {\n        if (s == 'done' || s == 'notListening') {\n          setState(() => _isListening = false);\n        }\n      },\n      onError: (e) => setState(() => _isListening = false),\n    );\n\n    if (available) {\n      setState(() => _isListening = true);\n      await _speech.listen(\n        localeId: 'it_IT',\n        onResult: (r) => setState(() => _text = r.recognizedWords),\n        listenOptions: SpeechListenOptions(partialResults: true),\n      );\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(title: const Text('Speech to Text')),\n      body: Padding(\n        padding: const EdgeInsets.all(24),\n        child: Center(\n          child: Text(_text, style: const TextStyle(fontSize: 22)),\n        ),\n      ),\n      floatingActionButton: FloatingActionButton(\n        onPressed: _toggleListening,\n        backgroundColor: _isListening ? Colors.red : null,\n        child: Icon(_isListening ? Icons.mic : Icons.mic_none),\n      ),\n    );\n  }\n}\n```\n\n## Buone pratiche\n\n- **Verifica sempre la disponibilità**: non tutti i dispositivi (specialmente emulatori) supportano il riconoscimento vocale. Controlla il valore di ritorno di `initialize`.\n- **Gestisci i permessi in modo esplicito**: chiedi il permesso microfono prima di avviare l'ascolto e gestisci il caso in cui l'utente lo neghi.\n- **Fornisci feedback visivo**: mostra all'utente quando l'app sta ascoltando, ad esempio con un'icona o un'animazione.\n- **Attenzione al consumo**: interrompi l'ascolto quando non serve per risparmiare batteria e rispettare la privacy.\n- **Considera l'offline**: su Android alcune lingue richiedono la connessione, mentre iOS può usare il riconoscimento on-device. Non dare per scontata la disponibilità offline.\n\n## Conclusione\n\nCon `speech_to_text` è possibile integrare rapidamente il riconoscimento vocale in un'app Flutter, offrendo un'esperienza più naturale e accessibile. Combinandolo con `permission_handler` per la gestione dei permessi e con un feedback visivo curato, si ottiene una funzionalità robusta e cross-platform. Un ottimo complemento è il text-to-speech, per creare interfacce conversazionali complete.","https:\u002F\u002Fflutter.it\u002Fstorage\u002Farticles\u002F7fd0004b-9a22-4059-9152-93b0d8b76885.jpg",null,"published","2026-07-26T04:00:41+00:00","Speech-to-Text in Flutter con speech_to_text","Guida pratica al riconoscimento vocale in Flutter con speech_to_text: permessi, configurazione Android\u002FiOS e trascrizione in tempo reale.",{"id":16,"name":17,"slug":18},1,"Guide","guide",{"id":16,"name":20},"Flutter Bot",[],1785219595833]