Skip to content

Repository files navigation

Accessible QR Audio Generator

BMS (Blind Management System) is a web application that creates QR codes accessible to visually impaired users by turning them into an audio-first experience.

Using BMS, users can scan QR codes generated by businesses that directly play a chosen spoken description.

Problem

For visually impaired people, everyday tasks such as reading a menu, understanding a product label, or accessing public information can be frustrating and impossible. Completing these tasks requires visually impaired people to ask others for help, which increases dependence and makes simple tasks more bothersome.

As the world increasingly uses visual interfaces to communicate information, visually impaired individuals are often excluded and overlooked. Tools that are meant to increase convenience, such as digital labels or quick-access information systems, use visual elements and require sight to use, unintentionally excluding people who can't see.

This gap in accessibility places visually impaired people in a world that is not designed with them in mind.

BMS removes these barriers.

With the Blind Management System, visually impaired individuals no longer need to rely on sight to access basic information such as reading a menu or a product label. Users can open BMS and directly scan a QR code that speaks out clear spoken instructions.

This allows users to:

  • Access information independently without needing assistance
  • Understand products, menus, and public information in real time
  • Avoid the frustration of navigating complex or inaccessible interfaces
  • Feel more confident and included in everyday environments

BMS replaces the increasing dependency on visual elements with direct audio output and offers visually impaired people access to information previously unavailable.

Key Feature: Directional Audio Scanner

The directional audio scanner is an audio beacon that guides users to the QR code:

  • When the QR code is detected, a beep is played
  • Sound shifts to the left or right based on the direction of the QR code
  • Beep speed increases as users get closer to the QR code

The beacon is built entirely on the Web Audio API with no native app and no external SDK. Each beep uses an OscillatorNode routed through a StereoPannerNode and GainNode. Pan value is calculated from the QR code's horizontal center position in the camera frame (-1 = full left, +1 = full right). Beep interval scales non-linearly with distance using a squared proximity term so the beeping stays manageable far away and drops sharply as the code fills the frame. Amplitude uses exponentialRampToValueAtTime instead of linear ramping to avoid the click artifact that occurs when gain drops abruptly to zero.

Quick Start

  1. Clone the repository
git clone https://github.com/AaritKumar/blindmanagementsystem
cd blindmanagementsystem
  1. Set up environment
python -m venv venv
source venv/bin/activate  # Mac/Linux
venv\Scripts\activate  # Windows
  1. Install dependencies
pip install -r requirements.txt
  1. Run migrations
python manage.py migrate
  1. Run tests
python manage.py test
  1. Start the server
python manage.py runserver
  1. Open the app

Go to http://127.0.0.1:8000/.

Screenshots

Dashboard View

Dashboard view

Create Product Form

Create product form

Demo

Watch the demo

How It Works

Businesses:

  • Create products on the business dashboard
  • Add descriptions of products onto the QR code
  • Generate QR codes
  • Organize QR codes for varying use cases

Users:

  • Open the scanner
  • Use the audio beacon to identify and scan a QR code
  • Hear the audio description automatically

Core Features

  • Secure, login-protected dashboard
  • Product and folder management
  • Drag-and-drop organization
  • Reusable description templates
  • Automatic QR code generation
  • Directional audio QR scanner

Technical Overview

  • Backend: Django (MVT architecture)
  • Frontend: Modern JavaScript (ES6 classes)
  • Audio System: Web Audio API (real-time spatial sound)
  • Database: Django ORM with migrations
  • Accessibility: ARIA roles and live regions

Why these technical decisions

No native app. Requiring a download creates friction that excludes the people who need the tool most. BMS works instantly in any standard smartphone browser.

No GPS. GPS accuracy indoors is insufficient for locating a specific label or sign. QR codes solve the location problem without infrastructure.

Base64 QR storage. QR codes are stored as Base64 data URIs in a TextField rather than image files. This removes the filesystem dependency and makes the app deployable on stateless hosting without requiring a storage bucket. Recorded in migration 0004.

Web Audio API over <audio> elements. The AudioContext graph allows sample-accurate scheduling of gain envelopes and pan values. Audio elements have playback latency that makes real-time directional guidance feel unresponsive.

UUID slugs. Product listen URLs use shortuuid-generated slugs instead of sequential IDs, preventing enumeration of QR codes.

Development process

The project was built across 40 commits on 6 branches following a requirements -> design -> implementation -> testing workflow.

  • main - stable releases
  • feature/audio-beacon - directional audio system
  • feature/dashboard - business dashboard and product management
  • feature/templates - reusable description template system
  • feature/deployment - deployment configuration
  • feature/qr-base64 - migration from file-based to Base64 QR storage

Testing

python manage.py test

Tests cover the full development lifecycle across both apps:

# accounts/tests.py
class SignupViewTest(TestCase):
    def test_signup_creates_user_and_redirects(self):
        response = self.client.post('/accounts/signup/', {
            'username': 'testuser', 'password': 'testpass123'
        })
        self.assertRedirects(response, '/dashboard/')
        self.assertTrue(User.objects.filter(username='testuser').exists())

# products/tests.py
class ProductModelTest(TestCase):
    def setUp(self):
        self.user = User.objects.create_user(username='u', password='p')

    def test_product_generates_unique_slug_on_save(self):
        product = Product.objects.create(
            owner=self.user, name='Test', text_description='desc'
        )
        self.assertNotEqual(product.unique_slug, '')

    def test_qrcode_auto_created_with_image_data(self):
        product = Product.objects.create(
            owner=self.user, name='Test', text_description='desc'
        )
        qr = QRCode.objects.create(linked_product=product)
        self.assertTrue(qr.image_data.startswith('data:image/png;base64,'))

    def test_listen_view_returns_200_for_valid_slug(self):
        product = Product.objects.create(
            owner=self.user, name='Test', text_description='desc'
        )
        response = self.client.get(f'/listen/{product.unique_slug}/')
        self.assertEqual(response.status_code, 200)

    def test_dashboard_requires_login(self):
        response = self.client.get('/dashboard/')
        self.assertRedirects(response, '/accounts/login/?next=/dashboard/')

    def test_update_product_folder_rejects_wrong_owner(self):
        other = User.objects.create_user(username='other', password='p')
        product = Product.objects.create(
            owner=other, name='Other product', text_description='desc'
        )
        self.client.login(username='u', password='p')
        response = self.client.post(
            '/api/update_product_folder/',
            data=json.dumps({'product_id': product.id, 'folder_id': None}),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, 400)

Design Philosophy

The project was built with a fundamental principle:

BMS should be more than a software, it should be a lifestyle.

Summary

This project demonstrates how thoughtful design and engineering can solve real-world accessibility problems. By combining a QR code-based app with spatial audio and text-to-speech, it creates a system that is practical not only for visually impaired users but also for businesses and communities.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages