Clojure [语音识别] 讯飞语音 SDK 封装, 实现语音识别 / 语音朗读 / 语音提醒

steve-chan-clojure · 2017年07月13日 · 最后由 steve-chan-clojure 回复于 2017年08月30日 · 9038 次阅读

xunfei-clj 源码链接

Clojure 封装讯飞语音 SDK, 可提供给 Emacs/Vim 编辑器使用,或者命令行, 实现语音朗读提醒/语音识别/语音转为命令等

目前只支持 Linux 和 Windows 系统,因为讯飞官方 SDK 暂未支持 Mac

Usage: 查看使用示例 hello-xunfei

;; 1. add to project.clj.
[xunfei-clj "0.1.4-SNAPSHOT"]

;; 2. add Msc.jar to project's lib path, then add `:resource-paths` option.
:resource-paths ["lib/Msc.jar"]

;; 3. copy libmsc64.so(windows: msc64.dll) & libmsc32.so(windows: msc32.dll) to your project root path.

;; 4. core.clj:
(ns hello-xunfei.core
  (:require [xunfei-clj.core :as xunfei]))

;; 讯飞初始化
(xunfei/app-init "your-xunfei-appid") ;; 可以自行到讯飞开放平台注册一个appid

;; 语音朗读
(defn xunfei-say-hi
  [text]
  (xunfei/text-to-player text))

