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

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

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, 几乎对所有的语言的设计 都 产生了很大的影响力。

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