有一个任务是接收文本作为输入,将其转换为语音,并将音频文件写入文件系统以供后续在HTML.
当我将生成的一个传递给函数filename,并将这个传递给客户端filename,并使用模板引擎更改文件名以进行播放时,一切都运行良好。唯一的缺点是,随着时间的推移,这些文件已经足够多了,但它们本身没有任何意义。但由于它是一个原型,它可以工作,因此不需要优化。
然后我使用通常的同步处理request并通过response重新加载页面返回。
现在情况发生了一些变化。
现在client和server通信通过Websocket,filename我不发,但是每次client联系的时候我都尽量覆盖。
这是一个简单的函数:
def text_to_speach(text):
with open(join(dirname(__file__),'resources/text.wav'),
'wb') as audio_file:
audio_file.write(
text_to_speech.synthesize(str(text), accept='audio/wav',
voice="en-US_AllisonVoice"))
这就是我注册音频文件的方式:
createjs.Sound.on("fileload", this.loadHandler, this);
这是调用播放文件的函数:
function loadHandler(event) {
createjs.Sound.play("x");
}
这是处理程序onmessage:
socket.onmessage = function(e) {
createjs.Sound.registerSound("resources/text.wav", "x"); // регистрирую файл
loadHandler() // вызываю функцию для воспроизведения
}
而不是经典的<audio></audio>,我决定使用这个库,至少是为了在移动浏览器上播放。
问题是即使覆盖了相同的音频文件也会播放。有时,出了点问题,整个过程都变成了赌注,直到我重新加载页面。我在日志中没有看到任何内容,我找不到错误。
如何播放刚录制的文件?
设法解决它是这样的:
当数据从服务器到达时触发的相同函数,只是现在我正在解析 JSON 并调用初始化函数:
socket.onmessage = function(e) { data = JSON.parse(e.data) app.newMessage(data.text) initialHandler() }
这里有 3 个函数,在
initialHandler我调用一个变量,playHandler如果文件已注册,则调用一个播放文件的函数,如果没有,则调用registerHandler文件已注册的函数,并在成功注册后再次开始playHandler:一个 python 函数,用于检查系统中是否存在文件,否则执行相同的操作:
H
如果有人看到我的
JS代码可以如何简化,那么我会很乐意接受帮助并对答案进行更改。