将Azure文本到语音输出加载到Azure Blob

如何解决将Azure文本到语音输出加载到Azure Blob

我需要一些指导。我的Azure函数(用node.js编写)会将一些随机文本转换为语音,然后将语音输出上传到Blob。我想这样做而不使用中间本地文件。 BlockBLobClient.upload方法需要Blob,字符串,ArrayBuffer,ArrayBufferView或返回新Readable流以及内容长度的函数。我无法从调用TTS返回的RequestPromise对象中获取这些(到目前为止,我正在使用request-promise来调用TTS)。任何建议将不胜感激。

谢谢

添加可以作为“ node TTSSample.js”进行测试的代码示例 示例代码基于

    https://github.com/Azure-Samples/azure-sdk-for-js-storage-blob-stream-nodejs/blob/master/v12/routes/index.js上共享的
  1. Azure Blob流相关代码

  2. https://github.com/Azure-Samples/Cognitive-Speech-TTS/tree/master/Samples-Http/NodeJS

    处的文本到语音的天蓝色示例代码
  3. 在所附的settings.js中替换适当的键和参数

  4. 我正在使用node.js运行时v12.18.3

  5. 在此代码示例中,硬编码了输入文本和输出blob名称。

    // TTSSample.js
    // TTSSample.js
    // Converts given text to Audio and uploads to Azure Blob storage
    // Ultimately to be used in an Azure function
    // As of now input text as well as the target BLobStorage object are hard coded.
    
    // To install dependencies,run: npm install
    const xmlbuilder = require('xmlbuilder');
    // request-promise has a dependency on request
    const rp = require('request-promise');
    const fs = require('fs');
    const readline = require('readline-sync');
    const settings = require('./settings.js');
    
    const multer = require('multer');
    const inMemoryStorage = multer.memoryStorage();
    const uploadStrategy = multer({ storage: inMemoryStorage }).single('image');
    const getStream = require('into-stream');
    
    const ONE_MEGABYTE = 1024 * 1024;
    const uploadOptions = { bufferSize: 4 * ONE_MEGABYTE,maxBuffers: 20 };
    const ONE_MINUTE = 60 * 1000;
    // Blob Storage
    const { BlobServiceClient } = require('@azure/storage-blob');
    
    // Gets an access token.
    function getAccessToken(subscriptionKey) {
            let options = {
                    method: 'POST',uri: settings.issueTokenUri,headers: {
                            'Ocp-Apim-Subscription-Key': subscriptionKey
                    }
            }
            return rp(options);
    }
    
    // Converts text to speech using the input from readline.
    function textToSpeech_rp(accessToken,text) {
            // Create the SSML request.
            let xml_body = xmlbuilder.create('speak')
                    .att('version','1.0')
                    .att('xml:lang','en-us')
                    .ele('voice')
                    .att('xml:lang','en-us')
                    .att('name','en-US-Guy24kRUS') // Short name for 'Microsoft Server Speech Text to Speech Voice (en-US,Guy24KRUS)'
                    .txt(text)
                    .end();
            // Convert the XML into a string to send in the TTS request.
            let body = xml_body.toString();
            //console.log("xml string is done");
            let options = {
                    method: 'POST',baseUrl: settings.cognitiveUri,url: 'cognitiveservices/v1',headers: {
                            'Authorization': 'Bearer ' + accessToken,'cache-control': 'no-cache','User-Agent': settings.cognitiveResource,'X-Microsoft-OutputFormat': 'riff-24khz-16bit-mono-pcm','Content-Type': 'application/ssml+xml'
                    },body: body
            }
            console.log(options);
            let request = rp(options)
                    .on('response',async (response) =>  {
                            if (response.statusCode === 200) {
                                    console.log("Inside response");
                                    const stream = getStream(response);
    
         //request.pipe(fs.createWriteStream('TTSOutput.wav'));
    
                                    const AZURE_STORAGE_CONNECTION_STRING = settings.storageConnectionString;
                                    const storageAccount = settings.storageAccount;
                                    const storageKey = settings.storageKey;
                                    const containerName = settings.audioContainer;
                                    // Create the BlobServiceClient object which will be used to create a container client
                                    const blobServiceClient = BlobServiceClient.fromConnectionString(AZURE_STORAGE_CONNECTION_STRING);
    
                                    // Get a reference to a container
                                    const containerClient = blobServiceClient.getContainerClient(containerName);
    
                                    // Create a unique name for the blob
                                    //const blobName = id + '.mp3';
                                    const blobName = 'audio1.mp3';
    
                                    // Get a block blob client
                                    const blockBlobClient = containerClient.getBlockBlobClient(blobName);
                                    //blockBlobClient.upload(buffer,61000);
                                    //blockBlobClient.upload(request.body);
                                    try {
                                             await blockBlobClient.uploadStream(stream,uploadOptions.bufferSize,uploadOptions.maxBuffers,{ blobHTTPHeaders: { blobContentType: "audio/mpeg3" } });
                                            //res.render('success',{ message: 'File uploaded to Azure Blob storage.' });
                                            console.log('Success');
                                      } catch (err) {
                                            //res.render('error',{ message: err.message });
                                            console.log("Failure",err.stack);
                                      }
                                    console.log("I am done");
                            }
                    });
            return request;
    
    };
    
    // Use async and await to get the token before attempting
    // to convert text to speech.
    async function main() {
            const subscriptionKey = settings.subscriptionKey; //process.env.SPEECH_SERVICE_KEY;
            if (!subscriptionKey) {
                    throw new Error('Environment variable for your subscription key is not set.')
            };
            // Prompts the user to input text.
            //const text = readline.question('What would you like to convert to speech? ');
            const text = "Hello there";
            try {
                    const accessToken = await getAccessToken(subscriptionKey);
                    //console.log("Access Token is done");
                    await textToSpeech_rp(accessToken,text);
            } catch (err) {
                    console.log(`Something went wrong: ${err}`);
                    console.log(err.stack);
            }
    }
    
    // Run the application
    main()
    
    
    
    
     //============ Settings.js
    
    (function() {
    "use strict";
    module.exports = {  
    // Replace with your own subscription key,service region (e.g.,"westus"),// and recognition language.
    subscriptionKey:   "CognitiveServiceSubsctiptionKey",serviceRegion:     "eastus",// e.g.,"westus"
    language:          "en-US",issueTokenUri:     'https://eastus.api.cognitive.microsoft.com/sts/v1.0/issuetoken',cognitiveUri: 'https://eastus.tts.speech.microsoft.com/',cognitiveResource: 'CognitiveResourceName',// Storage
    storageAccount: "StorageAccount",storageKey: "sN/StorageKey==",storageConnectionString: "StorageConnectionString",audioContainer: "AudioContainer",};
    }());
    

