Adding Speech Recognition with Grammar Support to Your Angular Application

Speech recognition can greatly enhance user interactions in web applications by allowing users to input text or commands using their voice. In this tutorial, I’ll show you how to integrate speech recognition into an Angular application and enhance it w…


This content originally appeared on DEV Community and was authored by Ali Ahsan

Speech recognition can greatly enhance user interactions in web applications by allowing users to input text or commands using their voice. In this tutorial, I'll show you how to integrate speech recognition into an Angular application and enhance it with grammar support.

Prerequisites

  • Basic knowledge of Angular.
  • Angular CLI installed.
  • An existing Angular project or create a new one using ng new speech-recognition-app.

Step 1: Set Up the Speech Recognition Service

First, we need to create a service to handle speech recognition. This service will use the Web Speech API's webkitSpeechRecognition and SpeechGrammarList.

Create a new service:
ng generate service speech-recognition
Now, update the generated speech-recognition.service.ts:

import { Injectable, NgZone } from '@angular/core';
@Injectable({
  providedIn: 'root',
})
export class SpeechRecognitionService {
  recognition: any;
  isListening: boolean = false;

  constructor(private zone: NgZone) {
    const { webkitSpeechRecognition, webkitSpeechGrammarList }: IWindow = window as any;
    this.recognition = new webkitSpeechRecognition();
    this.recognition.continuous = false;
    this.recognition.interimResults = false;
    this.recognition.lang = 'en-US';

    const grammar = '#JSGF V1.0; grammar colors; public <color> = red | green | blue | yellow ;';
    const speechRecognitionList = new webkitSpeechGrammarList();
    speechRecognitionList.addFromString(grammar, 1);
    this.recognition.grammars = speechRecognitionList;
  }

  startListening(): Promise<string> {
    return new Promise((resolve, reject) => {
      if (this.isListening) {
        reject('Already listening');
      }

      this.isListening = true;

      this.recognition.onresult = (event: any) => {
        this.zone.run(() => {
          const result = event.results[0][0].transcript;
          this.stopListening();
          resolve(result);
        });
      };

      this.recognition.onerror = (event: any) => {
        this.zone.run(() => {
          this.isListening = false;
          reject(event.error);
        });
      };

      this.recognition.onend = () => {
        this.zone.run(() => {
          this.isListening = false;
        });
      };

      this.recognition.start();
    });
  }

  stopListening(): void {
    if (this.isListening) {
      this.recognition.stop();
      this.isListening = false;
    }
  }
}

interface IWindow extends Window {
  webkitSpeechRecognition: any;
  webkitSpeechGrammarList: any;
}

Step 2: Create the Component

Next, we'll create a component to utilize our speech recognition service. This component will have a textarea and a microphone icon. When the user clicks the icon, speech recognition will start, and the recognized text will be added to the textarea.
Update app.component.ts:

import { Component } from '@angular/core';
import { SpeechRecognitionService } from './speech-recognition.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})
export class AppComponent {
  note: string = '';
  isListening: boolean = false;

  constructor(private speechRecognitionService: SpeechRecognitionService) {}

  toggleListening() {
    if (this.isListening) {
      this.speechRecognitionService.stopListening();
      this.isListening = false;
    } else {
      this.isListening = true;
      this.speechRecognitionService.startListening().then(
        (result: string) => {
          this.note = result;
          this.isListening = false;
        },
        (error: any) => {
          console.error('Speech recognition error', error);
          this.isListening = false;
        }
      );
    }
  }
}

Step 3: Update the Template

In the template, we'll bind the click event to our toggle method and use Angular's ngClass directive to add a glow effect when the microphone is listening.

Update app.component.html:

<div class="textarea-container">
  <textarea
    maxlength="150"
    class="form-control"
    id="message-text"
    rows="3"
    [(ngModel)]="note"
  ></textarea>
  <i
    (click)="toggleListening()"
    class="mdi mdi-microphone mic-icon"
    [ngClass]="{ 'glow': isListening }"
  ></i>
</div>

Step 4: Add Styling

Add some styles to position the microphone icon and add a glow effect when it is listening.

Update app.component.css:

.textarea-container {
  position: relative;
  display: inline-block;
}

.textarea-container textarea {
  width: 100%;
  box-sizing: border-box;
}

.mic-icon {
  position: absolute;
  top: 10px;
  right: 10px;
  cursor: pointer;
  font-size: 24px;
  color: #333;
  transition: box-shadow 0.3s ease;
}

.mic-icon.glow {
  box-shadow: 0 0 10px 2px rgba(255, 0, 0, 0.8);
}

Step 5: Test Your Application

Run your Angular application using:
ng serve

Navigate to http://localhost:4200/ in your browser. You should see the textarea with a microphone icon. When you click the icon, it will start listening, and the icon will glow. Speak a color from the grammar list (red, green, blue, yellow), and the recognized color will be added to the textarea.

Conclusion

You've successfully added speech recognition with grammar support to your Angular application. This feature can be expanded to recognize more complex commands and integrate seamlessly with various functionalities in your application. Experiment with different grammars and speech recognition settings to see what works best for your use case.
Follow me on linkedin
Happy coding!


This content originally appeared on DEV Community and was authored by Ali Ahsan


Print Share Comment Cite Upload Translate Updates
APA

Ali Ahsan | Sciencx (2024-08-01T11:51:48+00:00) Adding Speech Recognition with Grammar Support to Your Angular Application. Retrieved from https://www.scien.cx/2024/08/01/adding-speech-recognition-with-grammar-support-to-your-angular-application/

MLA
" » Adding Speech Recognition with Grammar Support to Your Angular Application." Ali Ahsan | Sciencx - Thursday August 1, 2024, https://www.scien.cx/2024/08/01/adding-speech-recognition-with-grammar-support-to-your-angular-application/
HARVARD
Ali Ahsan | Sciencx Thursday August 1, 2024 » Adding Speech Recognition with Grammar Support to Your Angular Application., viewed ,<https://www.scien.cx/2024/08/01/adding-speech-recognition-with-grammar-support-to-your-angular-application/>
VANCOUVER
Ali Ahsan | Sciencx - » Adding Speech Recognition with Grammar Support to Your Angular Application. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2024/08/01/adding-speech-recognition-with-grammar-support-to-your-angular-application/
CHICAGO
" » Adding Speech Recognition with Grammar Support to Your Angular Application." Ali Ahsan | Sciencx - Accessed . https://www.scien.cx/2024/08/01/adding-speech-recognition-with-grammar-support-to-your-angular-application/
IEEE
" » Adding Speech Recognition with Grammar Support to Your Angular Application." Ali Ahsan | Sciencx [Online]. Available: https://www.scien.cx/2024/08/01/adding-speech-recognition-with-grammar-support-to-your-angular-application/. [Accessed: ]
rf:citation
» Adding Speech Recognition with Grammar Support to Your Angular Application | Ali Ahsan | Sciencx | https://www.scien.cx/2024/08/01/adding-speech-recognition-with-grammar-support-to-your-angular-application/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.