Instructivos

Crea apps inteligentes para Android: inferencia integrada en el dispositivo

Lectura de 6 min
Ver el perfil de Caren Chang
Caren Chang Ingeniero de Relaciones con Desarrolladores

Te damos la bienvenida a la serie de entradas de blog "Crea apps para Android inteligentes", en la que tomamos una app básica para Android y la transformamos en una experiencia personalizada, inteligenteagéntica. En nuestra publicación anterior, presentamos Jetpacker, la app de demostración que usaremos a lo largo de esta serie. 

En esta entrada de blog, compartiremos cómo puedes usar Gemini Nano a través de la API de Prompt de ML Kit para compilar funciones inteligentes en el dispositivo.

La creación de funciones inteligentes integradas en el dispositivo se refiere a la capacidad de procesar instrucciones y datos directamente en un dispositivo sin enviar datos a un servidor. Esto ofrece algunas ventajas: 

  • Los datos del usuario se pueden procesar localmente en el dispositivo, lo que preserva la privacidad del usuario.
  • La funcionalidad del modelo es confiable incluso con una conexión a Internet irregular o sin conexión.
  • Sin costos adicionales de inferencia en la nube, ya que todo se ejecuta en el hardware del usuario

Teniendo en cuenta los beneficios de la tecnología integrada en el dispositivo, identificamos tres funciones para agregar en Jetpacker que pueden mejorar la experiencia del usuario: resumir itinerarios de viajes, administrar gastos y capturar notas de voz.

Screenshot 2026-07-02 at 12.57.08 PM.png
Funciones integradas en el dispositivo en Jetpacker: Resúmenes de itinerarios de viajes, administración de gastos y notas de voz

Resúmenes personalizados de alta calidad de textos cortos

La pantalla de itinerario les brinda a los usuarios una descripción general rápida de todas las actividades de un viaje determinado. Dado que esta pantalla contiene mucha información, puede resultar abrumadora rápidamente. Para ayudar a los usuarios a prepararse sin sentirse abrumados, podemos agregar una sección "Prepárate para tu viaje" en la parte superior.

Screenshot_20260702_111934.png
El viaje romántico a París se resume como una aventura parisina clásica que combina arte, lugares de interés y comida deliciosa. También se agregaron una sugerencia y algunas frases útiles.

Si ingresamos un itinerario de viaje y le pedimos a un LLM que lo resuma, podemos generar un resumen rápido del viaje junto con sugerencias para empacar y frases locales útiles. Este es un excelente caso de uso para un modelo integrado en el dispositivo por varios motivos: 

  • Rendimiento y calidad: Tanto el texto de entrada como el de salida son relativamente cortos. Con eso, podemos esperar que el rendimiento y la calidad de una solución integrada en el dispositivo estén a la par de los modelos en la nube más potentes.
  • Escalabilidad: Trasladar la inferencia integrado en el dispositivo nos permite escalar esta función de unos pocos usuarios a millones sin preocuparnos por administrar los crecientes costos de inferencia en la nube.
  • Baja latencia y confiabilidad: La inferencia integrado en el dispositivo garantiza una baja latencia, lo que proporciona una experiencia confiable incluso cuando los usuarios no tienen conexión.

Para crear con la tecnología integrada en el dispositivo, usamos Gemini Nano, el modelo más eficiente de Google, optimizado para dispositivos móviles. Gemini Nano se presentó por primera vez hace unos años y, actualmente, se ejecuta en más de 140 millones de dispositivos. La versión más reciente del modelo, Gemini Nano 4, se basa en la arquitectura del modelo Gemma 4 lanzado recientemente y se optimizó aún más para lograr la máxima eficiencia en cuanto a batería y rendimiento. 

Con la API de Prompt de ML Kit, podemos aprovechar las nuevas capacidades del modelo de Gemini Nano 4 para crear prototipos de nuestras funciones integradas en el dispositivo. Crearemos una instrucción que incluya el itinerario de un viaje y le pediremos al modelo que genere un resumen junto con sugerencias para la preparación.

