最近在做app和支付宝小程序接入阿里语音合成的功能,目的是将文本转换为语音并播放。
调用阿里的语音合成接口(tts) ,但返回的是一个二进制文件流, 并不是一个直接可供播放的音频地址;
问题:我该怎么在app中或者支付宝小程序中进行播放呢?
返回结果如图:
爱豆豆 - 办法总比困难多
看你用的阿里云 你应该是直接请求了阿里云的语音合成接口 然后拿到了二进制文件 才问的怎么播放二进制文件
其实你并不需要再单独请求这个二进制文件 这个接口实际上已经提供了音频文件
你可以将这个接口(它本质上就是一个文件路径)拼接到你的音频标签的src属性上 然后放到你的Audio标签上 或者 使用 uni.createInnerAudioContext() 来播放这段音频
参考下示例接口 使用 uni.createInnerAudioContext() 来播放语音合成的文件
app和支付宝小程序都可以用
const innerAudioContext = uni.createInnerAudioContext();
// 语音合成接口
// text文本:"今天是周一,天气挺好的。"
innerAudioContext.src =
"https://nls-gateway-cn-shanghai.aliyuncs.com/stream/v1/tts?appkey=你的项目Appkey&token=你的Access Token&text=%E4%BB%8A%E5%A4%A9%E6%98%AF%E5%91%A8%E4%B8%80%EF%BC%8C%E5%A4%A9%E6%B0%94%E6%8C%BA%E5%A5%BD%E7%9A%84%E3%80%82&format=wav&sample_rate=16000";
innerAudioContext.stop();
// 播放
innerAudioContext.play();
爱豆豆 - 办法总比困难多
在 renderjs 中使用decodeAudioData
注意:需要将 buffer 连接到目标扬声器 destination source.connect(audioCtx.destination);
试试这个方法
到处看到你在各个问题的评论区回答问题,但是你回答的问题能不能有质量一点,你上面的回答要是提问者懂的(能力强)就不会在这里提问了,一般都是初级开发者偏多,你虽然经常给人回答,但是你的答案能不能让人看懂,有没有用是个问题,最好分享一个demo、或者具体的代码实现案例。
2024-01-18 11:53
回复 3***@qq.com: 非常感谢您的反馈 我会尽力提供准确和有用的答案,但是我的回答可能对于一些初学者来说可能有些难以理解。 我以后会改进我的回答 尽量更便于理解 我会尽量提供代码示例或demo,让初级开发者更好地理解问题的解决方案。
对于这个问题的回答 我只是提供了这个功能的实现方向 因为没有太多时间 就没提供demo或代码片段
2024-01-18 12:11
回复 3***@qq.com: 社区本身就是相互帮助解决问题的 有质量和无质量 最终都要提问者去一一实践 然后找到最适合自己的解决方案 而且每个人对于“质量”的标准也不一样
上面这个回答 我觉得并没问题 提问者问怎么播放二进制文件流 我回答 在 renderjs 中使用decodeAudioData
这两个都标上了文档地址 只要去仔细看看文档 基本都能看懂 decodeAudioData 文档中也有很详细的代码使用示例
2024-01-18 15:21
回复 3***@qq.com: 都是打工人,主打的就是一个态度,总不能说uniapp有问题吧,毕竟《DCloud产品不会有明显的bug,所以你遇到的问题大都是在特定环境下才能重现的问题,请仔细描述你的环境和重现方式,否则DCloud很难排查解决你的问题》uniapp主打的就是一个灵活多变,缺啥补啥,做安卓就得去研究native,然后plus.android.importClass( String classname )去研究安卓原生。做ios就得去研究native,然后plus.ios.importClass( String classname );去研究ios原生。作为一个成功的商业产品,千万愣头青的选中,不知道uniappx会是怎么样的
2024-01-22 18:32
爱豆豆 - 办法总比困难多
在 renderjs 中使用decodeAudioData 播放示例
<template>
<view>
<button @tap="test.start">播放合成语音</button>
</view>
</template>
<script module="test" lang="renderjs">
export default {
methods: {
start() {
let audioCtx = new(window.AudioContext || window.webkitAudioContext)();
let source
source = audioCtx.createBufferSource();
let request = new XMLHttpRequest();
request.open("GET", "你的语音合成接口路径", true);
request.responseType = "arraybuffer";
request.onload = function() {
let audioData = request.response;
audioCtx.decodeAudioData(
audioData,
function(buffer) {
source.buffer = buffer;
source.connect(audioCtx.destination);
source.loop = true;
//播放合成语音
source.start(0);
}
);
};
request.send();
}
}
}
</script>
爱豆豆
你用的是那个接口呢
我用的这个:https://help.aliyun.com/document_detail/94737.html?spm=a2c4g.94737.0.0.748f622dzevkiW#section-w6l-ovz-18n
2024-01-18 14:34
2***@qq.com (作者)
回复 爱豆豆: 非常感谢,用这个方法解决了,我没想到src可以直接使用一个get请求,我自己用post请求搞了好几天(Ծ‸Ծ)
2024-01-18 17:45
8***@qq.com
回复 爱豆豆: 我根据你上面说的方法播放,在开发工具上确实没问题,但是在真机调试就报错了,该怎么解决呢?
2024-11-02 17:02