Instrucciones originales (y desactualizadas) para esta aplicación. Mi implementación en este artículo.
Asegúrese de que utilice la Adaptación automática de voz al crear el agente.
Habilite la «API de Dialogflow» en la consola de GCP. Cree una cuenta de servicio con las credenciales y otorgue el rol de administrador de la API de Dialogflow.
Agregue la nueva clave JSON a la cuenta de servicio que acaba de crear y guárdela localmente en su computadora.
Instala Flutter y Android Studio. Ejecute «flutter create voicebot».
Configure las versiones de SDK para el paquete sound_stream en android/app/build.gradle: mínimo 21 y objetivo 30.
Da permiso a Internet y al micrófono en app/src/main/AndroidManifest.xml.
Instale sound_stream, rxdart, dialogflow_grpc
Mueva el nuevo archivo de clave JSON del último paso a una carpeta de activos. Cuidado con la llave.
Conecte su teléfono físico usando scrcpy y ejecute la aplicación
En un nivel alto, el árbol de widgets es MyHomePage => chat (con estado) => mensaje (sin estado). STT es voz a texto.
Widget de chat
Presenta la interfaz de usuario del chat y maneja Dialogflow. La interfaz de usuario tiene
ListView para mostrar todas las burbujas de mensajes.
Campo de texto para escribir.
IconButton para enviar un mensaje. Cuando se presiona, necesitamos enviar el texto.
IconButton para usar el micrófono. Cuando se presiona, necesitamos detener o manejar la transmisión de audio.
Necesitamos algunos estados:
final List<ChatMessage> _messages = <ChatMessage>[]; final TextEditingController _textController = TextEditingController(); late DialogflowGrpcV2Beta1 dialogflow; bool _isRecording = false; // if mic is recording RecorderStream _recorder = RecorderStream(); StreamSubscription? _recorderStatus; StreamSubscription<List<int>>? _audioStreamSubscription; BehaviorSubject<List<int>>? _audioStream;
conseguir cliente de flujo de diálogo a través de la cuenta de servicio en initState(). Esto se hace usando la credencial json que descargamos API de Dialogflow.
A detenerStreamdetenemos RecorderStream, cancelamos StreamSubscription y cerramos _audioStream(BehaviorSubject)
A handleStreampuede decidir las frases de diálogo (específicas de la aplicación), la configuración de audio (hercios de muestra, codificación) y luego obtener la intención escuchando dialogflow.streamingDetectIntent() dada la transmisión de audio.
A enviarTextorecibe una respuesta de dialogflow.detectIntent() dado el texto y actualiza la lista de burbujas de mensajes en la interfaz de usuario.
Widget de mensajes
Cada mensaje tiene dos partes horizontales: CircleAvatar y el texto del mensaje. Opcionalmente, el texto del mensaje puede ser una columna para apilar las iniciales del remitente encima del texto. La única diferencia entre el mensaje del bot y su mensaje es que el bot tiene CrossAxisAlignment.start para alinearse a la izquierda mientras que el suyo lo tiene como CrossAxisAlignment.end para alinearse a la derecha
Añade intenciones y respuestas. También puede usar Knowledge Connector.
Si le gusta este tutorial, también puede encontrar útiles los 3 niveles de pruebas de aleteo. Son parte de mi serie Become Flutter Comfort en 23 días.