;; 语音识别
(def regcog-res (atom (list)))
(xunfei/record-voice-to-text (fn [] (xunfei/m-reco-listener #(swap! regcog-res conj %))) )

Develop

$ lein repl 
;; 讯飞初始化
xunfei-clj.core> (xunfei/app-init "your-xunfei-appid")
;; 语音朗读
xunfei-clj.core> (text-to-player "什么语音文学驱动编程?")

;; 语音识别
xunfei-clj.core> (def regcog-res (atom (list)))
xunfei-clj.core> (record-voice-to-text (fn [] (m-reco-listener #(swap! regcog-res conj %))) )

牛逼哦,能语音写代码吗?

kaka 回复

可以语音写 Todos, 写代码注释, 还有读代码注释, 我 还把它用在单元测试里面, 读单元测试结果报告. 写代码还要, 过段时间更新才行, 结合机器学习修正错误 . 😝 😍 目前我只是集成到了 Emacs,去调用它,我打算把它做成语音插件,可以支持很多种编辑器, 实现 语音驱动编程 😝

@chenge 这个是函数式编程写的呀 😝

可以用话筒写 helloworld

clojure 我折腾过几个月,不太适应。现在转 Elixir 了。 比如那个 require 为什么要带个冒号呢?

同样的帖子,http://clojure-china.org/t/clojure-sdk/691 ruby-china 的热度更高啊!

yfractal 回复

clojure-china 的 国内外 函数式高手太多了, 太多都是 SICP 火炼出来的, 其次 是 Clisp/Elisp/Haskell/Racket 磨炼过来的 😍 , 大部分人都是 高手潜水呀

zaqmjuop 回复

不容置疑的是, 讯飞的语音识别是中文界做得最好的. 可以试试, 识别很精确, 语音朗读很人性化 , 可以感受到 机器学习 的巨大威力. 我还用 Clojure 写了个 App 去调用讯飞 SDK, 随时随地读网页文章, 做语音标记 ,目前 还未开源. 写 hello world 肯定没问题, 通过 Clojure 强大的宏能力 结合 机器学习&深度学习, 生成代码不是不可能的. 😍

chenge 回复

因为 ns 是个宏, ns 宏里面代码 把 require 函数 当成 数据来处理了, 所以写成 (:require ...) 区分了. 不在 ns 里面使用 require 是这样写的:

(require '(clojure.java.io))
 lein repl
user=> (source ns)
(defmacro ns
  "Sets *ns* to the namespace named by name (unevaluated), creating it
  if needed.  references can be zero or more of: (:refer-clojure ...)
  (:require ...) (:use ...) (:import ...) (:load ...) (:gen-class)
  with the syntax of refer-clojure/require/use/import/load/gen-class
  respectively, except the arguments are unevaluated and need not be
  quoted. 
  ... )

当初 Clojure 打动我的是, ClojureScript 函数式 可以 轻易写出很复杂的单页面 (如单页面游戏, 网页编辑器 lighttable), 甚至 连编辑器都不用离开.

谢谢,不知道你接触 Elixir 没有?我最近在看 elm,感觉也不错。

上次看个演讲说 lisp 是外星人语言,我感觉还不是外星人暂时就不用吧。

chenge 回复

Matz 说过 Emacs 改变了他的人生, 准确说应该是 ELisp 改变了他的人生. http://www.slideshare.net/yukihiro_matz/how-emacs-changed-my-life 那你肯定认为 Matz 也是外星人啦 😝 我接触过 Elixir 呀,他也是受 Lisp 影响的函数式语言呀, 很不错. Elm 是 Haskell 的子集, 第一个实现了 FRP, 学好得先搞好 Haskell. 大部分函数式编程语言的开发效率都是超高的, 但是用于生产的并不多. Clojure 是开发效率超高加上用途极广 (不只是限制于做网站和后端), 用于生产的性能又刚刚的, 写 Clojure 后端 API, ClojureScript 前端单页面, 还有大数据分析, 数据挖掘, 机器学习, 写安卓 APP , ClojureCLR 写微软软件 等等 都非常棒, 几乎没有它做不了的事情.

高手潜水呀

ruby-china 也有人潜水。但国内有很多牛人都不潜水,有管理论坛的的,有回答新手问题的、有分享撕逼的。至少看起来,是团结、热闹的。

想问下,讯飞的 api 主要能干些啥?语音识别输入?

cqcn1991 回复

可以 语音识别输入, 语音朗读, 分词等功能, 具体看讯飞开放平台: http://www.xfyun.cn/index.php/sdk/dispatcher 😝 欢迎来一起玩讯飞呀

yfractal 回复

这一点是 clojure-china 要学习的, 因为大部分 clojure 开发者的解决问题的能力都很强, 几乎说很少遇到自己很难解决的问题.

因为函数式的思想简单直接, 直击问题的算法本质, 不会像面向对象一样对象继承等那么复杂, 为了找个问题, 看了几十个底层类的方法. 但是不可否认的是, 面向对象对于 GUI 编程是友好的, 但是 即使这样, 几乎没有函数式做不了的事情, 我用 Clojure 函数式写安卓应用的 GUI 也是一样写好的, 很简单干净. 我用 ClojureScript 函数式 写前端单页面游戏,也是轻易写好, 开发效率不知有多高.

而且 Lisp 的开发效率和经验成正比的, 几乎没有上限的限制. 最难的跨 领域问题, 也可以快速 写个解释器 或者是 编译器出来. ... 面向对象是底层操作, 函数式才是上层操作, 这个才是合适的, 不要为了解决一个简单问题, 还没解决问题, 就被一堆的对象搞死了.

以前我觉得 Ruby 是最好的语言, 但是 Ruby 的大师 Jim Weirich, 这个视频改变了我, 让我重新审视 函数式编程, 重新看待 Lisp 函数式的鼻祖, 重新看待邱奇 和 图灵 , 我认为邱奇 的伟大 应该是 高于 图灵的 👏

没人会否认 Lisp/Clojure 的价值。语言有自己的特点,也有自己的适用范围。

有很多人从 Ruby 转向 clojure,也有很多人在用 ruby 做函数式的尝试。

Ruby / Rails 本身都在函数式编程上学习了很多。比如 rails 的 ActiveRecord::Relation User.wher(xx: xx).find(xx) 。每一个方法都返回一个 ActiveRecord::Relation 的实例,而且是 lazy evaluation 的。

Clojure 也在做解决状态的尝试,比如 https://github.com/stuartsierra/component

面向对象,会带来复杂度,但也能解决问题,比如被很多 rails 程序员诟病的 https://github.com/josevalim/inherited_resources ,也可以极大程度上提高生产力。开发效率和能力成正比。这种东西所带来的好处就是,大多数情况下,隐藏了细节,团队开发就变成了有经验的 + 经验少的这种组合。而不是所有人都要有经验。

有些问题,需要通过 提供抽象、提供解决方案来解决。 比如创建数据,需要用到 factory,需要实现的就是 factory_girl 的那些方法,无论是 ruby 还是 clojure。

放在最底层的那些语言听都没听过。

yfractal 回复

偶遇 mike 大大

lanzhiheng 回复

很多计算机的设计思想 和 精髓, 是不可忽略的, 尤其是 Lisp, 几乎对所有的语言的设计 都 产生了很大的影响力.

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册