deepAssist is an experimental Android voice assistant I developed for people who are blind or have low vision. Its voice first design aims to make everyday phone tasks possible with less screen navigation. It listens to a request, transcribes it, uses an AI model to decide which available actions to take, and speaks the result.
Türkçe özet: deepAssist, görme engelli kullanıcıların telefonu daha az ekrana bağımlı kullanabilmesi için geliştirdiğim deneysel bir Android sesli asistanıdır. Türkçe konuşmaları anlayıp arama, mesaj, cihaz denetimi ve web araştırması gibi işleri sesli etkileşimle yürütür.
- Voice input through OpenAI realtime transcription, with a file transcription fallback; spoken replies through OpenAI or Android TTS.
- Tool based actions for calls, SMS, contacts, WhatsApp, notifications, media, YouTube, timers, device controls, location, weather, exchange rates, and web search.
- Local conversation history, saved memories, and notification/message history.
- Optional Tavily search fallback. Web search also tries Exa and DuckDuckGo without a personal API key.
The assistant can carry out a request in several steps instead of matching one phrase to one fixed command. It selects from the tools available on the phone, uses a tool's result to decide the next step, and then gives a spoken answer. For example, it can look up a contact before placing a call, search the web and read a relevant page before answering, or check device context before changing a setting.
It can ask a spoken follow up when a request is ambiguous, request confirmation before calls or messages, and continue a conversation after completing an action. Saved memories and conversation history can provide context for later requests. Actions remain limited by Android permissions, installed apps, available services, and the tools implemented in this repository.
This is a prototype. Some actions depend on installed apps, Android version, granted permissions, and third party services. Review the permissions and source before installing it on a personal phone.
You need Android Studio with Android SDK 36 and JDK 17. The Gradle wrapper is included; the app supports Android 8.0 (API 26) and newer.
- Clone the repository and open its root folder in Android Studio.
- Copy
.env.exampleto.envin the repository root. Fill inDEEPSEEK_API_KEYandOPENAI_API_KEY;TAVILY_API_KEYis optional. Use your own keys and plainKEY=valuelines without quotes. The Android SDK path belongs inlocal.propertiesor your usual Android environment configuration, not in.env. - Sync Gradle, select the
appconfiguration, and run it on a device. From a terminal,./gradlew assembleDebugbuilds the APK. - Grant only the permissions needed for the features you plan to use. The app's Ayarlar screen links to Android's permission and default assistant settings. It does not accept API keys; changing a key requires editing
.env, rebuilding, and reinstalling the APK.
A build with empty keys can compile, but voice transcription and assistant replies require the OpenAI and DeepSeek keys. Keep .env on your own machine. Do not attach your personal build artifact to a public release.
| Location | Purpose |
|---|---|
app/src/main/kotlin/com/deepassist/service/ |
Foreground assistant, triggers, accessibility, and notification services |
app/src/main/kotlin/com/deepassist/llm/ |
DeepSeek client, prompts, and tool call parsing |
app/src/main/kotlin/com/deepassist/speech/ |
Speech recognition and speech output |
app/src/main/kotlin/com/deepassist/tools/ |
Device and web actions available to the assistant |
app/src/main/kotlin/com/deepassist/data/ |
Local history, memory, and app preferences |
app/src/main/AndroidManifest.xml |
Android components and requested permissions |
app/build.gradle.kts |
Android build and .env to BuildConfig mapping |
.env and local.properties are ignored by Git. The build reads .env and embeds its values in BuildConfig; the app sends them directly to the relevant APIs. An APK is not a secret store: anyone with the APK can extract embedded keys. Use restricted, revocable keys with spending limits, and rotate them if you distribute a build or suspect exposure. A backend that keeps keys server side is needed if you want to distribute an APK without exposing those keys.
API endpoint URLs in the source identify public services; the URLs themselves are not credentials. Do not put tokens in URLs, source files, screenshots, issue reports, or logs. If a key was committed previously, deleting it in a later commit does not remove it from Git history: revoke it first.
The app sends voice/text and relevant tool requests to the selected external providers. Chat history, saved memories, and captured notifications/messages are stored in app private files on the phone; they are not encrypted by this project. Android backup is disabled. Granting notification, contacts, SMS, location, and accessibility access exposes sensitive device data to the app and potentially to a tool request. See the manifest and individual tool implementations for exact behavior.
Open an issue with reproduction steps and Android version, or send a focused pull request. Before submitting, run ./gradlew assembleDebug, check git status, and confirm that no .env, local.properties, APK, or personal data is staged. There is no automated test suite yet.