2 : Répondre aux incidents et aux demandes d'assistance et d'évolution

  • 1.2.1 Traiter des demandes concernant les services réseau et système, applicatifs

3 : Développer la présence en ligne de l'organisation

  • 1.3.1 Participer à l'évolution d'un site web exploitant les données de l'organisation

5 : Mise à disposition des utilisateurs d'un service informatique

  • 1.5.2 Déployer un service

Routes disponibles

  • GET / — Récupérer la liste des voix disponibles
  • GET /getSetting/{voiceId} — Récupérer les paramètres d'une voix
  • POST /editSetting/{voiceId} — Modifier les paramètres d'une voix
  • POST /text-to-speech — Générer un fichier audio WAV à partir d'un texte

Route getSetting avec DTO :

#[Route("/getSetting/{voiceId}", name: "getSetting", methods: ['GET'])]
public function getSetting(string $voiceId): Response
{
    $response = $this->exempleAPIClient->request("GET", "voices/{$voiceId}");
    $json = $response->toArray();
    $dto = $this->objectMapper->map((object)$json, ExempleAPIVoiceDto::class);
    return $this->json($dto);
}

DTO TextToSpeechDto

class TextToSpeechDto
{
    #[Assert\NotBlank]
    private string $text;

    #[Assert\NotBlank]
    #[Assert\Choice(choices: ['fr', 'en'])]
    private string $lang;

    #[Assert\NotBlank]
    private string $voice;

    #[Assert\NotBlank]
    #[Assert\Regex("/^\d+$/")]
    private string $idQuestion;

    #[SerializedName("model_id")]
    private string $modelId = "model";

    private array $settings = [];
    private string $isQuestion = "";
    private string $api = "exempleAPI";

    public function getText(): string
    {
        return $this->text;
    }

    public function setText(string $text): self
    {
        $this->text = $text;
        return $this;
    }
}

Route generateAudio — génération du fichier audio :

#[OA\Post(
    summary: "Génère un fichier audio à partir d'un texte",
    description: "Génère un fichier audio WAV en utilisant l'API TTS sélectionnée.",
    requestBody: new OA\RequestBody(
        required: true,
        description: "Requête JSON avec champs obligatoires : text, lang, voice, idQuestion",
        content: new OA\JsonContent(ref: new Model(type: TextToSpeechDto::class))
    ),
    responses: [
        new OA\Response(response: 200, description: "Fichier audio généré",
            content: new OA\MediaType(mediaType: "audio/wav")),
        new OA\Response(response: 400, description: "Erreur de validation"),
        new OA\Response(response: 415, description: "Content-Type invalide"),
        new OA\Response(response: 500, description: "Erreur interne serveur"),
    ]
)]
public function generateAudio(Request $request, TtsSelectApi $ttsSelectApi): Response
{
    $header = $request->headers->get('Content-Type');
    if ('application/json' !== $header) {
        return new Response('Content-Type invalide', Response::HTTP_UNSUPPORTED_MEDIA_TYPE);
    }

    if (empty($request->getContent())) {
        return $this->json([], Response::HTTP_BAD_REQUEST);
    }

    try {
        $apiClass = $ttsSelectApi->selectApi($textToSpeechDto->getApi());
        $textSSML = $apiClass->replacePatternJson(
            $textToSpeechDto->getApi(),
            $textToSpeechDto->getLang(),
            $textToSpeechDto->getText()
        );
        $audio = $apiClass->getOutputAudio($textSSML, $textToSpeechDto->getVoice());
    } catch (\Exception $e) {
        return new Response($e->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
    }
}

Interface API

Voir l'article Interface API Nelmio


Test API

Voir l'article Test API