{"id":29666502,"url":"https://github.com/liteobject/speech-to-form","last_synced_at":"2026-05-08T15:16:35.771Z","repository":{"id":304923908,"uuid":"1018642751","full_name":"LiteObject/speech-to-form","owner":"LiteObject","description":"Voice-enabled web form using Flask and OpenAI. Users fill out form fields by speaking; the app extracts structured data from speech and prompts for missing info until the form is complete.","archived":false,"fork":false,"pushed_at":"2025-07-16T03:43:51.000Z","size":18,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-17T06:22:56.316Z","etag":null,"topics":["ai","flask","llm","openai","python","voice-recognition"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LiteObject.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-12T17:52:20.000Z","updated_at":"2025-07-16T03:45:11.000Z","dependencies_parsed_at":"2025-07-17T11:16:03.688Z","dependency_job_id":"1ada184d-238b-4999-9475-d6f000b0269f","html_url":"https://github.com/LiteObject/speech-to-form","commit_stats":null,"previous_names":["liteobject/speech-to-form"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/LiteObject/speech-to-form","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiteObject%2Fspeech-to-form","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiteObject%2Fspeech-to-form/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiteObject%2Fspeech-to-form/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiteObject%2Fspeech-to-form/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LiteObject","download_url":"https://codeload.github.com/LiteObject/speech-to-form/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiteObject%2Fspeech-to-form/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266516526,"owners_count":23941451,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-22T02:00:09.085Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","flask","llm","openai","python","voice-recognition"],"created_at":"2025-07-22T15:10:02.282Z","updated_at":"2026-05-08T15:16:35.762Z","avatar_url":"https://github.com/LiteObject.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Voice-Enabled Form Demo Application\n\nThis is a Flask web application that demonstrates voice-enabled form filling using browser audio recording plus AI-powered extraction, with real-time field highlighting and step-by-step guidance.\n\n## Architecture Overview\n\nThe application supports two processing paths:\n\n### Two-Stage (default)\n\n```\nAudio Input (browser) --\u003e /transcribe --\u003e [Local Whisper] --\u003e Text --\u003e [ProviderChain extractors] --\u003e Form Fields\n```\n\n### Single-Stage (multimodal)\n\n```\nAudio Input (browser) --\u003e /transcribe_multimodal --\u003e [Backend: OpenAI | Ollama | vLLM] --\u003e Form Fields\n```\n\n### Stage 1: Speech-to-Text (Whisper)\n\nIn two-stage mode, a local Whisper model transcribes audio to text (runs on your machine).\n\n### Stage 2: Text Extraction\n\nIn two-stage mode, a provider chain parses the transcript into structured form fields. Providers are tried in priority order until one succeeds.\n\n## Extraction Approaches\n\nThe application supports multiple extraction strategies, each with different trade-offs:\n\n### Approach 1: Regex-First (Default)\n\n```\nAI_PROVIDER_PRIORITY=demo,ollama,openai\n```\n\n| Aspect | Details |\n|--------|---------|\n| Speed | Regex extraction is instant; total time also depends on transcription |\n| Accuracy | Good for predictable patterns |\n| Offline | Yes (for extraction; transcription is local in two-stage mode) |\n| Cost | Free |\n\n**How it works**: Uses regular expressions to match patterns like \"my name is [NAME]\" or \"[EMAIL] at [DOMAIN] dot com\".\n\n**Pros**:\n- Extremely fast response time\n- Works completely offline\n- No API costs\n- Predictable behavior\n\n**Cons**:\n- Requires users to speak in expected patterns\n- May fail on unusual phrasing\n- Needs manual pattern updates for new speech variations\n\n**Best for**: Applications where users follow guided prompts and speed is critical.\n\n### Approach 2: LLM-First (Ollama)\n\n```\nAI_PROVIDER_PRIORITY=ollama,demo,openai\n```\n\n| Aspect | Details |\n|--------|---------|\n| Speed | 2-10 seconds (depends on model size) |\n| Accuracy | High, handles varied phrasing |\n| Offline | Yes (local inference) |\n| Cost | Free (requires GPU for best performance) |\n\n**How it works**: Sends the transcribed text to a local LLM (via Ollama) with a prompt requesting structured JSON output.\n\n**Pros**:\n- Understands natural language variations\n- Handles complex or ambiguous input\n- No cloud API dependency\n- Can extract from unstructured speech\n\n**Cons**:\n- Slower than regex (seconds vs milliseconds)\n- Requires Ollama running locally\n- GPU recommended for acceptable speed\n- Model quality affects accuracy\n\n**Best for**: Applications requiring flexibility in how users speak.\n\n### Approach 3: Cloud API (OpenAI)\n\n```\nAI_PROVIDER_PRIORITY=openai,demo\n```\n\n| Aspect | Details |\n|--------|---------|\n| Speed | 1-3 seconds |\n| Accuracy | Highest |\n| Offline | No |\n| Cost | Pay per request |\n\n**How it works**: Sends transcribed text to OpenAI API for extraction.\n\n**Pros**:\n- Best accuracy and language understanding\n- No local compute requirements\n- Handles edge cases well\n- Consistent performance\n\n**Cons**:\n- Requires internet connection\n- API costs accumulate with usage\n- Privacy considerations for sensitive data\n- Rate limits may apply\n\n**Best for**: Production applications where accuracy is paramount and cost is acceptable.\n\n### Approach 4: Single-Stage Multimodal (Implemented)\n\nThe application supports multiple backends for single-stage processing:\n\n#### Backend Options\n\n| Backend | Audio Processing | Extraction | Requirements |\n|---------|-----------------|------------|--------------|\n| **OpenAI GPT-4o** | Cloud (native audio) | Cloud | OPENAI_API_KEY |\n| **Ollama** | Local Whisper | Local LLM | Ollama running |\n| **vLLM** | Local (Ultravox) | Local | NVIDIA GPU + vLLM server |\n\n#### OpenAI GPT-4o (Cloud)\n\n```\nAudio --\u003e [GPT-4o Audio API] --\u003e Form Fields\n          (transcribe + extract in one call)\n```\n\n| Aspect | Details |\n|--------|---------|\n| Speed | 2-5 seconds |\n| Accuracy | Highest (audio context preserved) |\n| Offline | No |\n| Cost | Higher (audio tokens) |\n\n**How it works**: Audio is sent directly to GPT-4o which handles both transcription and field extraction in a single API call.\n\n**Pros**:\n- Single model handles everything\n- Audio context preserved (tone, emphasis)\n- Best accuracy for ambiguous speech\n- Simpler architecture (one API call)\n\n**Cons**:\n- Requires OpenAI API key with audio model access\n- Higher cost per request (audio tokens)\n- Audio must be uploaded to cloud\n- Requires internet connection\n\n#### Ollama Backend (Local)\n\n```\nAudio --\u003e [Local Whisper] --\u003e Text --\u003e [Ollama LLM] --\u003e Form Fields\n```\n\n| Aspect | Details |\n|--------|---------|\n| Speed | 3-15 seconds (depends on model) |\n| Accuracy | Good (depends on LLM quality) |\n| Offline | Yes |\n| Cost | Free |\n\n**How it works**: Uses local Whisper for transcription, then sends text to your local Ollama model for extraction.\n\n**Pros**:\n- Completely offline and private\n- No API costs\n- Uses your existing Ollama setup\n- Works on CPU (slower) or GPU\n\n**Cons**:\n- Slower than cloud options\n- Accuracy depends on local model quality\n- Requires Ollama to be running\n\n#### vLLM Backend (Local GPU)\n\n```\nAudio --\u003e [vLLM + Ultravox] --\u003e Form Fields\n          (native audio model)\n```\n\n| Aspect | Details |\n|--------|---------|\n| Speed | 2-5 seconds |\n| Accuracy | High |\n| Offline | Yes |\n| Cost | Free (but requires GPU) |\n\n**How it works**: Uses vLLM with audio-capable models like Ultravox for native audio processing.\n\n**Pros**:\n- True single-stage local processing\n- No cloud dependency\n- High throughput with GPU\n\n**Cons**:\n- **Requires NVIDIA GPU** (compute capability 7.0+)\n- Requires vLLM server running\n- Large model downloads\n- Not suitable for CPU-only systems\n\n## Recommendations\n\n### Choose Your Setup Based On:\n\n| Your Situation | Recommended Setup |\n|----------------|-------------------|\n| **No GPU, want speed** | Two-Stage with regex-first (`demo,ollama,openai`) |\n| **No GPU, want accuracy** | Two-Stage with Ollama-first (`ollama,demo,openai`) |\n| **Have OpenAI API key** | Single-Stage with OpenAI GPT-4o |\n| **Privacy-focused, no cloud** | Two-Stage with Ollama or Single-Stage Ollama backend |\n| **Have NVIDIA GPU** | Single-Stage with vLLM + Ultravox |\n| **Production app** | Single-Stage OpenAI (most reliable) |\n\n### Quick Decision Guide\n\n```\nDo you have an OpenAI API key?\n├── Yes --\u003e Use Single-Stage: OpenAI GPT-4o (best accuracy)\n└── No\n    ├── Do you need high accuracy?\n    │   ├── Yes --\u003e Use Two-Stage: Ollama-first\n    │   └── No --\u003e Use Two-Stage: Regex-first (fastest)\n    └── Do you have an NVIDIA GPU?\n        ├── Yes --\u003e Consider Single-Stage: vLLM\n        └── No --\u003e Use Two-Stage or Single-Stage: Ollama\n```\n\n### Performance Expectations\n\n| Mode | Backend | Typical Latency | Accuracy |\n|------|---------|-----------------|----------|\n| Two-Stage | Demo (regex) | \u003c 2 sec | Good (pattern-dependent) |\n| Two-Stage | Ollama | 3-15 sec | Good-High |\n| Single-Stage | OpenAI | 2-5 sec | Highest |\n| Single-Stage | Ollama | 3-15 sec | Good-High |\n| Single-Stage | vLLM | 2-5 sec | High |\n\n## User Interface Mode Selection\n\nThe application provides a UI toggle to switch between processing modes:\n\n### Processing Modes\n\n| Mode | Description | When to Use |\n|------|-------------|-------------|\n| **Two-Stage (Local)** | Whisper + local extraction | Fast, offline, free |\n| **Single-Stage** | Direct audio-to-fields | Most accurate |\n\n### Single-Stage Backend Options\n\nWhen Single-Stage is selected, you can choose from:\n\n| Backend | Description | Requirements |\n|---------|-------------|--------------|\n| **OpenAI GPT-4o** | Cloud processing with native audio | `OPENAI_API_KEY` in `.env` |\n| **Ollama** | Local Whisper + Ollama LLM | Ollama server running |\n| **vLLM** | Local GPU with Ultravox | NVIDIA GPU + vLLM server |\n\nUsers can select their preferred mode and backend from the form interface before recording.\n\n## Choosing an Approach\n\n| Priority | Use Case |\n|----------|----------|\n| Speed | Use regex-first (demo,ollama,openai) |\n| Accuracy | Use LLM-first (ollama,demo,openai) or cloud (openai,demo) |\n| Privacy | Use regex or local Ollama (no cloud) |\n| Cost | Use regex or Ollama (no API fees) |\n| Simplicity | Use cloud API (openai) for easiest setup |\n\n## Configuration\n\nSet the extraction priority in your `.env` file:\n\n```env\n# Fast regex, fallback to LLM\nAI_PROVIDER_PRIORITY=demo,ollama,openai\n\n# Accurate LLM, fallback to regex\nAI_PROVIDER_PRIORITY=ollama,demo,openai\n\n# Cloud API only\nAI_PROVIDER_PRIORITY=openai,demo\n```\n\n## Features\n\n### Core Functionality\n- **Smart Web Form**: Interactive form with fields for name, email, phone, and address\n- **Audio Recording**: Uses the browser microphone (MediaRecorder) and uploads audio to the Flask backend\n- **AI-Powered Processing**: Provider chain supports regex, Ollama, and OpenAI for text extraction; optional single-stage multimodal backends\n- **Step-by-Step Guidance**: Highlights current field and guides users through form completion\n- **Real-time Field Highlighting**: Visual feedback showing which field to fill next\n\n### Advanced Features  \n- **Intelligent Email Extraction**: Converts speech patterns like \"john at example dot com\" to valid email format\n- **Flexible Phone Number Processing**: Handles various phone number formats and speech variations\n- **Missing Information Detection**: Automatically identifies and requests incomplete fields\n- **Comprehensive Logging**: Debug-level logging for development and troubleshooting\n- **Health Check Endpoint**: Monitor application and OpenAI API connectivity status\n- **Graceful Fallback**: Provider chain falls back between providers based on `AI_PROVIDER_PRIORITY`\n\n### Smart Extraction Enhancements\n\nThe application includes intelligent features to improve extraction accuracy over time:\n\n#### Pattern Cache\n- **Learning from Success**: Caches successful extraction patterns for faster future processing\n- **Pattern Matching**: Finds similar speech patterns to apply proven extraction strategies\n- **Persistent Storage**: Saves patterns to `pattern_cache.json` for cross-session learning\n\n#### Field-Level Confidence Scoring\nEach extracted field receives a confidence score (0.0 - 1.0) based on:\n- **Provider Quality**: OpenAI (0.85 base), Ollama (0.75), Demo/regex (0.70)\n- **Format Validation**: Email, phone, and name format verification\n- **Length Appropriateness**: Penalizes unusually short or long values\n- **Context Matching**: Verifies extracted value appears in original transcript\n\n#### Context-Aware Extraction\nWhen the form already has data, the system:\n- Focuses extraction prompts on missing fields only\n- Includes filled fields as context to avoid re-extraction\n- Reduces ambiguity in partial form updates\n\n#### Field-Level Retry UI\nThe frontend displays:\n- **Confidence Indicators**: Visual bar (green/yellow/red) per field\n- **Re-record Buttons**: Per-field \"🎤 Re-record\" for low-confidence values\n- **Low-Confidence Styling**: Yellow highlighting prompts user verification\n\n## Quick Start\n\n### 1. Project Structure\n```\nspeech-to-form/\n├── app.py                 # Main Flask application\n├── requirements.txt       # Python dependencies\n├── .env                   # Environment variables (create from .env.example)\n├── pattern_cache.json     # Learned extraction patterns (auto-generated)\n├── config/\n│   └── settings.py        # Configuration and form schema\n├── providers/\n│   ├── base.py            # Abstract provider interface\n│   ├── factory.py         # Provider chain factory\n│   ├── demo_provider.py   # Regex-based extraction\n│   ├── ollama_provider.py # Local LLM extraction\n│   ├── openai_provider.py # OpenAI API extraction\n│   └── multimodal_provider.py  # Single-stage audio processing\n├── services/\n│   ├── form_processor.py  # Form state management\n│   ├── pattern_cache.py   # Extraction pattern learning\n│   └── confidence_scorer.py # Field confidence scoring\n├── schemas/\n│   └── validation.py      # Data validation utilities\n└── templates/\n    └── index.html         # Frontend with confidence indicators\n```\n\n### 2. Installation\n```bash\n# Clone the repository\ngit clone \u003crepository-url\u003e\ncd speech-to-form\n\n# Install dependencies\npip install -r requirements.txt\n\n# Set up environment variables\ncp .env.example .env\n# Edit .env file with your OpenAI API key (optional)\n```\n\n### 3. Environment Setup\nCreate a `.env` file with your OpenAI API key (optional - the app works without it):\n```env\nOPENAI_API_KEY=your-actual-openai-api-key-here\n```\n\n**Note**: If no OpenAI API key is provided, the application automatically uses intelligent regex-based extraction as a fallback.\n\n### 4. Run the Application\n```bash\npython app.py\n```\n\nThe application will be available at `http://localhost:5000`\n\n## How to Use\n\n### Step-by-Step Voice Form Filling\n1. **Open the Application**: Navigate to `http://localhost:5000` in your browser\n2. **Grant Microphone Permission**: Allow the browser to access your microphone when prompted\n3. **Follow Visual Guidance**: The first field (name) will be highlighted automatically\n4. **Start Recording**: Click \"Start Recording\" and speak your information for the highlighted field\n5. **Field-by-Field Progress**: After each successful extraction, the next empty field will be highlighted\n6. **Complete the Form**: Continue until all fields are filled\n\n### Example Speech Patterns\nThe application intelligently handles various speech patterns:\n\n**Natural Speech Examples:**\n- \"My name is John Doe\"\n- \"My email is john at example dot com\" *(converts to john@example.com)*\n- \"Phone number is five five five one two three four five six seven\"\n- \"I live at 123 Main Street, New York\"\n\n**Combined Information:**\n- \"Hi, I'm Sarah Johnson, my email is sarah at gmail dot com, phone 555-987-6543, and I live at 456 Oak Avenue, Chicago\"\n\n## Technical Details\n\n### Audio Capture\n- **MediaRecorder API**: Records audio in the browser and uploads it to the backend\n- **Browser Support**: Modern Chrome/Edge work best; Firefox support varies by platform and codec\n- **Permissions**: Requires microphone permission; HTTPS is required in many production setups\n\n### AI Processing Architecture\n- **Two-stage**: Local Whisper transcription + provider chain extraction (regex/Ollama/OpenAI)\n- **Single-stage**: Multimodal backend that produces transcript + extracted fields in one call\n- **OpenAI text extraction**: Falls back from `gpt-4o-mini` to `gpt-3.5-turbo` if needed\n- **Smart Extraction**: Handles speech-to-text variations (e.g., \"at\" → \"@\", \"dot\" → \".\")\n\n### Form Management\n- **Required Fields**: name, email, phone, address *(age field removed in latest version)*\n- **Real-time Validation**: Tracks completion status for each field\n- **Progressive Highlighting**: Visual guidance through form completion\n- **Missing Field Detection**: Automatic prompts for incomplete information\n\n### Enhanced Features\n- **Comprehensive Logging**: Debug-level logging to `speech_to_form.log`\n- **Health Check**: `/health` endpoint for monitoring system status\n- **Reset Functionality**: Clean form state reset with field re-highlighting\n- **Error Recovery**: Graceful handling of API failures and network issues\n\n## API Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/` | GET | Main application interface |\n| `/process` | POST | Process raw text (`{\"text\": \"...\"}`) and update form fields |\n| `/transcribe` | POST | Upload audio; returns transcript + extracted fields (two-stage) |\n| `/transcribe_simple` | POST | Upload audio; returns transcript only |\n| `/transcribe_multimodal` | POST | Upload audio; single-stage processing with `backend` (`openai`, `ollama`, `vllm`) |\n| `/status` | GET | Current form data, missing fields, and provider info |\n| `/reset` | POST | Reset server-side form state |\n| `/health` | GET | Health status and provider availability |\n\n## Customization\n\n### Adding New Form Fields\n1. Update `REQUIRED_FIELDS` in `config/settings.py`\n2. Add corresponding HTML input fields in `templates/index.html`\n3. Update the field highlighting logic in JavaScript\n4. Modify extraction patterns (regex or OpenAI prompt)\n\n### Switching AI Providers\nAdjust provider priority via `AI_PROVIDER_PRIORITY` in `.env` (provider chain order), or implement a new provider under `providers/`.\n\n### Customizing Speech Patterns\nModify the regex patterns in the `_demo_extraction` method to handle your specific speech variations or language requirements.\n\n### Styling and UI\n- Modify CSS in `templates/index.html` for visual customization\n- Update field highlighting styles via `.field-highlight` class\n- Customize status messages and user guidance text\n\n## Security Considerations\n\nFor production deployment, implement:\n- **Input Validation**: Sanitize and validate all user inputs\n- **Rate Limiting**: Protect API endpoints from abuse\n- **API Key Security**: Use environment variables and secure key management\n- **HTTPS**: Required for microphone access in production\n- **Authentication**: Add user authentication for sensitive applications\n- **Content Security Policy**: Prevent XSS attacks\n- **Logging Security**: Ensure logs don't contain sensitive information\n\n## Troubleshooting\n\n### Speech Recognition Issues\n- **Not Working**: Ensure you're using a supported browser (Chrome, Edge, Safari)\n- **No Permission**: Check microphone permissions in browser settings\n- **HTTPS Required**: Microphone access requires HTTPS in production environments\n- **Network Issues**: Check internet connection for real-time processing\n\n### OpenAI API Issues\n- **Invalid API Key**: Verify your OpenAI API key in `.env` file\n- **Quota Exceeded**: Check your OpenAI account billing and usage limits\n- **Model Unavailable**: App automatically falls back to GPT-3.5-turbo, then regex\n- **Network Timeout**: App gracefully switches to offline regex extraction\n\n### Form and UI Issues\n- **Fields Not Highlighting**: Check browser console for JavaScript errors\n- **Form Not Updating**: Verify Flask server is running and responding\n- **Extraction Failures**: Review logs in `speech_to_form.log` for debugging\n\n### Debugging Tools\n- **Log Files**: Check `speech_to_form.log` for detailed processing information\n- **Health Check**: Visit `/health` endpoint to verify system status\n- **Browser Console**: Monitor for JavaScript errors and network issues\n- **Network Tab**: Inspect API requests and responses in browser dev tools\n\n## Dependencies\n\nAll dependencies are pinned in `requirements.txt`.\n\n## Browser Compatibility\n\n| Browser | Support Level | Notes |\n|---------|---------------|-------|\n| Chrome | Excellent | Full Web Speech API support |\n| Edge | Excellent | Full Web Speech API support |\n| Safari | Good | Web Speech API supported |\n| Firefox | Limited | May require additional configuration |\n| IE | Not Supported | Use modern browser |\n\n## Recent Updates\n\n- **Pattern Cache**: Learns from successful extractions for faster future processing\n- **Confidence Scoring**: Field-level confidence scores (0.0-1.0) based on provider, format, and context\n- **Context-Aware Extraction**: Focuses on missing fields when form has existing data\n- **Field-Level Retry**: Per-field re-record buttons with visual confidence indicators\n- **Multimodal Backends**: Support for OpenAI GPT-4o, Ollama, and vLLM single-stage processing\n- **Field Highlighting**: Added step-by-step visual guidance\n- **Email Intelligence**: Improved speech-to-email conversion patterns\n- **Enhanced Logging**: Comprehensive debug logging throughout application\n- **Error Recovery**: Better handling of API failures and network issues\n- **Health Monitoring**: Added system health check endpoint","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliteobject%2Fspeech-to-form","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fliteobject%2Fspeech-to-form","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliteobject%2Fspeech-to-form/lists"}