.NET配合Web实现语音交互
最近做了一个.NET 技术栈 B/S 架构系统语音交互操作集成的 DEMO,先在 chrome 简单尝试了 webkitSpeechRecognition,然后选型 BAT/讯飞接口。再到百度 PCM 识别和讯飞 WebSocket 对接。可玩性很高,分享一波。不得不说.NET 在这种情况总是陷入深深的恶意...
webkitSpeechRecognition
因为之前做直播折腾了 WebRTC,所以基于 B/S 架构的系统第一个想到的就是类似 WebRTC 的 getUserMeida 获取音频流。查找发现 Chrome 有现成的 webkitSpeechRecognition 可以用,还可以配合 SpeechSynthesisUtterance 直接解决了语音转文字文字转语音的问题。实测下来识别率还是比较 ok 的。
要注意的是 webkitSpeechRecognition 走的是 Google 的训练库。连不上 Google 是没法用的。
微软也有内置的 Microsoft Speech API,但是 B/S 架构还要走一道服务端 C#就感觉不友好了,先继续了解其他方案。
垂直领域识别率问题
在网络畅通的情况下,Google 的识别效率和精准度还是可以接受的,但是在垂直细分领域专业术语就看出问题了。考虑到 Google 要搭 梯子
,开 https
。我们又是专业性很强的系统(专注 时效性
、语法语义
、词库
、模型自训练
等)。只能转啃百度、阿里、讯飞几家供应商。
简单汇总几家供应商接口情况
供应商 | 资费/配额 | 对.NET 支持 | 识别模式 | 自定义 | 效率 |
百度 | 免费高配额 | C# SDK | 文件 | 自训练 | 单句 2s 内 |
阿里 | 免费受限 | 无 | 文件 | 自训练、热词 | 单句 2s 内 |
讯飞 | 免费低配额 | 无 | 文件/流式 | 自训练 | 单句 2s 内,ws 响应快 |
没有继续统计 腾讯
、云之声
、思必驰等
。简短总结:BAT+讯飞都是政府指定的首批人工智能开创平台。百度 All In AI 后,各种 API 对开发者都很友好(唯一一个开 C#口的),相当良心。阿里的体量在那里,没有百度那么大而全但是也有模有样。讯飞专门吃这口饭更为专注,腾讯。。。忽略吧。
高贵的阿里 API
跟阿里云打交道这么久,处处都是对我大井的无视。我也很无奈啊!用 NodeJS 版本跑了下,走的 JavaScript getUserMeida 提取 Blob,转 PCM 裸流二进制 Post 到 NodeJS 发起阿里云 API,识别效率和精准度都不错(套路跟我设想的一样,我在后面B/S系统实现上借鉴了部分js
)。阿里真的视 Java、Python、Node 为亲儿子,DEMO 拿下来基本改改就能上项目(wtf)。
但是考虑到阿里的资费仅次于讯飞。试用的专业库只给一个月。主要是仇视我大井,我当然不会推荐。
大而全的百度 AI
百度此时显得相当 包容
。直接 C# SDK 跑起一个 DEMO,暂时除了识别速度待优化,其他问题不大。那么剩下的问题就是之前那个套路:Localhost 或者上 HTTPS 调起 getUserMeida。然后把 Stream 转 Blob 再转 PCM 到 C# SDK 就好。综合考虑配额、接口完全程度,对我大井开发友好程度,识别率。继续用百度完善了整个 DEMO 的产品化。往上推荐妥妥的。
尿性的讯飞
我 18 年专门跑了讯飞的发布会,当时全面了解过。对他表示中立。虽然依然没有 C# SDK。但是像阿里一样,忍了,人家是专门干这个的。当时想万一说服不了 Boss,我可以用 C#调起 Python 去做。临时应付!所以初步体验下,讯飞识别率和精准度肯定不输 BAT 的,但是资费真的贵(一个识别库40000一年
)。第一轮先放下吧,玩不起。
猛一回头发现讯飞没有 C# SDK 但是他有 JavaScript 的,集成到 DEMO 后效果不错而且还是 WebSocket 流式。水平快要赶上同声传译了。对后面的项目又有了点信心呢!(不怕Boss一意孤行强上行业标杆讯飞了,可以少掉两根头发啊
)。
忍不住说下某些供应商总是敌对.NET 原因,单纯个人看法:还是微软爸爸不给力啊,人家接口在授权认证加解密上有多方便快捷你知道吗,你知道 JavaScript 搞个通用 DES 加密,我大井解出来不一致多尴尬吗?
DEMO 效果
代码懒得贴了,反正 B/S 架构得系统语音控制。我还没看到有人分享。我也不想贴 GitHub 赚星星。用自己得 Git 我放心。有兴趣留言交流!
DEMO 中的补刀
要做到天猫精灵那样,可以 getUserMedia 后让它做守护进程。反正 Chrome 一直在听,截取哪一段发去 API 还不是你说的算?
此时一个非专业讯飞所谓技术总监发来建议:从守护进程截取音频我们都是用 settimeout。等我去补刀的时候,才做回我建议的根据音频大小判断,误人子弟。
智障 AI 语音交互要注意一点:不能让它自己听到自己说的,又去识别。各家厂商为了避免这个问题,智障 AI 都是只听不说只说不听的。自己逻辑中做好 window.speechSynthesis.speaking 判断。
不要用倒计时这么傻的办法,也不要去计算这句话多长要读多久,根据这个时间再次唤醒业务监听。好好监听 SpeechSynthesisUtterance end 事件。
有细节吗?
不爬梯子还想体验 webkitSpeechRecognition?
识别速度优化第一看网络(好好说话,别打网管),第二听供应商的用 pcm 裸流。
百度说后面有流式,但是我一直没有查找到相关文档。
如果不联网,只能走微软自己的 Speech API 了,而且妥妥桌面程序。
用降噪话筒,体验不是好一点点的问题。
表明态度
这几家供应商,百度靠 xxx 起家,阿里拽的一逼,价值观 xxx,讯飞扶不起的阿斗。略有好感的企鹅没有在这块上冲到前线。是不愿意当猪飞一把,还是看不上补贴、看透了 AI 这个忽悠 ~