[语音识别] 讯飞语音 SDK (Clojure), 语音识别/语音朗读

2017-07-13 15:01:36 +08:00
 stevechan

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 %))) )

2977 次点击
所在节点    程序员
2 条回复
stevechan
2017-07-13 15:17:10 +08:00
欢迎给我提 Issues 和 Start 呀 :-)
stevechan
2017-07-18 11:09:47 +08:00
不到 100 行代码就实现啦

```clojure

(ns xunfei-clj.core
(:require [cheshire.core :as cjson])
(:import [com.iflytek.cloud.speech
SpeechRecognizer
SpeechConstant
SpeechUtility
SpeechSynthesizer
SynthesizerListener
SynthesizeToUriListener
SpeechError
RecognizerListener
RecognizerResult]
[org.json JSONArray JSONObject JSONTokener]))

;; 讯飞初始化: (app-init "59145fb0") , 可以自行到讯飞开放平台注册一个 appid, 或者用本人的测试
(defn app-init
[appid]
(let [appid (str SpeechConstant/APPID "=" appid)]
(SpeechUtility/createUtility appid)))

;; 设置合成监听器,对 SynthesizerListener 进行 proxy,添加对象属性控制
(defn m-syn-listener-gen
[]
(proxy [SynthesizerListener] []
(onCompleted [_])
(onBufferProgress [^Integer percent ^Integer begin-pos ^Integer end-pos ^String info])
(onSpeakBegin [])
(onSpeakPaused [])
(onSpeakProgress [^Integer percent ^Integer begin-pos ^Integer end-pos])
(onSpeakResumed [])))

;; (read-text-as-voice "输入文本,用讯飞语音合成器, 合成发音播放" (fn [mTts text] ...播放或者是保存到音频文件...) )
(defn read-text-to-voice
[text output-fn]
(let [m-tts (doto (SpeechSynthesizer/createSynthesizer)
(.setParameter SpeechConstant/VOICE_NAME "xiaoyan")
(.setParameter SpeechConstant/SPEED "50")
(.setParameter SpeechConstant/VOLUME "80")
(.setParameter SpeechConstant/TTS_AUDIO_PATH "./tts_test.pcm"))]
(output-fn m-tts text)))

;; (text-to-player "这里是文本播放语音")
(defn text-to-player
[text]
(read-text-to-voice
text
(fn [m-tts text] (.startSpeaking m-tts text (m-syn-listener-gen)))))

;; 将 text 合成的语音保存到文件的合成器
(defn synthesize-to-uri-listener
[]
(proxy [SynthesizeToUriListener] []
(onBufferProgress [^Integer progress])
(onSynthesizeCompleted [^String uri ^SpeechError error])))

;; (text-to-vfile "将 text 合成的语音保存到文件" "testest.wav")
(defn text-to-vfile
[text url]
(read-text-to-voice
text
(fn [m-tts text]
(.synthesizeToUri m-tts text url (synthesize-to-uri-listener)))))

;; =======>>>> 下面是语音识别生成文本 ====>>>>>

;; 语音识别监听器 Usage:
;; (def regcog-res (atom (list)))
;; (m-reco-listener #(swap! regcog-res conj %))
(defn m-reco-listener
[result-fn]
(proxy [RecognizerListener] []
(onResult [^RecognizerResult results ^Boolean is-last]
(let [res (-> results .getResultString cjson/parse-string)]
(println "识别语音结果:=>" res)
(result-fn res)))
(onError [^SpeechError error] (.getPlainDescription error true) )
(onBeginOfSpeech [])
(onVolumeChanged [^Integer volume])
(onEndOfSpeech [])
(onEvent [^Integer eventType ^Integer arg1 ^Integer arg2 ^String msg])))

;; (record-voice-to-text)
(defn record-voice-to-text
[m-reco-listener]
(let [m-iat
(doto (SpeechRecognizer/createRecognizer)
(.setParameter SpeechConstant/DOMAIN "iat")
(.setParameter SpeechConstant/LANGUAGE "zh_cn")
(.setParameter SpeechConstant/ACCENT "mandarin"))]
(.startListening m-iat (m-reco-listener))))

```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/375076

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX