3 min read

Text-To-Speech with Laravel and Open AI

Text-To-Speech with Laravel and Open AI

Parang dati kapag narining mo yung' Text-To-Speech functionality parang mapapaisip ka na paano gawin. Pero ngayon sa tulong ng AI sobrang easy na lang natin yan magagawa. And good thing pa don' with Laravel Integration na din.

Setup

composer require openai-php/client
composer require openai-php/laravel

Models: tts-1 vs tts-1-hd

Kapag gumamit ka ng TTS sa OpenAI, may dalawang main models na pwede mong gamitin:

  1. tts-1 (Standard Model)
    • Mas mabilis at mas mura.
    • Ideal kapag ang use case mo ay real-time applications gaya ng chatbots, quick previews, o apps na kailangan ng mabilis na response.
    • Output: malinaw at natural pa rin ang tunog, pero medyo lighter sa processing.
  2. tts-1-hd (High Definition Model)
    • Mas mataas ang quality (parang studio-recorded audio).
    • Mas mabigat sa compute at mas mahal kaysa sa tts-1.
    • Recommended kung gagamitin mo sa audiobooks, podcast-style content, o production-grade voiceovers.

💡 Tip: Kung gagamit ka ng maraming TTS requests per day, magandang i-balance ang paggamit—tts-1 para sa mabilis na response, at tts-1-hd para sa high-quality final output


Voices Available

Right now, OpenAI offers a set of preset voices na pwede mong piliin:

  • Alloy – balanced male voice
  • Echo – upbeat & energetic male voice
  • Fable – calm & storytelling style (perfect sa narration)
  • Onyx – deeper tone, masculine serious feel
  • Nova – warm and approachable
  • Shimmer – slightly playful, lively female voice
  • Ash – modern, neutral tone

👉 Ang kagandahan dito, hindi ka na kailangan mag-train ng sarili mong voice dataset. Isang parameter lang (voice) at switch ka agad sa ibang vibe.


Pricing


Based sa current OpenAI pricing (as of 2025):

  • tts-1 (Standard): $0.015 per 1,000 characters
  • tts-1-hd (High Definition): $0.030 per 1,000 characters

To give you context:

  • 1,000 characters ≈ 150–200 words (depende sa haba ng sentences).
  • Ibig sabihin, kung gumawa ka ng 5-minute narration (~3,000 characters), nasa $0.045 lang sa tts-1, at nasa $0.09 kung tts-1-hd.

Kung ikukumpara sa mga traditional TTS providers dati, sobrang mura at accessible na talaga ngayon.


Sample Code

<?php

namespace App\Actions;

use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Storage;
use Lorisleiva\Actions\Concerns\AsAction;
use OpenAI\Laravel\Facades\OpenAI;

class TextToSpeech
{
    use AsAction;

    public function handle(string $text, string $voice = 'alloy', string $model = 'tts-1'): string
    {
        // Generate speech using OpenAI TTS
        $response = OpenAI::audio()->speech([
            'model' => $model,
            'input' => $text,
            'voice' => $voice,
        ]);

        // Generate a unique filename
        $filename = 'tts_'.uniqid().'.mp3';
        $path = "audio/{$filename}";

        // Store the audio file
        Storage::disk('s3')->put($path, $response);

        return Storage::disk('s3')->url($path);
    }

    public function asController(): JsonResponse
    {
        $text = request('text');
        $voice = request('voice', 'alloy');
        $model = request('model', 'tts-1');

        // Validate input
        if (empty($text)) {
            return response()->json([
                'error' => 'Text is required',
            ], 422);
        }

        // Validate voice option
        $allowedVoices = ['alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer', 'ash'];
        if (! in_array($voice, $allowedVoices)) {
            return response()->json([
                'error' => 'Invalid voice. Allowed voices: '.implode(', ', $allowedVoices),
            ], 422);
        }

        // Validate model option
        $allowedModels = ['tts-1', 'tts-1-hd'];
        if (! in_array($model, $allowedModels)) {
            return response()->json([
                'error' => 'Invalid model. Allowed models: '.implode(', ', $allowedModels),
            ], 422);
        }

        try {
            $audioUrl = $this->handle($text, $voice, $model);

            return response()->json([
                'audio_url' => $audioUrl,
                'text' => $text,
                'voice' => $voice,
                'model' => $model,
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'error' => 'Failed to generate speech: '.$e->getMessage(),
            ], 500);
        }
    }
}

Conclusion

Ang Text-To-Speech with Laravel and OpenAI ay hindi na ganoon kahirap i-implement. May choice ka agad sa models (speed vs quality) at voices (tone & style) depende sa project mo. Sa sobrang mura ng pricing, hindi mo na kailangan mag-worry kahit mag-generate ka ng hundreds of audio files daily.

Perfect ito for:

  • Chatbots with voice response
  • E-learning apps
  • Audiobooks
  • Podcasts
  • Multilingual narration