Clojure 封装讯飞语音 SDK, 可提供给 Emacs/Vim 编辑器使用,或者命令行, 实现语音朗读提醒 /语音识别 /语音转为命令等
目前只支持 Linux 和 Windows 系统,因为讯飞官方 SDK 暂未支持 Mac
;; 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 %))) )
$ 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 %))) )
1
stevechan OP 欢迎给我提 Issues 和 Start 呀 :-)
|
2
stevechan OP 不到 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)))) ``` |