Sameer Banchhor
added everything
7faea5c
'use server';
import { z } from 'zod';
const API_BASE_URL = 'https://sameerbanchhor-chhattisgarhi-tts-api.hf.space';
const formSchema = z.object({
text: z.string().min(1, 'Please enter some text to convert.').max(500, 'Text cannot exceed 500 characters.'),
});
export type TtsState = {
success: boolean;
audioUrl?: string;
error?: string;
key?: number; // Used to force re-rendering of the audio player
};
export async function convertTextToSpeech(prevState: TtsState, formData: FormData): Promise<TtsState> {
const validatedFields = formSchema.safeParse({
text: formData.get('text'),
});
if (!validatedFields.success) {
return { success: false, error: validatedFields.error.flatten().fieldErrors.text?.[0] };
}
const { text } = validatedFields.data;
try {
const generateResponse = await fetch(`${API_BASE_URL}/generate-audio`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ text }),
});
if (!generateResponse.ok) {
const errorData = await generateResponse.json().catch(() => ({ message: generateResponse.statusText }));
throw new Error(`Failed to generate audio: ${errorData.message || 'Unknown error'}`);
}
const generateData = await generateResponse.json();
if (generateData.status !== 'success' || !generateData.audio_url) {
throw new Error(generateData.message || 'API did not return a valid audio URL.');
}
const audioUrl = `${API_BASE_URL}${generateData.audio_url}`;
return { success: true, audioUrl: audioUrl, key: Date.now() };
} catch (error) {
console.error('TTS Conversion Error:', error);
if (error instanceof Error) {
return { success: false, error: error.message };
}
return { success: false, error: 'An unknown error occurred during conversion.' };
}
}