Aplicacion Android nativa para MashIA: chat con IA, voz/STT, TTS, historial local, biblioteca de conversaciones, Google/Firebase Auth opcional y backend local para llamadas a OpenAI.
El asistente principal sigue siendo un chat de uso general. La capa social/deliberativa es una direccion futura del producto y debe vivir como una pestana o modulo separado de debate, no como reemplazo de la pantalla principal.
Estado verificado: ./gradlew.bat :app:assembleDebug compila correctamente en Windows con JDK 17+.
- Android Studio (Koala o superior), JDK 17
- Gradle Wrapper se generará al abrir el proyecto en Android Studio (o ejecutando
gradle wrapper).
app/: modulo Android (Kotlin + AndroidX + JNI para Whisper)server/: backend Express opcional para no exponer llaves en Androidapp/src/main/res/values/strings.xml: valores no secretos de app/modelos/base URLsbuild.gradle.ktsysettings.gradle.kts: configuracion de Gradle
- Abre la carpeta del repo en Android Studio.
- Deja que sincronice Gradle y descargue dependencias.
- Ejecuta la app en un emulador o dispositivo.
O desde terminal:
./gradlew.bat :app:assembleDebug
Para que el botón "Continue with Google" funcione con Firebase Auth:
- Crea un proyecto en Firebase Console y añade una app Android con el package
com.rophiroth.mashia. - Ejecuta
./gradlew signingReporty copia elSHA1de la variantedebug(yreleasesi corresponde) en la configuración de la app en Firebase. - Descarga el
google-services.jsondesde Firebase (Ajustes del proyecto > General > Tus apps > Android) y colócalo enapp/google-services.json. - En Firebase Console, habilita el proveedor "Google" en Authentication > Sign-in method.
- Sincroniza Gradle y vuelve a ejecutar la app.
Notas:
- El repo ya incluye dependencias de
play-services-authyfirebase-auth-ktx. - El plugin
com.google.gms.google-servicesse aplica automáticamente si existeapp/google-services.json. - Si corres sin
google-services.json, el flujo intentará usar solo Google Sign-In, pero verás error 10 si no existe un OAuth Client configurado en Google Cloud para el paquete+SHA1. Lo recomendado es usar Firebase como arriba.
Para pruebas locales rapidas, la app puede leer GROQ_API_KEY u OPENAI_API_KEY desde variables de entorno o local.properties y llamar directo a los proveedores. Eso sirve para desarrollo, pero no es seguro para produccion porque las llaves terminan dentro del APK.
Para pruebas mas serias o distribucion, usa el backend local incluido en server/ y deja las llaves solo en el servidor.
Backend (Node + Express)
- Requisitos: Node 18+
- Pasos:
cd servernpm install- Exporta tu key en el entorno:
setx OPENAI_API_KEY "sk-..."(Windows PowerShell:$env:OPENAI_API_KEY="sk-...") npm start(levanta enhttp://localhost:3000)
App Android
- Edita
app/src/main/res/values/strings.xmly pon tu IP de PC enbackend_url(ej.http://192.168.1.82:3000). Si queda vacio, la app intenta llamada directa usando las llaves locales. - Construye/instala:
./gradlew.bat :app:installDebug - Al enviar un mensaje en Chat, la app hará POST a
/api/chaty mostrará la respuesta.
Notas
- El backend usa Axios contra Chat Completions y el modelo
gpt-4o-minipor defecto. - Puedes desplegar el backend en Firebase Functions/Cloud Run cuando quieras; la app no cambia, solo el
backend_url.
La idea de MashIA no es convertir toda la app en una red social ni reemplazar el chat principal. La evolucion esperada es agregar una pestana de debate donde muchas personas puedan opinar libremente sobre un tema y MashIA actue como capa de ordenamiento.
En esa pestana, MashIA deberia:
- filtrar spam, ruido y aportes sin contenido;
- avisar cuando una idea es debil, irrelevante o esta mal formulada;
- resumir fielmente lo que una persona quiso decir;
- catalogar posturas por tema, intencion, argumento y fondo;
- detectar cuando dos opiniones suenan distintas pero expresan el mismo punto de fondo;
- conectar a personas de la plataforma que estan defendiendo ideas equivalentes con palabras distintas;
- preparar la base tecnica para una deliberacion masiva tipo Democracia 2.0 / Espiritocracia.
Ese modulo requiere una arquitectura propia: perfiles/posturas, moderacion, clasificacion semantica, deduplicacion de argumentos, busqueda por similitud y reglas claras de privacidad. No esta pensado como pantalla inicial de MashIA.
Este repo incluye un andamiaje (scaffold) para integrar whisper.cpp de forma nativa en Android, sin romper la build cuando no están las fuentes del proyecto de terceros.
Pasos para activarlo:
-
Coloca las fuentes de whisper.cpp en:
app/src/main/cpp/third_party/whisper.cppPuedes copiar los archivos o agregarlo como submódulo. Se requieren al menos
whisper.cpp,ggml.cy headers relacionados. -
Añade el modelo base a assets:
app/src/main/assets/models/ggml-base.binDescarga de los enlaces oficiales de whisper.cpp (o mirrors en Hugging Face).
-
Habilita la opción de CMake para compilar con whisper.cpp:
-
En Android Studio: External Native Build > CMake arguments:
-DUSE_WHISPERCPP=ON -
O en
gradle.propertiesagrega:android.defaults.cmake.arguments=-DUSE_WHISPERCPP=ON
-
-
Compila en un dispositivo
arm64-v8a.
Puente JNI expuesto (inicialmente en modo stub hasta enlazar whisper.cpp):
nativeInitModel(modelPath: String, translate: Boolean, threads: Int): BooleannativeTranscribeShort(pcm: ShortArray, sampleRate: Int): String
Wrapper Kotlin: org.psyhackers.mashia.stt.WhisperEngine.
Cuando las fuentes estén presentes y USE_WHISPERCPP=ON, completa el wiring en app/src/main/cpp/WhisperBridge.cpp para cargar el modelo y ejecutar inferencia.
Con GitHub CLI (gh) autenticado:
gh repo create rophiroth/MashIA --source . --public --push
O crea el repo en GitHub y luego:
git remote add origin https://github.com/rophiroth/MashIA.git
git push -u origin main