踩坑記:訊飛語音轉(zhuǎn)文字SDK的坑

一窟哺、背景

客服的通話錄音需要轉(zhuǎn)成文字,團(tuán)隊(duì)決定使用科大訊飛的語音轉(zhuǎn)文字服務(wù)铺然,使用的是 SDK 的方式進(jìn)行對接俗孝。

二、遇到的坑

1探熔、關(guān)于 SDK 集成的坑

問題:該SDK的集成方式只有一種驹针,即提供一個(gè) jar 包供下載,不提供 maven 倉庫管理诀艰,不提供源碼給予定制柬甥。

2、關(guān)于強(qiáng)制讀取配置文件 的坑

下圖是規(guī)定的名為 config.properties 的配置文件其垄。

在類文件 LfasrClientImp 中苛蒲,有一個(gè)靜態(tài)代碼塊,會(huì)強(qiáng)制讀取名為config.properties 的配置文件绿满,然后校驗(yàn)該配置文件中的屬性是否合法臂外,這個(gè)class文件是我們重點(diǎn)調(diào)整的對象。

而且在初始化的過程中喇颁,只要有不符合初始化要求的邏輯漏健,則會(huì)給該類中的靜態(tài)私有變量 private static String err_msg = null 賦予錯(cuò)誤信息。

該錯(cuò)誤信息很關(guān)鍵橘霎,因?yàn)檫@個(gè)類是整個(gè) SDK 的精華蔫浆,即客戶端的精華,所有的操作都需要先創(chuàng)建這個(gè)類的對象進(jìn)行操作姐叁,然而當(dāng)上文提到的私有變量 error_msg 不為 null 時(shí)瓦盛,構(gòu)造函數(shù)直接報(bào)錯(cuò)洗显,所以導(dǎo)致無法創(chuàng)建對象,整個(gè)業(yè)務(wù)流程就沒法走下去原环,見下圖的構(gòu)造方法挠唆。

3、關(guān)于日志的坑

① 原版SDK的源碼嘱吗,強(qiáng)制使用log4j玄组,所以對于少數(shù)不使用 log4j 的項(xiàng)目,需要進(jìn)行調(diào)整柜与,附上報(bào)錯(cuò)信息:

log4j:WARN No appenders could be found for logger (com.jet.service.XfyunService).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

② 原版 SDK 會(huì)打印很多的日志巧勤,比如有一些對音頻進(jìn)行處理的日志嵌灰,部分日志信息是我們不需要的弄匕。

4、關(guān)于文件上傳的坑

語音文件上傳的模式只有一種沽瞭,即給定一個(gè)本地的音頻路徑迁匠。
而如果你使用過七牛云的 SDK 你就深有體會(huì)訊飛的這個(gè)SDK 是有多爛,七牛云的上傳文件的方法驹溃,你可以提供文件的本地路徑城丧,也支持流上傳,當(dāng)然也支持遠(yuǎn)程文件地址的方式上傳豌鹤。

三亡哄、埋坑史

1、 解決本地jar包的引入

<!-- 科大訊飛語音轉(zhuǎn)文字 SDK -->
<dependency>
    <groupId>cn.xfyun</groupId>
        <artifactId>raasr</artifactId>
        <version>2.0.0.1006</version>
        <scope>system</scope>
    <systemPath>${project.basedir}/src/main/resources/lib/lfasr-sdk-client-2.0.0.1006.jar</systemPath>
</dependency>

打jar包的時(shí)候把本地的 jar 包也打進(jìn)去:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>com.Jet.jetApplication</mainClass>
                <executable>true</executable>
                <includeSystemScope>true</includeSystemScope>
            </configuration>
        </plugin>
    </plugins>
</build>

2布疙、解決配置文件的讀取問題

依著他給個(gè)指定的配置文件 config.properties蚊惯,但是還是按照項(xiàng)目里的一樣,區(qū)分開發(fā)灵临、測試和生產(chǎn)配置文件截型,然后強(qiáng)制讀取本項(xiàng)目的配置,去強(qiáng)制覆蓋 LfasrClientImp 類中的變量儒溉。

3宦焦、解決 LfasrClientImp 類中變量私有化的問題

為什么關(guān)注該類中的靜態(tài)私有變量呢,因?yàn)樯衔闹刑岬接袀€(gè)私有的變量存儲(chǔ)錯(cuò)誤信息顿涣,我們需要調(diào)整這個(gè)錯(cuò)誤信息波闹。
而對于 LfasrClientImp 類中的靜態(tài)私有屬性,我們可以通過反射機(jī)制強(qiáng)制刷新屬性涛碑。

Class<LfasrClientImp> lfasrClientImpClass = LfasrClientImp.class;
Field field = lfasrClientImpClass.getDeclaredField("SERV_APP_ID_VAL");
field.setAccessible(true);
field.set(lfasrClientImpClass, "testAppId");