解决方法

关于此问题,请参考以下代码

const xmlbuilder = require("xmlbuilder");
const rp = require("request-promise");
const azure = require("azure-storage");
const subscriptionKey = "<your speech service subscription key>";

module.exports = async function (context,req) {
  context.log("JavaScript HTTP trigger function processed a request.");
  try {
    const accessToken = await getAccessToken(subscriptionKey);

    const blobService = azure.createBlobService(
      "<connection string>",);
    const writableStream = blobService.createWriteStreamToBlockBlob(
      "test","test.mp3",{
        blockIdPrefix: "block",contentSettings: {
          contentType: "audio/mpeg",},);

    const text = "Hi";
    const data = await textToSpeech(accessToken,text,writableStream);

    context.res = { body: data };
  } catch (err) {
    console.log(`Something went wrong: ${err}`);
    context.res = {
      status: 500,body: err,};
  }
};

function getAccessToken(subscriptionKey) {
  let options = {
    method: "POST",uri:
      "https://southeastasia.api.cognitive.microsoft.com/sts/v1.0/issueToken",headers: {
      "Ocp-Apim-Subscription-Key": subscriptionKey,};
  return rp(options);
}

// Converts text to speech using the input from readline.
function textToSpeech(accessToken,writableStream) {
  return new Promise((resolve,reject) => {
    try {
      let xml_body = xmlbuilder
        .create("speak")
        .att("version","1.0")
        .att("xml:lang","en-us")
        .ele("voice")
        .att("xml:lang","en-us")
        .att("name","en-US-Guy24kRUS")
        .txt(text)
        .end();
      // Convert the XML into a string to send in the TTS request.
      let body = xml_body.toString();

      let options = {
        method: "POST",baseUrl: "https://southeastasia.tts.speech.microsoft.com/",url: "cognitiveservices/v1",headers: {
          Authorization: "Bearer " + accessToken,"cache-control": "no-cache","User-Agent": "YOUR_RESOURCE_NAME","X-Microsoft-OutputFormat": "audio-16khz-64kbitrate-mono-mp3","Content-Type": "application/ssml+xml",body: body,};

      rp(options)
        .pipe(writableStream)
        .on("finish",() => {
          resolve("done");
        });
    } catch (error) {
      reject(error);
    }
  });
}

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-