Skip to main content

Speech-to-text for Flet apps via OS-native recognition (Android/iOS)

Project description

flet-stt

Speech-to-text for Flet apps via OS-native recognition (Android/iOS).

Install

pip install flet-stt

App pyproject.toml setup

Three things are required in your app's pyproject.toml for APK builds:

[project]
dependencies = ["flet>=0.82.0", "flet-stt"]

# 1. microphone permission
[tool.flet.android.permission]
"android.permission.RECORD_AUDIO" = true

# 2. prevent source shadowing in APK
[tool.flet.app]
exclude = ["flet_stt"]

# 3. extension discovery
[tool.flet.dev_packages]
flet-stt = "flet_stt"

All three are needed. Missing any one causes silent failures or build errors.

Quick start

import flet as ft
from flet_stt import FletStt, SttResult

def main(page: ft.Page):
    stt = FletStt()  # do NOT add to page.overlay or page.controls

    def on_result(e):
        r = SttResult(e)
        if r.final:
            print(f"Recognized: {r.text} ({r.confidence:.0%})")

    stt.on_result = on_result

    async def start(e):
        await stt.initialize()
        await stt.listen(listen_mode="dictation")

    page.add(ft.Button(content="Listen", on_click=start))

ft.run(main)

More examples in examples/.

Common pitfalls

1. Do not add FletStt to page.overlay or page.controls

FletStt is a service, not a visual control. It registers itself automatically. Adding it to page.overlay, page.controls, or page.add() causes a red crash screen on Android with no useful error message.

# WRONG - causes crash
stt = FletStt()
page.overlay.append(stt)

# CORRECT - just instantiate
stt = FletStt()

2. Always uninstall before reinstalling APK

Flet's serious_python caches the extracted Python environment. adb install -r silently runs old code.

adb uninstall com.yourapp.package
adb install build/apk/app-release.apk

3. on_device=True may silently produce no results

On-device speech models may not be installed on the device. Recognition starts, status says "listening", but no results come back and no error fires. The default is on_device=False (cloud) which includes a 15-second timeout that fires a cloud_recognition_timeout error if nothing comes back.

API

FletStt()

Instantiate once. Assign event handlers before calling listen().

Events

Event e.data Description
on_result {"text": "...", "final": true, "confidence": 0.95, "alternates": [...]} Recognition result. final=false for partial results.
on_error {"error": "...", "permanent": false} Error. Includes cloud_recognition_timeout when cloud returns nothing.
on_status {"status": "listening"} Status: "listening", "notListening", "done".
on_sound_level {"level": -6.5} Mic dB level during listening.

Each event has a typed wrapper so you don't need to parse JSON manually:

Wrapper Fields Example
SttResult(e) .text, .final, .confidence, .alternates r = SttResult(e); print(r.text)
SttErrorData(e) .error, .permanent err = SttErrorData(e); print(err.error)
SttStatus(e) .status, .listening, .done s = SttStatus(e); if s.listening: ...
SttSoundLevel(e) .level s = SttSoundLevel(e); print(s.level)

Methods

await initialize() -> bool - initialize recognizer, request mic permission. Call before listen().

await listen(...)

Parameter Default Description
locale_id "" BCP-47 locale (e.g. "en_US"). Empty = system default.
listen_for_seconds 0 Max duration. 0 = platform default (~60s).
pause_for_seconds 0 Silence before auto-stop. 0 = platform default.
partial_results True Fire on_result for partial results.
on_device False Use on-device recognition. Default is cloud.
cancel_on_error False Cancel on error instead of continuing.
sample_rate 0 Hz. 0 = platform default.
listen_mode "confirmation" "confirmation", "search", or "dictation".
cloud_timeout_seconds 15 Seconds before cloud_recognition_timeout error. 0 = no timeout. Only when on_device=False.

await stop() - stop and get final result.

await cancel() - stop without final result.

await locales() -> list[dict] - available locales.

await system_locale() -> dict - system default locale.

await is_listening() -> bool / await has_permission() -> bool

Platform notes

  • Android: Google Speech Services. On-device for ~50 languages. Auto-stops after ~5s silence / ~60s total. Requires RECORD_AUDIO.
  • iOS: Apple SFSpeechRecognizer. On-device since iOS 15 for major languages. Needs NSSpeechRecognitionUsageDescription and NSMicrophoneUsageDescription in Info.plist.
  • Desktop: instantiates without error but recognition won't work (no native plugin).

Building APK

flet build apk -v

On Windows, set PYTHONIOENCODING=utf-8 before building to avoid Unicode crashes.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

flet_stt-0.1.5.tar.gz (8.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

flet_stt-0.1.5-py3-none-any.whl (9.6 kB view details)

Uploaded Python 3

File details

Details for the file flet_stt-0.1.5.tar.gz.

File metadata

  • Download URL: flet_stt-0.1.5.tar.gz
  • Upload date:
  • Size: 8.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for flet_stt-0.1.5.tar.gz
Algorithm Hash digest
SHA256 8cfbe3c6e858476bf09fe9caf28d39f95fdae1a5f31cf0f629fcbca1f11fb9e6
MD5 d071490cc0e63948d06809b198b14fc8
BLAKE2b-256 314784594068cba3de508ad50e260f8f404575bff603c0f8961e7c64475eda79

See more details on using hashes here.

File details

Details for the file flet_stt-0.1.5-py3-none-any.whl.

File metadata

  • Download URL: flet_stt-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 9.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for flet_stt-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 97384dcb271fa7d30551df10106a7e22b6e6356b0a138446462783d08be1a425
MD5 a909ae8eca229f0fea9ffb442e7a9fcb
BLAKE2b-256 fc0730ad807ebe8b5eb89355ae1ca94a82d33e47922963856c8cf88d10747017

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page