4精堕、解決日志的坑

訊飛默認(rèn)使用的是 log4j,如果很不幸你的項(xiàng)目使用的不是 log4j锌唾,要么你做出妥協(xié)锄码,要么夺英,就出大絕招:把訊飛 SDK 的 class 文件反編譯出來,然后自己改源碼滋捶,然后兩條路可以走痛悯,一是再編譯成 jar 包,二是直接作為一個(gè) module 來使用重窟。
但是還是建議調(diào)整日志框架為 log4j载萌,不要?jiǎng)?SDK,防止版本更新巡扇。

5扭仁、解決上傳接口的坑

上文提到了關(guān)于上傳的方法,只有一個(gè)厅翔,即提供一個(gè)音頻文件的本地地址乖坠,然后傳給上傳的方法。
what刀闷?難道我的音頻文件不能是遠(yuǎn)程服務(wù)器上的熊泵?對于這種情況,我們需要手動(dòng)進(jìn)行封裝甸昏,如果不想封裝得太深顽分。
簡單的思路就是:下載文件 -> 保存成臨時(shí)文件 -> 調(diào)用方法

public static File downLoadFiles(String Url) {
    try {
        InputStream in = new URL(Url).openConnection().getInputStream();
        if (in == null) return null;
        String fileName = storePath  + "/" + Url.substring(Url.lastIndexOf("/"));
        File file = new File(fileName);
        OutputStream os = new FileOutputStream(file);
        int bytesRead = 0;
        byte[] buffer = new byte[8192];
        while ((bytesRead = in.read(buffer, 0, 8192)) != -1) {
            os.write(buffer, 0, bytesRead);
        }
        in.close();
        return file;
    } catch (IOException e) {
        log.error("inputStream zhuan file 異常", e);
    }
    return null;
}

四、大絕招

其實(shí) SDK 的底層就是封裝了三樣?xùn)|西施蜜,鑒權(quán)卒蘸、http 請求 和 響應(yīng),我們完全可以通過觀看源碼翻默,找出它的鑒權(quán)等動(dòng)作缸沃,然后自己封裝一套請求,這樣就可以完全脫離訊飛的SDK了冰蘑。

五和泌、備注

附上訊飛 SDK 的 maven 引用:

博客原文地址:http://www.jetchen.cn/xunfei-sdk/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市祠肥,隨后出現(xiàn)的幾起案子武氓,更是在濱河造成了極大的恐慌,老刑警劉巖仇箱,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件县恕,死亡現(xiàn)場離奇詭異,居然都是意外死亡剂桥,警方通過查閱死者的電腦和手機(jī)忠烛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來权逗,“玉大人美尸,你說我怎么就攤上這事冤议。” “怎么了师坎?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵恕酸,是天一觀的道長。 經(jīng)常有香客問我胯陋,道長蕊温,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任遏乔,我火速辦了婚禮义矛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盟萨。我一直安慰自己凉翻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布鸯旁。 她就那樣靜靜地躺著噪矛,像睡著了一般量蕊。 火紅的嫁衣襯著肌膚如雪铺罢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天残炮,我揣著相機(jī)與錄音韭赘,去河邊找鬼。 笑死势就,一個(gè)胖子當(dāng)著我的面吹牛泉瞻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播苞冯,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼袖牙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了舅锄?” 一聲冷哼從身側(cè)響起鞭达,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎皇忿,沒想到半個(gè)月后畴蹭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鳍烁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年叨襟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幔荒。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡糊闽,死狀恐怖梳玫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情右犹,我是刑警寧澤汽纠,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站傀履,受9級特大地震影響虱朵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钓账,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一碴犬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梆暮,春花似錦服协、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至唠椭,卻和暖如春跳纳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贪嫂。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工寺庄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人力崇。 一個(gè)月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓斗塘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亮靴。 傳聞我的和親對象是個(gè)殘疾皇子馍盟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 在應(yīng)用程序中添加日志記錄總的來說基于三個(gè)目的:監(jiān)視代碼中變量的變化情況,周期性的記錄到文件中供其他應(yīng)用進(jìn)行統(tǒng)計(jì)分析...
    時(shí)待吾閱讀 4,991評論 0 6
  • 在應(yīng)用程序中添加日志記錄總的來說基于三個(gè)目的:監(jiān)視代碼中變量的變化情況茧吊,周期性的記錄到文件中供其他應(yīng)用進(jìn)行統(tǒng)計(jì)分析...
    時(shí)待吾閱讀 5,055評論 1 13
  • from:https://www.cnblogs.com/ITtangtang/p/3926665.html一贞岭、L...
    enshunyan閱讀 3,294評論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,109評論 1 32
  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 13,783評論 0 15