|
|
'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; |
|
|
}; |
|
|
|
|
|
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.' }; |
|
|
} |
|
|
} |
|
|
|