【发布时间】:2019-12-14 19:51:51
【问题描述】:
我有一个 TTS(文本到语音)系统,它以 numpy 数组形式生成音频,其数据类型为 np.float32。该系统在后台运行,我想将数据从后台传输到前台,以便在某个事件发生时播放。
这个问题的明显解决方案是将音频数据作为wav文件写入磁盘,然后将路径传递给前端播放。这很好用,但出于管理原因,我不想这样做。我只想将音频数据(numpy 数组)传输到前端。
到目前为止,我所做的如下:
后端
text = "Hello"
wav, sr = tts_model.synthesize(text)
data = {"snd", wav.tolist()}
flask_response = app.response_class(response=flask.json.dumps(data),
status=200,
mimetype='application/json' )
# then return flask_response
前端
// gets wav from backend
let arrayData = new Float32Array(wav);
let blob = new Blob([ arrayData ]);
let url = URL.createObjectURL(blob);
let snd = new Audio(url);
snd.play()
这就是我到目前为止所做的,但是 JavaScript 会抛出以下错误:
Uncaught (in promise) DOMException: Failed to load because no supported source was found.
这是我正在尝试做的事情的要点。很抱歉,由于您没有 TTS 系统,因此无法重现错误,所以这是由它生成的 audio file,您可以使用它来查看我做错了什么。
我尝试过的其他事情:
- 将音频数据类型更改为
np.int8、np.int16,以便分别由Int8Array()和int16Array()在JavaScript 中进行转换。 - 在创建
blob时尝试了不同的类型,例如{"type": "application/text;charset=utf-8;"}和{"type": "audio/ogg; codecs=opus;"}。
我已经在这个问题上苦苦挣扎了这么久,所以任何帮助都会得到帮助!
【问题讨论】:
-
从我记得的 tts 中,他们发送了一个 base64 buf,你试过这样做吗?
-
不,数据是在
numpy中返回的,所以你知道如何将numpy转换为base64缓冲区...我会google一下,但也许你有更快的答案 -
我已经尝试使用
base64.b64encode(wav)。在前端,我使用了let snd = new Audio("data:base64," + path;);,但它不起作用。我试过data:audio/ogg;base64," + path;和data:audio/wav;base64," + path;也没有用。
标签: javascript python-3.x numpy flask html5-audio