首页 > 解决方案 > 如何创建使用 azure tts 将音频发送到 Web 应用程序的 expressjs 端点?

问题描述

我试图弄清楚如何公开使用 azure tts sdk (microsoft-cognitiveservices-speech-sdk) 生成 some_word 的音频版本的快速路由(即:获取 api/word/:some_word)(以任何可播放的格式通过浏览器),并且 res.send() 是生成的音频,以便前端 javascript Web 应用程序可以使用 api 来播放单词的音频发音。

我有 azure sdk 'working' - 它在我的 expressjs 代码中创建一个'ArrayBuffer'。但是,我不知道如何将这个 ArrayBuffer 中的数据发送到前端。我一直在遵循这里的说明:https ://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/get-started-text-to-speech?tabs=import%2Cwindowsinstall&pivots=programming-语言-javascript#get-result-as-an-in-memory-stream

表达我的问题的另一种方式是'明确地说,我有一个 ArrayBuffer,其内容是一个 .mp3/.ogg/.wav 文件。如何通过快递发送该文件?我是否需要将其转换为其他数据类型(如 Base64 编码字符串?缓冲区?)我是否需要设置一些特定的响应标头?

标签: azurerestexpressazure-cognitive-servicesarraybuffer

解决方案


在问了这个问题后,我终于想通了

我对这个领域很陌生,所以任何关于如何改进的指针都将不胜感激。

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);
    }
  );
});

推荐阅读