Por lo general, encontrar la instrucción óptima requiere cierta iteración, y la app de AICore es perfecta para este paso del proceso. Después de habilitar la opción de versión preliminar para desarrolladores de AICore, podemos descargar modelos de versión preliminar, como Gemini Nano 4, para probar instrucciones y ver los resultados esperados del modelo. Con algunas iteraciones en la instrucción, pudimos mejorar la velocidad de la respuesta de 13 segundos a menos de 2 segundos. Consulta la implementación final del código y la instrucción aquí.

[ASSET HERE - FILE TOO LARGE ATM]

Procesamiento local para la entrada sensible del usuario

A continuación, para ayudar a los usuarios a disfrutar aún más de su viaje, crearemos un administrador de gastos simple que elimine el trabajo manual de ordenar recibos y calcular presupuestos. 

Dado que los recibos pueden contener información sensible, como el número de tarjeta de crédito y las direcciones, este es otro caso de uso excelente para una solución integrada en el dispositivo. Con la tecnología integrada en el dispositivo, los usuarios pueden tener la certeza de que la información privada se procesará de forma local en el dispositivo sin que se envíen sus datos a la nube.

Además, Gemini Nano 4 mejoró las capacidades del modelo para la multimodalidad, en especial para las tareas de comprensión de imágenes, como el OCR y la extracción de datos visuales, lo que lo convierte en una excelente solución para tareas como la extracción de información de recibos.

En este caso de uso, la instrucción analizará una imagen del recibo y generará información como un título, el importe gastado y la categoría del gasto. Para garantizar que el modelo genere la información en el formato preferido, podemos usar la API de Structured Output de ML Kit para generar sin problemas un objeto de datos de Kotlin que definamos.

// implementation("com.google.mlkit:genai-prompt:1.0.0-beta3")
// ksp("com.google.mlkit:genai-schema-compiler:1.0.0-alpha1")

@Generable("Information extracted from an expense receipt")
data class ParsedReceipt(
  @Guide("Generated title for the expense less than 6 words. Based on restaurant or activity name.")
  val title: String,
  @Guide("Total amount of the expense. Look for values at the bottom and words like total or balance due.")
  val amount: Double,
  @Guide("Type of expense", enumValues = ["travel", "food", "shopping", "entertainment", "other"])
  val category: String,
)

val prompt = "Determine if the image is a receipt or expense. 
    If it is NOT a receipt or expense, output the text 'NOT_A_RECEIPT'.
    Otherwise, parse the receipt information."

val request = generateContentRequest(ImagePart(bitmap), TextPart(prompt)) {}
val requestWithStructuredOutput = generateTypedContentRequest(request, ParsedReceipt::class)

// Define the configuration for Gemini Nano 4 E4B preview model  
// When selecting models, you can specify which performance charactertists are most important
//  for your use case. Use ModelPreference.FULL when you want to prioritize reasoning power over speed. 
//  Use ModelPreference.FAST when complex logic is not required and latency is a priority.
val previewFullConfig = generationConfig {
    modelConfig = modelConfig {
        releaseStage = ModelReleaseStage.PREVIEW
        preference = ModelPreference.FULL
    }
}

val geminiNano4BPreviewModel = Generation.getClient(previewFullConfig)
val response = geminiNano4BPreviewModel.generateContent(requestWithStructuredOutput)
val parsedReceipt: ParsedReceipt? = response.candidates.firstOrNull()?.response

Entrada multimodal

Por último, para ayudar a los usuarios a grabar notas de audio durante el viaje, crearemos una función de notas de voz completamente integrada en el dispositivo. Con la API de Speech Recognition de ML Kit, permitiremos que los usuarios graben notas de voz cortas que se transcriban automáticamente a texto. Con el texto transcrito, usaremos la API de Prompt de ML Kit para identificar qué actividad del viaje está asociada con la nota de voz grabada, lo que permitirá a los usuarios recapitular fácilmente su viaje mientras se desplazan por el itinerario. 

Screenshot_20260702_115529.png
El itinerario de vacaciones en Roma muestra extractos de notas de voz.

