Как создать конечную точку expressjs, которая использует azure tts для отправки аудио в веб-приложение?

#azure #rest #express #azure-cognitive-services #arraybuffer

Вопрос:

Я пытаюсь выяснить, как предоставить экспресс-маршрут (т. Е.: Получить api/word/:some_word), который использует пакет sdk azure tts (microsoft-cognitiveservices-speech-sdk) для создания аудиоверсии some_word (в любом формате, воспроизводимом браузером), и res.send () с полученным звуком, чтобы интерфейсное веб-приложение javascript могло использовать api для воспроизведения звукового произношения слова.

У меня «работает» azure sdk — он создает «ArrayBuffer» внутри моего кода expressjs. Однако я не знаю, как отправить данные в этом буфере массива на внешний интерфейс. Я следовал инструкциям здесь: https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/get-started-text-to-speech?tabs=import,windowsinstallamp;pivots=programming-language-javascript#get-result-as-an-in-memory-stream

Другим способом сформулировать мой вопрос было бы: «В express у меня есть ArrayBuffer, содержимое которого представляет собой файл .mp3/.ogg/.wav. Как мне отправить этот файл экспресс-почтой? Нужно ли мне конвертировать его в какой-то другой тип данных(например, строку в кодировке Base64? Буфер?) Нужно ли мне устанавливать какие-то конкретные заголовки ответов?

Ответ №1:

Я, наконец, понял это через несколько секунд после того, как задал этот вопрос 😂

Я довольно новичок в этой области, поэтому буду признателен за любые указания о том, как это можно улучшить.

 app.get('/api/tts/word/:word', async (req, res) => {
  const word = req.params.word;
  const subscriptionKey = azureKey;
  const serviceRegion = 'australiaeast';

  const speechConfig = sdk.SpeechConfig.fromSubscription(
    subscriptionKey as string,
    serviceRegion
  );
  
  speechConfig.speechSynthesisOutputFormat =
    SpeechSynthesisOutputFormat.Ogg24Khz16BitMonoOpus;

  const synthesizer = new sdk.SpeechSynthesizer(speechConfig);

  synthesizer.speakSsmlAsync(
    `
    <speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
       xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="zh-CN">
    <voice name="zh-CN-XiaoxiaoNeural">
            ${word}
    </voice>
    </speak>
    `,
    (resp) => {
      const audio = resp.audioData;
      synthesizer.close();
      const buffer = Buffer.from(audio);
      res.set('Content-Type', 'audio/ogg; codecs=opus; rate=24000');
      res.send(buffer);
    }
  );
});