我最近启动了一个需要实时语音识别的项目,使用谷歌“语音转文本”和 Twilio 的 API(虚拟电话服务)。
总体概述是,在使用 Twilio 进行虚拟电话呼叫期间,呼叫的音频流被分叉并定向到我的 Rails 应用程序中处理的 websocket url,该应用程序应该实时接收此音频流并最终将其发送到语音到文本用于接收记录并将其发送到某人的浏览器以显示它的 API。
因此,这几乎就像在通话期间显示字幕一样,呼叫者可以实时看到正在以文本形式说出的任何内容。
我找不到任何关于如何使用 Rails 实现此目的的有效文档...但似乎有很多简单的方法可以用其他语言来实现此目的。
举个例子,这里有一个 2 分钟阅读教程,其中包含我需要的所有内容,但使用 Node js 完成。我会放置链接,因为我认为它或多或少会澄清我想要做什么,以防我没有很好地解释自己:
如果您想跳过该内容并直接进入其实质,这是我需要在 Rails 中复制的内容的屏幕截图:
因此,在没有太多指导的情况下,我尝试自己实现这一点,只是将流指向我的 websocket url,类似于屏幕截图中的操作方式。我能够通过初始握手(顺便说一句,使用 ngrok 来隧道我的本地主机),但我在处理从音频流接收到的数据方面遇到了困难。我找不到访问此原始数据流的方法,因此,我什至无法执行简单的操作,例如根据“事件类型”键决定要做什么。看来 action_cable 需要以非常特定的格式传输数据,否则就会中断,因为在设置完所有内容后,在 websocket 流开始时我不断收到相同的错误。
只要通话持续,它就会将以下内容打印到控制台。
只要我有通话,这种情况就会持续下去,所以显然是以某种方式编码的音频流数据,这正是我所需要的。只不过这是作为错误日志的一部分打印的。
我能够在 action_cable 源代码中找到引发此错误的确切代码。正如您在屏幕截图中看到的,有一个 case 语句引发了错误,因为接收到的数据与任何预定义的场景都不匹配。那时数据应该是一个字符串,但我得到的是我刚刚发布的这个大 json。
是否可以使用rails来完成我所描述的操作(我有点拒绝接受这是不可能的,一定有办法!)。如果是这样,有人可以指出我正确的方向,帮助我理解我做错了什么吗?
谢谢!
更新:
忘了提及我在 Twilio 的官方演示页面上找到了这个示例应用程序。它完全符合我使用 Rails 的需要,但它使用了一个名为 Tubesock 的 gem,该 gem 不再被维护,因为 Rails 现在改为使用 ActionCable。
以下是相关代码的快速片段:
class ChatController < ApplicationController
include Tubesock::Hijack
def chat
hijack do |tubesock|
tubesock.onopen do
tubesock.send_data "Hello, friend"
end
tubesock.onmessage do |data|
tubesock.send_data "You said: #{data}"
end
end
end
end
如您所见,它非常简单,它充当中间位置并允许我在传递数据之前修改数据,它使我有机会在某些事件触发时执行不同的操作,例如“打开连接”或“接收消息”在 websocket 中。
所以,这绝对是可能的,问题是,为什么 ActionCable 不支持这样的东西?
是否还有其他仍在维护的类似库?
如果你想看的话我会留下相关链接:
您在这里找到解决方案了吗?我在自动柜员机上面临着同样的“问题”