Realize a conversão de texto em fala a partir de uma página da web usando o AivisSpeech.

この記事は約10分で読めます。
スポンサーリンク

Coisas que eu quero fazer

Na página seguinte, utilizei o SpeechSynthesis, uma função básica de JavaScript, para realizar a conversão de texto em fala, mas a pronúncia não ficou muito boa.

Portanto, usaremos o AivisSpeech, que possui uma pronúncia mais clara, para ler o texto em voz alta.

premissa

Desta vez, trata- se de uma aplicação web local (http://localhost/Isso pressupõe acesso de[a specific location]O caminho File:// não pode ser usado. Usaremos[a specific example]Por exemplo, isso se deve a um problema de política CORS. Parece que o acesso de outros PCs pode ser possível alterando as configurações, mas eu não testei isso.

スポンサーリンク

Ambiente

AivisSpeech Engine versão 1.0.0

スポンサーリンク

Iniciando o AivisSpeech-Engine (servidor)

Caso ainda não tenha instalado o AivisSpeech, consulte a página seguinte para obter instruções sobre como instalá-lo.

Inicie o servidor executando o seguinte comando na linha de comando.

C:\Program Files\AivisSpeech\AivisSpeech-Engine¥run.exe

Se você realizar uma instalação específica para o usuário, o caminho será o seguinte:

\AppData\Local\Programs\AivisSpeech\AivisSpeech-Engine\run.exe

O download inicial levará algum tempo, pois o modelo será baixado. (Mesmo que você já tenha executado o AivisSpeech antes, se esta for a primeira vez que você está executando o AivisSpeech-Engine diretamente, um download ocorrerá.)

[2025/01/27 09:02:52] INFO:     Started server process [19536]
[2025/01/27 09:02:52] INFO:     Waiting for application startup.
[2025/01/27 09:02:52] INFO:     Application startup complete.
[2025/01/27 09:02:52] INFO:     Uvicorn running on http://localhost:10101 (Press CTRL+C to quit)

Caso o registro acima seja exibido, utilize um navegador como o Chrome.http://localhost:10101Abra-o.

Se a seguinte mensagem for exibida, o servidor está funcionando corretamente.

スポンサーリンク

Obtenção do ID do palestrante

Acesse o seguinte URL.

http://localhost:10101/speakers

Vou verificar a opção ‘Formatar Impressão’ para facilitar a visualização.

Anote o ID da configuração que deseja usar (observe que este não é o speaker_uuid).

Aqui, usaremos 888753760 para usar a versão normal de Anneli.

スポンサーリンク

código

Criaremos arquivos HTML e JS. No entanto, como as requisições para o AivisSpeech-Engine a partir de File:// falharão, você precisará iniciar um servidor local usando Node.js ou LiveServer.

Veja abaixo as instruções de como usar o LiveServer.

index.html

<!doctype html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <title>TEST</title>
</head>

<body>
  <input type="text" id="text" class="txt" value="読み上げます" required><br><br>
  <input type="button" value="読み上げ" id="execute"><br><br>
  <script type="module" src="/src/main.js"></script>
</body>

</html>

Em HTML, criei uma caixa de texto para ser lida em voz alta e um botão para leitura em voz alta.

main.js(Substitua 888753760 no código pelo valor obtido ao recuperar o SpeakerID.)

document.getElementById("execute").onclick = function (event) {
  readText(document.getElementById("text").value)
};

function readText(text) {
  const xhr = new XMLHttpRequest();
  const url = 'http://localhost:10101/audio_query?speaker=888753760&text=' + text;
  xhr.open("POST", url, false);
  xhr.send();
  const res_str = xhr.responseText;

  const xhr_synth = new XMLHttpRequest();
  const url_synth = 'http://localhost:10101/synthesis?speaker=888753760';
  xhr_synth.open("POST", url_synth);
  xhr_synth.setRequestHeader("Content-Type", "application/json");
  xhr_synth.responseType = "arraybuffer";
  xhr_synth.onreadystatechange = async () => {
    if (xhr_synth.readyState === XMLHttpRequest.DONE && xhr_synth.status === 200) {
      const context = new AudioContext();
      const audioBuffer = await (new Promise((res, rej) => {
        context.decodeAudioData(xhr_synth.response, res, rej);
      }));
      const source = context.createBufferSource();
      source.buffer = audioBuffer;
      source.connect(context.destination);
      source.start(0);
    }
  }
  xhr_synth.send(res_str);
}

O fluxo geral é o seguinte:

As informações a serem lidas em voz alta são enviadas ao servidor por meio de uma solicitação POST para http://localhost:10101/audio_query.

  const xhr = new XMLHttpRequest();
  const url = 'http://localhost:10101/audio_query?speaker=888753760&text=' + text;
  xhr.open("POST", url, false);
  xhr.send();
  const res_str = xhr.responseText;

Utilizando o JSON obtido da solicitação acima, um arquivo WAV será criado enviando uma solicitação POST para http://localhost:10101/synthesis.

  const xhr_synth = new XMLHttpRequest();
  const url_synth = 'http://localhost:10101/synthesis?speaker=888753760';
  xhr_synth.open("POST", url_synth);
  xhr_synth.setRequestHeader("Content-Type", "application/json");
  xhr_synth.responseType = "arraybuffer";
  xhr_synth.send(res_str);

Após o término do download do arquivo WAV, reproduza-o usando o seguinte código.

      const context = new AudioContext();
      const audioBuffer = await (new Promise((res, rej) => {
        context.decodeAudioData(xhr_synth.response, res, rej);
      }));
      const source = context.createBufferSource();
      source.buffer = audioBuffer;
      source.connect(context.destination);
      source.start(0);
    }
スポンサーリンク

Resultado

Consegui usar o AivisSpeech para que o texto fosse lido em voz alta.

スポンサーリンク

Sites que utilizei como referência

GitHub - Aivis-Project/AivisSpeech-Engine: AivisSpeech Engine: AI Voice Imitation System - Text to Speech Engine
AivisSpeech Engine: AI Voice Imitation System - Text to Speech Engine - Aivis-Project/AivisSpeech-Engine

コメント

タイトルとURLをコピーしました