{
  "aboutHtml": "<p>Gemini 3.1 Flash TTS Preview transforme le texte en parole. Il vise une voix naturelle, avec un contrôle de la narration par des consignes textuelles. Le style de prononciation peut être défini avec les instructions vocales, tandis que les balises audio expressives aident à obtenir l’interprétation souhaitée.</p><h4>Du texte à l’audio</h4><p>L’entrée de ce modèle est du <strong>texte</strong>, et sa sortie un <strong>enregistrement audio</strong>. Le volume maximal est de <strong>8 192 jetons</strong> en entrée et de <strong>16 384 jetons</strong> en sortie. Il est conçu pour synthétiser la parole à partir d’un texte préparé ; ce n’est pas un modèle habituel de réponse textuelle ou de transcription d’un enregistrement fourni.</p><p>Une lecture par une seule voix et des dialogues avec plusieurs locuteurs sont prévus. Le contrôle de la prononciation repose sur les instructions : on peut décrire le style de lecture et l’expressivité des répliques. Pour les tâches vocales répétitives, le fabricant indique la génération par lots.</p><h4>Le format du résultat et la spécialisation</h4><p>Le format brut d’une réponse habituelle est du <strong>PCM sans en-tête WAV</strong>. Cette particularité est importante pour cette version préliminaire : les octets renvoyés ne doivent pas être considérés automatiquement comme un fichier WAV prêt à l’emploi.</p><p>La fiche du modèle n’annonce pas la mise en cache du contexte, l’exécution de code, la recherche dans des fichiers, les appels de fonctions, l’ancrage dans la recherche, Google Maps, la génération d’images, les réponses textuelles structurées, Thinking ou la lecture du contenu des adresses web. La synthèse vocale est sa tâche de sortie spécialisée ; les capacités des modèles textuels ne s’y transposent pas.</p><h4>Une version préliminaire</h4><p><code>gemini-3.1-flash-tts-preview</code> fait partie des versions vocales préliminaires antérieures. Ses modes de contrôle de la voix et son format audio doivent être considérés séparément de ceux des modèles TTS suivants. Cette version n’annonce ni la création d’une nouvelle identité vocale ni la reproduction d’une voix à partir d’un exemple ; sa fiche n’indique pas le nombre exact de langues prises en charge.</p><p>Les fonctions décrites concernent le modèle lui-même. La façon précise de transmettre le texte, les réglages des locuteurs et de recevoir le fichier audio dépend de la méthode vocale prise en charge.</p>",
  "aboutText": "Gemini 3.1 Flash TTS Preview transforme le texte en parole. Il vise une voix naturelle, avec un contrôle de la narration par des consignes textuelles. Le style de prononciation peut être défini avec les instructions vocales, tandis que les balises audio expressives aident à obtenir l’interprétation souhaitée.\n\n### Du texte à l’audio\n\nL’entrée de ce modèle est du **texte**, et sa sortie un **enregistrement audio**. Le volume maximal est de **8 192 jetons** en entrée et de **16 384 jetons** en sortie. Il est conçu pour synthétiser la parole à partir d’un texte préparé ; ce n’est pas un modèle habituel de réponse textuelle ou de transcription d’un enregistrement fourni.\n\nUne lecture par une seule voix et des dialogues avec plusieurs locuteurs sont prévus. Le contrôle de la prononciation repose sur les instructions : on peut décrire le style de lecture et l’expressivité des répliques. Pour les tâches vocales répétitives, le fabricant indique la génération par lots.\n\n### Le format du résultat et la spécialisation\n\nLe format brut d’une réponse habituelle est du **PCM sans en-tête WAV**. Cette particularité est importante pour cette version préliminaire : les octets renvoyés ne doivent pas être considérés automatiquement comme un fichier WAV prêt à l’emploi.\n\nLa fiche du modèle n’annonce pas la mise en cache du contexte, l’exécution de code, la recherche dans des fichiers, les appels de fonctions, l’ancrage dans la recherche, Google Maps, la génération d’images, les réponses textuelles structurées, Thinking ou la lecture du contenu des adresses web. La synthèse vocale est sa tâche de sortie spécialisée ; les capacités des modèles textuels ne s’y transposent pas.\n\n### Une version préliminaire\n\n`gemini-3.1-flash-tts-preview` fait partie des versions vocales préliminaires antérieures. Ses modes de contrôle de la voix et son format audio doivent être considérés séparément de ceux des modèles TTS suivants. Cette version n’annonce ni la création d’une nouvelle identité vocale ni la reproduction d’une voix à partir d’un exemple ; sa fiche n’indique pas le nombre exact de langues prises en charge.\n\nLes fonctions décrites concernent le modèle lui-même. La façon précise de transmettre le texte, les réglages des locuteurs et de recevoir le fichier audio dépend de la méthode vocale prise en charge.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "cfced3357590fc21eb99243d3e6fad885fe92328f2fdc91a96cd7e5269c6e46b",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "fr-ca",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">G</span><h2 id=\"sheet-title\">Gemini 3.1 Flash Tts Preview</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Fermer\">×</button></div><div class=\"idline\"><span>Google /</span><code>gemini-3.1-flash-tts-preview</code><button type=\"button\" id=\"copy-id\">Copier l’ID</button></div><nav class=\"card-jump-nav\" aria-label=\"Rubriques de la fiche modèle\"><button type=\"button\" data-card-jump=\"overview\">Pour commencer</button><button type=\"button\" data-card-jump=\"methods\">Entrées et méthodes</button><button type=\"button\" data-card-jump=\"pricing\">Tarifs</button><button type=\"button\" data-card-jump=\"examples\">Exemples</button><button type=\"button\" data-card-jump=\"results\">Résultats</button><button type=\"button\" data-card-jump=\"aliases\">Alias</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"Méthodes API\"><button type=\"button\" role=\"tab\" tabindex=\"0\" aria-controls=\"card-method-content\" aria-selected=\"true\" id=\"card-method-tab-0\" data-card-method=\"Core|speech|/v1/audio/speech|gemini-3.1-flash-tts-preview\">Synthèse vocale</button></div><div id=\"card-method-content\" role=\"tabpanel\" aria-labelledby=\"card-method-tab-0\"><section class=\"card-section\" data-card-section=\"overview\"><h3 tabindex=\"-1\">Pour commencer</h3><p class=\"mdesc-full\">Un modèle vocal de Google pour lire du texte à voix haute, avec un contrôle du style narratif et des balises audio expressives.</p><dl class=\"card-io\" data-card-io><div><dt>Entrées acceptées</dt><dd>Texte</dd></div><div><dt>Résultats</dt><dd>speech</dd></div></dl><details class=\"card-about\"><summary>À propos du modèle</summary><p class=\"note-s\" data-model-method-boundary>Cette description présente les capacités du modèle. Les entrées, sorties et options disponibles dans Ailoot pour la méthode sélectionnée figurent ci-dessous.</p><div class=\"mabout\" id=\"m-about\"><p>Gemini 3.1 Flash TTS Preview transforme le texte en parole. Il vise une voix naturelle, avec un contrôle de la narration par des consignes textuelles. Le style de prononciation peut être défini avec les instructions vocales, tandis que les balises audio expressives aident à obtenir l’interprétation souhaitée.</p><h4>Du texte à l’audio</h4><p>L’entrée de ce modèle est du <strong>texte</strong>, et sa sortie un <strong>enregistrement audio</strong>. Le volume maximal est de <strong>8 192 jetons</strong> en entrée et de <strong>16 384 jetons</strong> en sortie. Il est conçu pour synthétiser la parole à partir d’un texte préparé ; ce n’est pas un modèle habituel de réponse textuelle ou de transcription d’un enregistrement fourni.</p><p>Une lecture par une seule voix et des dialogues avec plusieurs locuteurs sont prévus. Le contrôle de la prononciation repose sur les instructions : on peut décrire le style de lecture et l’expressivité des répliques. Pour les tâches vocales répétitives, le fabricant indique la génération par lots.</p><h4>Le format du résultat et la spécialisation</h4><p>Le format brut d’une réponse habituelle est du <strong>PCM sans en-tête WAV</strong>. Cette particularité est importante pour cette version préliminaire : les octets renvoyés ne doivent pas être considérés automatiquement comme un fichier WAV prêt à l’emploi.</p><p>La fiche du modèle n’annonce pas la mise en cache du contexte, l’exécution de code, la recherche dans des fichiers, les appels de fonctions, l’ancrage dans la recherche, Google Maps, la génération d’images, les réponses textuelles structurées, Thinking ou la lecture du contenu des adresses web. La synthèse vocale est sa tâche de sortie spécialisée ; les capacités des modèles textuels ne s’y transposent pas.</p><h4>Une version préliminaire</h4><p><code>gemini-3.1-flash-tts-preview</code> fait partie des versions vocales préliminaires antérieures. Ses modes de contrôle de la voix et son format audio doivent être considérés séparément de ceux des modèles TTS suivants. Cette version n’annonce ni la création d’une nouvelle identité vocale ni la reproduction d’une voix à partir d’un exemple ; sa fiche n’indique pas le nombre exact de langues prises en charge.</p><p>Les fonctions décrites concernent le modèle lui-même. La façon précise de transmettre le texte, les réglages des locuteurs et de recevoir le fichier audio dépend de la méthode vocale prise en charge.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Disponible dans Ailoot · entrées et méthodes</h3><details class=\"card-method\" open><summary><b>Ailoot · Synthèse vocale</b> <code>POST /v1/audio/speech</code></summary><dl class=\"method-capabilities\"><div><dt>Entrée</dt><dd><code>text</code></dd></div><div><dt>Sortie</dt><dd><code>speech</code></dd></div><div><dt>Format de sortie</dt><dd>octets audio natifs ou liens vers les ressources dans le JSON</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Champ</th><th>Type</th><th>Exigence</th><th>Valeurs et limites</th><th>Par défaut</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Obligatoire</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>gemini-3.1-flash-tts-preview</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">input</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Obligatoire</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>Longueur minimale: 1</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">voice</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Facultatif</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>Kore</div></td><td data-cell-label=\"Par défaut\" data-default=\"known\"><span class=\"card-cell-label\">Par défaut</span>Kore</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">response_format</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Facultatif</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>, wav, json</div></td><td data-cell-label=\"Par défaut\" data-default=\"known\"><span class=\"card-cell-label\">Par défaut</span></td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">stream_format</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Facultatif</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>audio</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>Combinaisons d’éléments d’entrée</summary><p class=\"note-s\"><b>text_to_speech</b> · Obligatoire : input</p></details><details class=\"note-s\" data-method-contract><summary>Paramètres et cycle de vie de la méthode</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Paramètre</th><th>Contrat</th></tr></thead><tbody><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>material_types</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>text</td></tr><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>required</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>null</td></tr><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>optional_controls</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>null</td></tr></tbody></table></div><p>Cycle de vie : <code>synchronous_result_then_owned_library</code></p><p class=\"note-s\"><code>GET /v1/media/tasks/{task_id}</code> · task_id effectivement renvoyé ou enregistrement de la bibliothèque multimédia</p><p class=\"note-s\"><code>GET /v1/media/assets/{asset_id}/content</code></p><p class=\"note-s\"><code>GET /v1/media/assets</code></p><p class=\"note-s\"><code>GET /v1/media/assets/{asset_id}</code></p><p class=\"note-s\">Les structures des méthodes et les ID sont exacts ; la capacité du fournisseur est distincte de l’admission des requêtes.</p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Tarifs</h3><h4>Tarifs des méthodes Ailoot</h4><section class=\"meth\" data-route=\"Core\"><header><b><span class=\"alias\">Ailoot</span> Synthèse vocale</b><code>POST /v1/audio/speech</code></header><dl><div><dt>Entrée</dt><dd>0,001 USD <em>/ 1K</em></dd></div><div><dt>Sortie</dt><dd>0,02 USD <em>/ 1K</em></dd></div></dl></section><p class=\"note-s\">Ailoot réserve un montant estimé avant une requête. Après le résultat, le montant final est débité selon l’utilisation mesurée. Pour le streaming, le montant final à débiter est calculé à partir du relevé final d’utilisation. <a href=\"/docs/fr-ca/billing/reserve/\">Fonctionnement de la réservation et du débit →</a></p></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Exemples de requêtes</h3><h4>Ailoot · Synthèse vocale</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Variantes du code\"><button class=\"cg-tab\" id=\"model-code-283-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-283-panel-0\" aria-selected=\"true\" tabindex=\"0\">Exemple de synthèse vocale</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Copier le code\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-283-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-283-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_TEXT_FILE:?Set your actual UTF-8 narration script}&quot;\nexport AILOOT_TEXT_FILE\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nimport json,os\nfrom pathlib import Path\np=json.loads(&#39;{&quot;model&quot;: &quot;gemini-3.1-flash-tts-preview&quot;, &quot;input&quot;: &quot;&quot;}&#39;)\nf=Path(os.environ[&quot;AILOOT_TEXT_FILE&quot;])\nif not f.is_file():raise SystemExit(&quot;Choose your actual UTF-8 source material&quot;)\ntext=f.read_text(encoding=&quot;utf-8&quot;)\nif not text.strip():raise SystemExit(&quot;Source material must contain text&quot;)\np[&quot;input&quot;]=text\nPath(&quot;request.json&quot;).write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o speech.wav\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">Recevoir et enregistrer les résultats</h3><h4>Ailoot · Synthèse vocale</h4><p class=\"note-s\">octets audio natifs ou liens vers les ressources dans le JSON</p><ul class=\"card-result-paths\"><li><code>GET /v1/media/tasks/{task_id}</code></li><li><code>GET /v1/media/assets/{asset_id}/content</code></li><li><code>GET /v1/media/assets</code></li><li><code>GET /v1/media/assets/{asset_id}</code></li></ul><div class=\"card-result-process\" data-all-results><h5>Conserver tous les résultats terminés</h5><p class=\"note-s\">Conservez chaque réponse, fichier et partie de contenu renvoyés dans leur intégralité.</p><p class=\"note-s\">Une sortie unique utilise par défaut les octets audio natifs avec le Content-Type réel; avec response_format=json ou plusieurs sorties, tous les liens appartenant à votre compte sont retournés. Aucune conversion demandée en MP3/Opus/AAC/FLAC/PCM ni diffusion SSE.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Si la réponse d’origine doit être vérifiée</h5><p class=\"note-s\">Conservez l’operation_id/X-Client-Request-ID d’origine pour le rapprochement sans nouvelle soumission ; aucune route dédiée à l’interrogation du statut audio.</p></div><details class=\"card-about\" data-output-fields><summary>Champs de la réponse</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Champ</th><th>Type</th></tr></thead><tbody><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">binary native audio</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>bytes</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">response_id</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">actual_count</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>integer</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">data[]</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>owned audio asset link</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>Erreurs et étapes suivantes</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>Réponse</th><th>Condition</th><th>Étape suivante</th></tr></thead><tbody><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>Champs obligatoires, représentation des éléments fournis ou valeur de paramètre invalides</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span>Corrigez les champs indiqués avant une nouvelle requête de création.</td></tr><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span><code>server_error</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>La réponse renvoyée indique que l’opération ou le résultat nécessite une vérification</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span>Conservez l’identifiant d’opération/de tâche initialement renvoyé, les en-têtes de la requête et la réponse ; poursuivez les lectures prises en charge de cette opération d’origine. Ne soumettez pas à nouveau la requête de création.</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Alias</h3><h4>Alias du modèle</h4><p class=\"note-s\"><span data-model-alias-route=\"Core\"><b>Ailoot</b> <a href=\"#m=gemini-3.1-flash-tts-preview&amp;route=Core&amp;caller=gemini-3.1-flash-tts-preview&amp;fmt=speech\"><code>gemini-3.1-flash-tts-preview</code></a></span></p><h4>Alias des chemins de méthode</h4><p class=\"note-s\">Utilisez les chemins de méthode indiqués ci-dessus.</p><h4>ID d’appel associés</h4><p class=\"note-s\"><a href=\"#m=gemini-3.1-flash-tts-preview&amp;route=Core&amp;caller=gemini-3.1-flash-tts-preview&amp;fmt=speech\"><code>gemini-3.1-flash-tts-preview</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "gemini-3.1-flash-tts-preview",
        "fmt": "speech",
        "http": "POST",
        "path": "/v1/audio/speech",
        "request_model_id": "gemini-3.1-flash-tts-preview",
        "route_label": "Core"
      },
      "method_key": "Core|speech|/v1/audio/speech|gemini-3.1-flash-tts-preview",
      "ordinal": 0,
      "rawMethod": {
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "cache_write_5m": null,
        "conditional_meter": null,
        "contract": {
          "data": {
            "all_results": "A single output defaults to native audio bytes with actualContent-Type; response_format=json or multiple outputs returns all owned links. No requested MP3/Opus/AAC/FLAC/PCM conversion or SSE.",
            "errors": [
              {
                "code": null,
                "condition": "Champs obligatoires, représentation des éléments fournis ou valeur de paramètre invalides",
                "http_status": 400,
                "recovery": "Corrigez les champs indiqués avant une nouvelle requête de création.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "La réponse renvoyée indique que l’opération ou le résultat nécessite une vérification",
                "http_status": null,
                "recovery": "Conservez l’identifiant d’opération/de tâche initialement renvoyé, les en-têtes de la requête et la réponse ; poursuivez les lectures prises en charge de cette opération d’origine. Ne soumettez pas à nouveau la requête de création.",
                "type": "server_error"
              }
            ],
            "hints": [],
            "ignored_fields": [],
            "lifecycle": {
              "all_results": "Follow everyactualreturnedoutputandownedasset; no result is discardedbecauseindex0orcontent_urlalreadyexists.",
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}/content",
                  "url_source": "exact returned signed URL; never construct token"
                }
              ],
              "mode": "synchronous_result_then_owned_library",
              "operation_id_is_not_task_id": true,
              "status": [
                {
                  "http": "GET",
                  "id_source": "actual returned task_id or media library record",
                  "path": "/v1/media/tasks/{task_id}"
                }
              ],
              "unknown": "Conservez l’operation_id/X-Client-Request-ID d’origine pour le rapprochement sans nouvelle soumission ; aucune route dédiée à l’interrogation du statut audio."
            },
            "material_combinations": [
              {
                "content_type": "application/json",
                "mode": "text_to_speech",
                "required": [
                  "input"
                ]
              }
            ],
            "media_library": {
              "asset": {
                "fields": [
                  {
                    "description": null,
                    "name": "asset_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "task_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "output_key",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "family",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "model",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "method",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "status",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "content_type",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "sha256",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "size_bytes",
                    "type": "integer"
                  },
                  {
                    "description": null,
                    "name": "content_url",
                    "type": "string"
                  }
                ],
                "http": "GET",
                "id_source": "actual returned asset_id",
                "path": "/v1/media/assets/{asset_id}"
              },
              "content": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "range_header_supported": true,
                "url_source": "Use exact returned signed content_url including its token; do not construct a token."
              },
              "expired_link": {
                "code": "link_expired",
                "http_status": 404,
                "recovery": "Read the asset again to obtain its refreshed signed content_url, then fetch that URL. Do not regenerate."
              },
              "list": {
                "all_pages": "Follow every returned next_cursor, then select records by their actual task_id/output_key.",
                "http": "GET",
                "output_fields": [
                  {
                    "description": null,
                    "name": "object",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "data",
                    "type": "asset[]"
                  },
                  {
                    "description": null,
                    "name": "next_cursor",
                    "type": "string|null"
                  }
                ],
                "parameters": [
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "family",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "cursor",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": 20,
                    "default_known": true,
                    "enum": null,
                    "enum_known": false,
                    "maximum": 100,
                    "minimum": 1,
                    "name": "limit",
                    "required": false,
                    "type": "integer"
                  }
                ],
                "path": "/v1/media/assets"
              },
              "revoke": {
                "http": "DELETE",
                "meaning": "Revokes/deletes the existing owned file; this is not generation cancellation.",
                "path": "/v1/media/assets/{asset_id}",
                "pending_status": "revoking",
                "success_statuses": [
                  202,
                  204
                ]
              },
              "task": {
                "http": "GET",
                "id_source": "actual returned task_id or media library record; operation_id is not task_id",
                "path": "/v1/media/tasks/{task_id}"
              }
            },
            "operation_modes": [
              "text_to_speech"
            ],
            "outputs": {
              "all_results": "Une sortie unique utilise par défaut les octets audio natifs avec le Content-Type réel; avec response_format=json ou plusieurs sorties, tous les liens appartenant à votre compte sont retournés. Aucune conversion demandée en MP3/Opus/AAC/FLAC/PCM ni diffusion SSE.",
              "family": "audio",
              "fields": [
                {
                  "description": null,
                  "name": "binary native audio",
                  "type": "bytes"
                },
                {
                  "description": null,
                  "name": "model",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "response_id",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "actual_count",
                  "type": "integer"
                },
                {
                  "description": null,
                  "name": "data[]",
                  "type": "owned audio asset link"
                }
              ],
              "format": "octets audio natifs ou liens vers les ressources dans le JSON"
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "gemini-3.1-flash-tts-preview"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "min_length": 1,
                "name": "input",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": "Kore",
                "default_known": true,
                "enum": [
                  "Kore"
                ],
                "enum_known": true,
                "name": "voice",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": "",
                "default_known": true,
                "enum": [
                  "",
                  "wav",
                  "json"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "audio"
                ],
                "enum_known": true,
                "name": "stream_format",
                "required": false,
                "type": "string"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": [
              "SSE",
              "mp3/opus/aac/flac/pcm requestedtranscoding"
            ]
          },
          "hints": [
            "Les structures des méthodes et les ID sont exacts ; la capacité du fournisseur est distincte de l’admission des requêtes."
          ],
          "input": {
            "material_types": [
              "text"
            ],
            "optional_controls": null,
            "required": null
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "task_id effectivement renvoyé ou enregistrement de la bibliothèque multimédia",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "Retain original operation_id/X-Client-Request-ID for reconciliation without resubmission; no dedicated audio poll route."
          },
          "method": {
            "http": "POST",
            "path": "/v1/audio/speech"
          },
          "operation_modes": [
            "audio_speech"
          ],
          "output": {
            "family": [
              "speech"
            ],
            "format": null,
            "multioutputs": "retain every actual response output"
          }
        },
        "ctx": null,
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_TEXT_FILE:?Set your actual UTF-8 narration script}\"\nexport AILOOT_TEXT_FILE\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"gemini-3.1-flash-tts-preview\", \"input\": \"\"}')\nf=Path(os.environ[\"AILOOT_TEXT_FILE\"])\nif not f.is_file():raise SystemExit(\"Choose your actual UTF-8 source material\")\ntext=f.read_text(encoding=\"utf-8\")\nif not text.strip():raise SystemExit(\"Source material must contain text\")\np[\"input\"]=text\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o speech.wav\n",
            "label": "Synthesize your actual script",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "speech",
        "http": "POST",
        "img_in": null,
        "img_out": null,
        "in": 1,
        "input": [
          "text"
        ],
        "label": "Synthèse vocale",
        "max_out": null,
        "max_tool_calls": null,
        "out": 20,
        "output": [
          "speech"
        ],
        "path": "/v1/audio/speech",
        "pricing_profiles": [
          {
            "dimensions": {},
            "label": "Core",
            "units": [
              {
                "amount": 1,
                "amount_unit": "usd_per_million_tokens",
                "key": "in",
                "label": "Input",
                "side": "in"
              },
              {
                "amount": 20,
                "amount_unit": "usd_per_million_tokens",
                "key": "out",
                "label": "Output",
                "side": "out"
              }
            ]
          }
        ],
        "request_model_id": "gemini-3.1-flash-tts-preview",
        "route_label": "Core",
        "status_reads": [],
        "tiers": [],
        "tool_prices": null,
        "unit": "token",
        "units": []
      }
    }
  ],
  "model_id": "gemini-3.1-flash-tts-preview",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "bb801409e9c9110c98df86566efb07c7c08d4de540cdf4c76b1868e2c31174e7",
    "input_html_sha256": "7064d2109d0166e57e0e6a6605398bda36a1330b95c39af1e131cda8e96a4b14",
    "private_audit_sha256": "b574f61d1cffcacb1e39943c65bd4c91c9ca05ae208e4e942e9f016463ad460f",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/fr-ca/gemini-3-1-flash-tts-preview/",
    "description": "Un modèle vocal de Google pour lire du texte à voix haute, avec un contrôle du style narratif et des balises audio expressives.",
    "locale": "fr-ca",
    "md_url": "https://ailoot.ai/models/fr-ca/gemini-3-1-flash-tts-preview/index.md",
    "title": "Gemini 3.1 Flash Tts Preview — Ailoot",
    "url": "https://ailoot.ai/models/fr-ca/gemini-3-1-flash-tts-preview/"
  },
  "rawModel": {
    "about": "Gemini 3.1 Flash TTS Preview transforme le texte en parole. Il vise une voix naturelle, avec un contrôle de la narration par des consignes textuelles. Le style de prononciation peut être défini avec les instructions vocales, tandis que les balises audio expressives aident à obtenir l’interprétation souhaitée.\n\n### Du texte à l’audio\n\nL’entrée de ce modèle est du **texte**, et sa sortie un **enregistrement audio**. Le volume maximal est de **8 192 jetons** en entrée et de **16 384 jetons** en sortie. Il est conçu pour synthétiser la parole à partir d’un texte préparé ; ce n’est pas un modèle habituel de réponse textuelle ou de transcription d’un enregistrement fourni.\n\nUne lecture par une seule voix et des dialogues avec plusieurs locuteurs sont prévus. Le contrôle de la prononciation repose sur les instructions : on peut décrire le style de lecture et l’expressivité des répliques. Pour les tâches vocales répétitives, le fabricant indique la génération par lots.\n\n### Le format du résultat et la spécialisation\n\nLe format brut d’une réponse habituelle est du **PCM sans en-tête WAV**. Cette particularité est importante pour cette version préliminaire : les octets renvoyés ne doivent pas être considérés automatiquement comme un fichier WAV prêt à l’emploi.\n\nLa fiche du modèle n’annonce pas la mise en cache du contexte, l’exécution de code, la recherche dans des fichiers, les appels de fonctions, l’ancrage dans la recherche, Google Maps, la génération d’images, les réponses textuelles structurées, Thinking ou la lecture du contenu des adresses web. La synthèse vocale est sa tâche de sortie spécialisée ; les capacités des modèles textuels ne s’y transposent pas.\n\n### Une version préliminaire\n\n`gemini-3.1-flash-tts-preview` fait partie des versions vocales préliminaires antérieures. Ses modes de contrôle de la voix et son format audio doivent être considérés séparément de ceux des modèles TTS suivants. Cette version n’annonce ni la création d’une nouvelle identité vocale ni la reproduction d’une voix à partir d’un exemple ; sa fiche n’indique pas le nombre exact de langues prises en charge.\n\nLes fonctions décrites concernent le modèle lui-même. La façon précise de transmettre le texte, les réglages des locuteurs et de recevoir le fichier audio dépend de la méthode vocale prise en charge.",
    "alias_of": null,
    "aliases": [],
    "author": "Google",
    "ctx": null,
    "formats": [
      "speech"
    ],
    "id": "gemini-3.1-flash-tts-preview",
    "input": [
      "text"
    ],
    "kind": "speech",
    "max_out": null,
    "methods": [
      {
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "cache_write_5m": null,
        "conditional_meter": null,
        "contract": {
          "data": {
            "all_results": "A single output defaults to native audio bytes with actualContent-Type; response_format=json or multiple outputs returns all owned links. No requested MP3/Opus/AAC/FLAC/PCM conversion or SSE.",
            "errors": [
              {
                "code": null,
                "condition": "Champs obligatoires, représentation des éléments fournis ou valeur de paramètre invalides",
                "http_status": 400,
                "recovery": "Corrigez les champs indiqués avant une nouvelle requête de création.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "La réponse renvoyée indique que l’opération ou le résultat nécessite une vérification",
                "http_status": null,
                "recovery": "Conservez l’identifiant d’opération/de tâche initialement renvoyé, les en-têtes de la requête et la réponse ; poursuivez les lectures prises en charge de cette opération d’origine. Ne soumettez pas à nouveau la requête de création.",
                "type": "server_error"
              }
            ],
            "hints": [],
            "ignored_fields": [],
            "lifecycle": {
              "all_results": "Follow everyactualreturnedoutputandownedasset; no result is discardedbecauseindex0orcontent_urlalreadyexists.",
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}/content",
                  "url_source": "exact returned signed URL; never construct token"
                }
              ],
              "mode": "synchronous_result_then_owned_library",
              "operation_id_is_not_task_id": true,
              "status": [
                {
                  "http": "GET",
                  "id_source": "actual returned task_id or media library record",
                  "path": "/v1/media/tasks/{task_id}"
                }
              ],
              "unknown": "Conservez l’operation_id/X-Client-Request-ID d’origine pour le rapprochement sans nouvelle soumission ; aucune route dédiée à l’interrogation du statut audio."
            },
            "material_combinations": [
              {
                "content_type": "application/json",
                "mode": "text_to_speech",
                "required": [
                  "input"
                ]
              }
            ],
            "media_library": {
              "asset": {
                "fields": [
                  {
                    "description": null,
                    "name": "asset_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "task_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "output_key",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "family",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "model",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "method",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "status",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "content_type",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "sha256",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "size_bytes",
                    "type": "integer"
                  },
                  {
                    "description": null,
                    "name": "content_url",
                    "type": "string"
                  }
                ],
                "http": "GET",
                "id_source": "actual returned asset_id",
                "path": "/v1/media/assets/{asset_id}"
              },
              "content": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "range_header_supported": true,
                "url_source": "Use exact returned signed content_url including its token; do not construct a token."
              },
              "expired_link": {
                "code": "link_expired",
                "http_status": 404,
                "recovery": "Read the asset again to obtain its refreshed signed content_url, then fetch that URL. Do not regenerate."
              },
              "list": {
                "all_pages": "Follow every returned next_cursor, then select records by their actual task_id/output_key.",
                "http": "GET",
                "output_fields": [
                  {
                    "description": null,
                    "name": "object",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "data",
                    "type": "asset[]"
                  },
                  {
                    "description": null,
                    "name": "next_cursor",
                    "type": "string|null"
                  }
                ],
                "parameters": [
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "family",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "cursor",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": 20,
                    "default_known": true,
                    "enum": null,
                    "enum_known": false,
                    "maximum": 100,
                    "minimum": 1,
                    "name": "limit",
                    "required": false,
                    "type": "integer"
                  }
                ],
                "path": "/v1/media/assets"
              },
              "revoke": {
                "http": "DELETE",
                "meaning": "Revokes/deletes the existing owned file; this is not generation cancellation.",
                "path": "/v1/media/assets/{asset_id}",
                "pending_status": "revoking",
                "success_statuses": [
                  202,
                  204
                ]
              },
              "task": {
                "http": "GET",
                "id_source": "actual returned task_id or media library record; operation_id is not task_id",
                "path": "/v1/media/tasks/{task_id}"
              }
            },
            "operation_modes": [
              "text_to_speech"
            ],
            "outputs": {
              "all_results": "Une sortie unique utilise par défaut les octets audio natifs avec le Content-Type réel; avec response_format=json ou plusieurs sorties, tous les liens appartenant à votre compte sont retournés. Aucune conversion demandée en MP3/Opus/AAC/FLAC/PCM ni diffusion SSE.",
              "family": "audio",
              "fields": [
                {
                  "description": null,
                  "name": "binary native audio",
                  "type": "bytes"
                },
                {
                  "description": null,
                  "name": "model",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "response_id",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "actual_count",
                  "type": "integer"
                },
                {
                  "description": null,
                  "name": "data[]",
                  "type": "owned audio asset link"
                }
              ],
              "format": "octets audio natifs ou liens vers les ressources dans le JSON"
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "gemini-3.1-flash-tts-preview"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "min_length": 1,
                "name": "input",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": "Kore",
                "default_known": true,
                "enum": [
                  "Kore"
                ],
                "enum_known": true,
                "name": "voice",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": "",
                "default_known": true,
                "enum": [
                  "",
                  "wav",
                  "json"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "audio"
                ],
                "enum_known": true,
                "name": "stream_format",
                "required": false,
                "type": "string"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": [
              "SSE",
              "mp3/opus/aac/flac/pcm requestedtranscoding"
            ]
          },
          "hints": [
            "Les structures des méthodes et les ID sont exacts ; la capacité du fournisseur est distincte de l’admission des requêtes."
          ],
          "input": {
            "material_types": [
              "text"
            ],
            "optional_controls": null,
            "required": null
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "task_id effectivement renvoyé ou enregistrement de la bibliothèque multimédia",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "Retain original operation_id/X-Client-Request-ID for reconciliation without resubmission; no dedicated audio poll route."
          },
          "method": {
            "http": "POST",
            "path": "/v1/audio/speech"
          },
          "operation_modes": [
            "audio_speech"
          ],
          "output": {
            "family": [
              "speech"
            ],
            "format": null,
            "multioutputs": "retain every actual response output"
          }
        },
        "ctx": null,
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_TEXT_FILE:?Set your actual UTF-8 narration script}\"\nexport AILOOT_TEXT_FILE\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"gemini-3.1-flash-tts-preview\", \"input\": \"\"}')\nf=Path(os.environ[\"AILOOT_TEXT_FILE\"])\nif not f.is_file():raise SystemExit(\"Choose your actual UTF-8 source material\")\ntext=f.read_text(encoding=\"utf-8\")\nif not text.strip():raise SystemExit(\"Source material must contain text\")\np[\"input\"]=text\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o speech.wav\n",
            "label": "Synthesize your actual script",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "speech",
        "http": "POST",
        "img_in": null,
        "img_out": null,
        "in": 1,
        "input": [
          "text"
        ],
        "label": "Synthèse vocale",
        "max_out": null,
        "max_tool_calls": null,
        "out": 20,
        "output": [
          "speech"
        ],
        "path": "/v1/audio/speech",
        "pricing_profiles": [
          {
            "dimensions": {},
            "label": "Core",
            "units": [
              {
                "amount": 1,
                "amount_unit": "usd_per_million_tokens",
                "key": "in",
                "label": "Input",
                "side": "in"
              },
              {
                "amount": 20,
                "amount_unit": "usd_per_million_tokens",
                "key": "out",
                "label": "Output",
                "side": "out"
              }
            ]
          }
        ],
        "request_model_id": "gemini-3.1-flash-tts-preview",
        "route_label": "Core",
        "status_reads": [],
        "tiers": [],
        "tool_prices": null,
        "unit": "token",
        "units": []
      }
    ],
    "model_aliases": [
      {
        "canonical_model_id": "gemini-3.1-flash-tts-preview",
        "request_model_id": "gemini-3.1-flash-tts-preview",
        "route_label": "Core"
      }
    ],
    "name": "Gemini 3.1 Flash Tts Preview",
    "price": {
      "in": 1,
      "in_label": null,
      "out": 20,
      "out_label": null,
      "sort_in": 1,
      "sort_out": 20,
      "varies": false
    },
    "short": "Un modèle vocal de Google pour lire du texte à voix haute, avec un contrôle du style narratif et des balises audio expressives."
  },
  "renderer_schema": {
    "method_order": "Original DTO methods order; every exact route/format/path/caller survives.",
    "prices": "Original public DTO fields and original native display HTML; no flattened or normalized offers."
  },
  "representation": "exact-public-dto-and-native-renderer-html",
  "representationNotes": {
    "current_reference": {
      "about_json_pointer": "/aboutHtml",
      "methods": [
        {
          "contract_json_pointer": "/methods/0/rawMethod/contract",
          "html_json_pointer": "/methods/0/html",
          "method_ordinal": 0
        }
      ],
      "role": "current-semantic-reference"
    },
    "raw_input": {
      "examples_role": "historical-input-not-current-ready-examples",
      "json_pointers": [
        "/rawModel",
        "/methods/0/rawMethod"
      ],
      "role": "historical-owner-input"
    },
    "schema": "ailoot-native-model-representations-v1"
  },
  "schema": "ailoot-static-model-facts-v1",
  "schema_version": 1,
  "shortText": "Un modèle vocal de Google pour lire du texte à voix haute, avec un contrôle du style narratif et des balises audio expressives.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "8bdb91f5ead30e30ee141999a093e9b61c497ac958f85f0b8917b4d83150ffbf",
    "renderer_sha256": "98cb81b9c4ef4923c22e586170e7cdf67056351148a1666fb03dd6a4a26716a3"
  },
  "sourceRevision": "5e1bc59ee6cac5d75dd25d2dc3c479cafcaa48cf6e55e1d7829b728a2ffa5183"
}