La API de ML Kit GenAI Speech Recognition te permite transcribir contenido de audio a texto completamente integrado en el dispositivo con dos modos distintos.El modo básico usa un modelo tradicional de reconocimiento de voz integrado en el dispositivo y está disponible en la mayoría de los dispositivos Android con el nivel de API 31 y versiones posteriores. El modo avanzado usa Gemini Nano para ofrecer una cobertura de idiomas más amplia y una mejor calidad, y actualmente es compatible con dispositivos Pixel 10.

Para nuestra función, combinamos la API de Speech Recognition con la API de GenAI Prompt de ML Kit:

// implementation("com.google.mlkit:genai-prompt:1.0.0-beta3")
// implementation("com.google.mlkit:genai-speech-recognition:1.0.0-alpha1")

val tripEvents = ... 

// Set up speech recognition
val speechRecognizerOptions =
    speechRecognizerOptions {
        locale = Locale.US
        preferredMode = SpeechRecognizerOptions.Mode.MODE_ADVANCED
    }
val speechRecognizer: SpeechRecognizer = SpeechRecognition.getClient(speechRecognizerOptions)

suspend fun transcribeVoiceNote(recognizer: SpeechRecognizer) {
    // Display partial text as the user is recording audio
    var partialTextResponse = ""

    // Display the full text once user is finished recording audio
    var transcription = ""

    val request: SpeechRecognizerRequest
        = speechRecognizerRequest { audioSource = AudioSource.fromMic() }
    recognizer.startRecognition(request).collect { response ->
        when (response) {
            is SpeechRecognizerResponse.PartialTextResponse -> {
                partialTextResponse = response.text
            }
            is SpeechRecognizerResponse.FinalTextResponse -> {
                transcription = response.text
                processAndCategorizeVoiceNote(transcription, tripEvents)
            }
        }
    }
}

fun processAndCategorizeVoiceNote(transcribedVoiceNote: String, events: List<Event>) {
    val prompt = "Given the voice note $transcribedVoiceNote
     and the following events for this trip: $events, rewrite this transcription
     to remove filler words. Then, identify which events from the
     list this rewritten transcription matches to."

     // Utilize ML Kit's Prompt API to process voice note and tag it with the relevant trip activities
     Generation.getClient().generateContent(prompt)
}

Conclusión

Con las APIs de IA generativa de ML Kit, pudimos aprovechar Gemini Nano para desarrollar funciones inteligentes completamente integradas en el dispositivo para la app de JetPacker y brindar una experiencia del usuario mejorada sin costos adicionales en la nube.

Consulta el código fuente completo de Jetpacker en GitHub y mira el video Build Intelligent Android apps with Google’s AI para obtener más información sobre cómo integrar funciones inteligentes directamente en tu app con modelos integrados en el dispositivo, razonamiento potenciado por la nube y los frameworks de agentes más recientes.

Más información

Consulta las otras partes de esta serie de entradas de blog:

Parte 1: Introducción a la app y descripción general.

Parte 2 (esta publicación): Inteligencia integrada en el dispositivo. Profundiza en las APIs de IA generativa de ML Kit y Gemini Nano para crear funciones que prioricen la privacidad, como el resumen de itinerarios, el análisis de recibos y el procesamiento de audio local.

Parte 3: Razonamiento híbrido y en la nube Explora cómo usar Firebase AI Logic para fundamentar las respuestas de LLM en datos del mundo real, como Google Maps y el contexto web.

Parte 4: Integración del sistema. Integración con el sistema de inteligencia de Android a través de AppFunctions

Parte 5 (próximamente): Flujos de trabajo de agentes integrados en la app Extiende la app con un asistente de reservas de extremo a extremo potenciado por A2UI y el ADK.

¿Te interesa obtener más información sobre el desarrollo para Android? Sigue a Android Developers en YouTubeLinkedIn.

Todos los fragmentos de código de esta entrada de blog incluyen el siguiente aviso sobre derechos de autor:

Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0
Escrito por:
Continuar leyendo