An AI announcer mispronounced and skipped names during a graduation
Back to Tutorials
techTutorialintermediate

An AI announcer mispronounced and skipped names during a graduation

May 19, 202611 views5 min read

Learn to build a robust AI voice announcement system for graduation ceremonies that handles complex name pronunciations and includes error handling mechanisms.

Introduction

In recent years, AI-powered voice synthesis systems have become increasingly popular for announcing graduates during commencement ceremonies. However, as highlighted by recent incidents where AI announcers mispronounced names or skipped students, it's crucial to understand how to properly implement and test these systems. This tutorial will guide you through creating a robust AI voice announcement system that can handle complex name pronunciations and maintain accuracy during live events.

Prerequisites

  • Python 3.7 or higher installed
  • Basic understanding of Python programming and APIs
  • Access to a cloud voice synthesis service (we'll use Amazon Polly)
  • Graduation list in CSV format with student names and any pronunciation notes
  • Basic knowledge of audio file handling

Step-by-Step Instructions

1. Set up your development environment

First, we need to create a Python virtual environment and install the required packages. This ensures our project is isolated from other Python installations on your system.

python -m venv graduation_voice_env
source graduation_voice_env/bin/activate  # On Windows: graduation_voice_env\Scripts\activate
pip install boto3 pandas pydub

The boto3 package provides access to AWS services like Amazon Polly, pandas helps with CSV data manipulation, and pydub handles audio file operations.

2. Prepare your student data

Create a CSV file named graduates.csv with columns for student names and pronunciation notes:

name,pronunciation_notes
John Smith,pronounced as "Smith"
Maria Rodriguez,pronounced as "Rod-ri-gez"
James O'Connor,pronounced as "O'Connor"

This data structure allows us to store specific pronunciation instructions for names that might be problematic for AI systems.

3. Configure AWS credentials

Before using Amazon Polly, you'll need AWS credentials. Create a file named aws_credentials.py:

import boto3

def get_polly_client():
    return boto3.client('polly',
                       region_name='us-east-1',
                       aws_access_key_id='YOUR_ACCESS_KEY',
                       aws_secret_access_key='YOUR_SECRET_KEY')

Replace the placeholder keys with your actual AWS credentials. Store these securely and never commit them to version control.

4. Create the main voice announcement system

Create a file called graduation_announcer.py:

import pandas as pd
import os
from aws_credentials import get_polly_client
from pydub import AudioSegment
import time

class GraduationAnnouncer:
    def __init__(self):
        self.polly = get_polly_client()
        self.students = self.load_student_data()
        
    def load_student_data(self):
        df = pd.read_csv('graduates.csv')
        return df
        
    def synthesize_speech(self, text, voice_id='Joanna'):
        try:
            response = self.polly.synthesize_speech(
                Text=text,
                OutputFormat='mp3',
                VoiceId=voice_id
            )
            
            # Save the audio stream to a file
            filename = f"temp_{int(time.time())}.mp3"
            with open(filename, 'wb') as file:
                file.write(response['AudioStream'].read())
            
            return filename
        except Exception as e:
            print(f"Error synthesizing speech: {e}")
            return None
            
    def announce_student(self, student_name, pronunciation_note=None):
        # Create a more natural announcement
        if pronunciation_note:
            announcement_text = f"Please welcome {student_name} who will be pronounced as {pronunciation_note}"
        else:
            announcement_text = f"Please welcome {student_name}"
            
        audio_file = self.synthesize_speech(announcement_text)
        return audio_file
        
    def process_all_students(self):
        for index, student in self.students.iterrows():
            print(f"Processing {student['name']}")
            audio_file = self.announce_student(student['name'], student.get('pronunciation_notes', None))
            if audio_file:
                print(f"Generated audio for {student['name']}")
                # Here you would play the audio or queue it for live announcement
            else:
                print(f"Failed to generate audio for {student['name']}")
            
            # Add a small delay between announcements
            time.sleep(2)

# Initialize and run the announcer
if __name__ == "__main__":
    announcer = GraduationAnnouncer()
    announcer.process_all_students()

This code creates a robust system that can handle multiple students and includes error handling for failed voice synthesis attempts.

5. Implement error handling and fallback mechanisms

Enhance your system to handle common issues that might occur during live events:

def safe_announce_student(self, student_name, pronunciation_note=None):
    try:
        # First, try to generate the announcement
        audio_file = self.announce_student(student_name, pronunciation_note)
        
        if audio_file and os.path.exists(audio_file):
            # Play the audio file (this would be replaced with actual audio playback)
            print(f"Successfully announced {student_name}")
            return True
        else:
            # Fallback: create a simple text-to-speech using a different voice
            fallback_text = f"Welcome {student_name}"
            fallback_file = self.synthesize_speech(fallback_text, 'Matthew')
            print(f"Using fallback voice for {student_name}")
            return True
            
    except Exception as e:
        print(f"Critical error announcing {student_name}: {e}")
        # Log error and continue with next student
        return False

This fallback mechanism ensures that if one voice fails, the system can attempt with a different voice or text format.

6. Test your system with sample data

Create a test script to verify your system works correctly:

import unittest
from graduation_announcer import GraduationAnnouncer

class TestGraduationAnnouncer(unittest.TestCase):
    def setUp(self):
        self.announcer = GraduationAnnouncer()
        
    def test_student_loading(self):
        self.assertIsNotNone(self.announcer.students)
        self.assertTrue(len(self.announcer.students) > 0)
        
    def test_audio_generation(self):
        # Test with a simple name
        filename = self.announcer.announce_student("Test Student")
        self.assertIsNotNone(filename)
        
if __name__ == '__main__':
    unittest.main()

Running this test ensures your system can properly load data and generate audio files.

7. Add live announcement capabilities

For actual live events, you'll need to integrate with audio playback:

def play_audio(self, audio_file):
    try:
        # Load and play the audio file
        audio = AudioSegment.from_mp3(audio_file)
        # In a real system, you'd use a library like pygame or playsound
        # For now, we'll just simulate playing
        print(f"Playing audio file: {audio_file}")
        return True
    except Exception as e:
        print(f"Error playing audio: {e}")
        return False
        
# Integration with announcement process
for index, student in self.students.iterrows():
    audio_file = self.announce_student(student['name'], student.get('pronunciation_notes', None))
    if audio_file:
        self.play_audio(audio_file)
        # Clean up temporary files
        os.remove(audio_file)

This integration ensures that generated audio files are properly played during the ceremony and cleaned up afterward.

Summary

This tutorial demonstrated how to build a robust AI voice announcement system for graduation ceremonies. By using Amazon Polly for text-to-speech conversion and implementing proper error handling, we've created a system that can handle complex name pronunciations and maintain reliability during live events. The key improvements over basic AI systems include:

  • Proper data handling with CSV files
  • Fallback mechanisms for failed voice synthesis
  • Integration with audio playback capabilities
  • Comprehensive error handling and logging
  • Support for custom pronunciation notes

While this system significantly improves upon basic AI announcers, it's important to remember that live testing with actual names and pronunciations should always be performed before major events to ensure accuracy and reliability.

Source: The Verge AI

Related Articles