网站首页 > 技术教程 正文
一、背景
客服的通话录音需要转成文字,团队决定使用科大讯飞的语音转文字服务,使用的是 SDK 的方式进行对接。
二、遇到的坑
1、关于 SDK 集成的坑
问题:该SDK的集成方式只有一种,即提供一个 jar 包供下载,不提供 maven 仓库管理,不提供源码给予定制。
2、关于强制读取配置文件 的坑
下图是规定的名为 config.properties 的配置文件。
在类文件 LfasrClientImp 中,有一个静态代码块,会强制读取名为config.properties 的配置文件,然后校验该配置文件中的属性是否合法,这个class文件是我们重点调整的对象。
而且在初始化的过程中,只要有不符合初始化要求的逻辑,则会给该类中的静态私有变量 private static String err_msg = null 赋予错误信息。
该错误信息很关键,因为这个类是整个 SDK 的精华,即客户端的精华,所有的操作都需要先创建这个类的对象进行操作,然而当上文提到的私有变量 error_msg 不为 null 时,构造函数直接报错,所以导致无法创建对象,整个业务流程就没法走下去,见下图的构造方法。
3、关于日志的坑
① 原版SDK的源码,强制使用log4j,所以对于少数不使用 log4j 的项目,需要进行调整,附上报错信息:
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 会打印很多的日志,比如有一些对音频进行处理的日志,部分日志信息是我们不需要的。
4、关于文件上传的坑
语音文件上传的模式只有一种,即给定一个本地的音频路径。
而如果你使用过七牛云的 SDK 你就深有体会讯飞的这个SDK 是有多烂,七牛云的上传文件的方法,你可以提供文件的本地路径,也支持流上传,当然也支持远程文件地址的方式上传。
三、埋坑史
1、 解决本地jar包的引入
<!-- 科大讯飞语音转文字 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包的时候把本地的 jar 包也打进去:
<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、解决配置文件的读取问题
依着他给个指定的配置文件 config.properties,但是还是按照项目里的一样,区分开发、测试和生产配置文件,然后强制读取本项目的配置,去强制覆盖 LfasrClientImp 类中的变量。
3、解决 LfasrClientImp 类中变量私有化的问题
为什么关注该类中的静态私有变量呢,因为上文中提到有个私有的变量存储错误信息,我们需要调整这个错误信息。
而对于 LfasrClientImp 类中的静态私有属性,我们可以通过反射机制强制刷新属性。
Class<LfasrClientImp> lfasrClientImpClass = LfasrClientImp.class; Field field = lfasrClientImpClass.getDeclaredField("SERV_APP_ID_VAL"); field.setAccessible(true); field.set(lfasrClientImpClass, "testAppId");
4、解决日志的坑
讯飞默认使用的是 log4j,如果很不幸你的项目使用的不是 log4j,要么你做出妥协,要么,就出大绝招:把讯飞 SDK 的 class 文件反编译出来,然后自己改源码,然后两条路可以走,一是再编译成 jar 包,二是直接作为一个 module 来使用。
但是还是建议调整日志框架为 log4j,不要动 SDK,防止版本更新。
5、解决上传接口的坑
上文提到了关于上传的方法,只有一个,即提供一个音频文件的本地地址,然后传给上传的方法。
what?难道我的音频文件不能是远程服务器上的?对于这种情况,我们需要手动进行封装,如果不想封装得太深。
简单的思路就是:下载文件 -> 保存成临时文件 -> 调用方法
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; }
四、大绝招
其实 SDK 的底层就是封装了三样东西,鉴权、http 请求 和 响应,我们完全可以通过观看源码,找出它的鉴权等动作,然后自己封装一套请求,这样就可以完全脱离讯飞的SDK了。
五、备注
附上讯飞 SDK 的 maven 引用:
博客原文地址:http://www.jetchen.cn/xunfei-sdk/
- 上一篇: 网络工程师怎么接私活?给大家整理了各大私活平台,欢迎收藏
- 下一篇: BLE添加特征值
猜你喜欢
- 2024-09-24 BLE添加特征值
- 2024-09-24 网络工程师怎么接私活?给大家整理了各大私活平台,欢迎收藏
- 2024-09-24 PHP7.1安装PDO for SQLSERVER
- 2024-09-24 前端基础_配置IIS服务器
- 2024-09-24 网站搭建——搭建本地服务器:Apache + PHP + MySQL
- 2024-09-24 安装zend framework(搭建、配置)
- 2024-09-24 ????分享windows下mysql备份
- 2024-09-24 编辑HTML常用标签
- 2024-09-24 Window下PHP环境安装
- 2024-09-24 联想实验场之Windows中单Apache运行多PHP版本
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)