# asr-api **Repository Path**: wfchat/asr-api ## Basic Information - **Project Name**: asr-api - **Description**: 野火语音转文本API服务 - **Primary Language**: Java - **License**: CC-BY-4.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-05 - **Last Updated**: 2025-04-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 野火ASR服务 野火ASR服务包含3个部分,工作流程如下:接口服务接收客户端请求,把请求中的文件地址下载下来后,再调用野火语音转文本服务,得到文本后再调用大模型添加标点符号和修正错误。 ![](./assets/asr_process.png) 1. ***接口服务***:本项目是接口服务,使用springboot编写; 2. ***语音转文本服务***:是个C++服务,是收费的,需要野火提供; 3. ***大模型服务***:Ollama服务,也可以自己部署任意大模型服务,只要能够对文本进行处理就行。 ## 费用 野火语音转文本服务是收费的,价格不贵,关于野火价格请点击[这里](https://docs.wildfirechat.cn/price/),可以先用野火部署的测试服务进行测试,如果测试效果满意,请联系野火购买软件包或者源码。 ## 依赖 只支持X86_64和ARM64 CPU和Linux系统。因为使用了[ggml](https://github.com/ggml-org/ggml),一些旧的CPU和旧的Linux系统不能支持,所以当购买之前先联系我们获取测试版本验证,另外在现场使用过程中要有条件升级硬件和软件系统。 ## 启动ASR服务的步骤: 接口服务、语音转文本服务和大模型服务可以部署到一起,也可以分开部署。下面是部署方法: ### 1. 安装ffmpeg 语音转文本服务需要使用ffmpeg来把各种音频格式转化为wav文件格式。在语音转文本服务器上安装ffmpeg工具。具体安装方法请网上查询。 ### 2. 启动wf-voice服务 野火语音转文本服务软件包解压,得到一个可执行文件。模型文件在[model](./model)目录,把可执行文件和model目录放到一起,用如下命令启动: ``` nohup ./wf-voice -m ./model/wf-voice-small.gguf -p 4 2>&1 & ``` 其中命令中```-p```这个参数是指定允许并行的个数,每路需要2核CPU。如果是单独部署,```-p```参数应设置为cpu核数/2。如果是与其他服务部署,则规划好为这个服务分配多少核CPU,参数为CPU/2。 这个服务是分CPU架构的,注意要是用正确架构版本。 启动后,服务监听12435端口。 ### 3. 启动ollama服务 从网上查找Ollama的安装方法,安装后执行: ``` export OLLAMA_KEEP_ALIVE=-1 && export OLLAMA_NUM_PARALLEL=4 && nohup ollama serve 2>&1 & ``` ollama默认监听11434端口。```OLLAMA_NUM_PARALLEL```是允许并行的个数,测试发现每路需要2CPU/5GB内存,请设置合适的数字避免内存和CPU不够用。 ### 4. ollama拉取大模型 我们推荐yasserrmd/Qwen2.5-7B-Instruct-1M,基本可以平衡性能和效果。如果你们有自己的也可以替换为自己的。 ``` ollama pull yasserrmd/Qwen2.5-7B-Instruct-1M ``` ### 5. 创建数据库 接口服务需要使用数据库。部署MySQL数据库,执行如下命令创建asr数据库 ``` create database asr; ``` ### 6. 启动ASR服务 修改本项目配置文件,配置语音转文本服务和大模型服务的地址。默认配置是本机,如果部署在同一台服务器上不用修改配置。 使用命令```mvn clean package```打包本项目代码,把jar包放到服务器上使用命令执行: ``` java -jar asr-api-0.1.jar ``` ### 7. 防火墙 * 语音转文字服务:不需要对外访问,12435端口接收接口服务的请求。防火墙禁止出访;只允许接口服务访问12435端口,其他地址和端口禁止入访。 * 大模型服务:不需要对外访问,11434端口接收接口服务的请求。防火墙禁止出访;只允许接口服务访问11434端口,其他地址和端口禁止入访。 * 接口服务:需要访问语音转文字服务的12435端口和大模型服务的11434端口;需要对外访问能够把语音文件下载下来;需要暴露8200给客户端调用。1,出访语音转文字服务的12435端口,出访大模型服务的11434端口;2,出访对象存储服务IP和端口(如果链接可能是任意地址,那就是需要出访全部开放了);3,放开8200的入访。 如果部署在同一台服务器上:1,出访对象存储服务IP和端口(如果链接可能是任意地址,那就是需要出访全部开放了); 2,放开8200的入访。 ### 8. 使用命令测试: 在接口服务所在服务器上使用命令测试: ``` curl -X POST -H "Content-Type: application/json" -d '{"url":"https://media.wfcoss.cn/firechat/222.m4a", "noReuse":true}' http://127.0.0.1:8200/api/recognize ``` ## 接口 只有一个API,请参考测试命令: ``` curl -X POST -H "Content-Type: application/json" -d '{"url":"https://media.wfcoss.cn/firechat/222.m4a", "noReuse":true}' http://127.0.0.1:8200/api/recognize ``` url为语音文件链接,可以是常见语音格式;noReuse不复用之前的结果,当为false时,如果有历史请求,会立即返回历史结果。上线时noReuse要为false;测试时注意设置合适的参数。 ## 反向代理 这是个HTTP的服务,有可能使用反向代理或者负载均衡。为了尽快展现给用户,响应是流式返回的,如果使用NG等反向代理或者负载均衡等,需要关闭掉缓存。在Nginx配置中添加: ```nginx proxy_buffering off; ``` 在其他反向代理或者负载均衡请查找手册关闭缓存功能。 ## 常见问题 ### 1. 性能如何? A. 语音转文本服务性能非常好,2核心CPU每秒可以处理5-10秒语音,使用CPU即可。大模型服务性能就差一点,需要较高性能,最好能使用GPU,由于是流式响应,很快就得到响应数据,体验也不错。 ### 2. 是否可以不用大模型? A. 语音转文本的效果也算可以,但没有标点符号和断句,如果只要语音转文本服务,性能会非常好。可以在配置文件中关掉大模型,或者请求参数不使用大模型。但建议还是用上大模型,做一些简单的校正和添加标点符号。 ### 3. 如何替换别的大模型? A. 可以替换别的大模型,使用大模型把转换回来的文字进行修正和添加标点就行。 ### 4. 有时发现特别慢? A. 我们发现当CPU出现竞争时会特别慢。注意配置路数,避免超过CPU总数。 ### 5. 测试发现等待较长时间,然后一次出现响应,不像野火测试服务一小段一小段返回? A. 这有可能网络中间环节有缓存。请在接口服务器上,使用```curl -X POST -H "Content-Type: application/json" -d '{"url":"https://media.wfcoss.cn/firechat/222.m4a", "noReuse":true}' http://127.0.0.1:8200/api/recognize``` 测试看看是不是一小段一小段的响应。确认服务正常后,再去查找是中间那个环节出了问题。如果有nginx或者其他网络中间件,请检查是否没有关闭了缓存。 ### 6. 如何添加认证信息,避免被盗用? A. 本项目中其实包含了认证相关的代码,请参考配置文件中的```server.need_signature```,根据这个配置可以找到相关代码。可以使用[SignUtils](./src/main/java/cn/wildfirechat/asr/utilis/SignUtils.java),来生成签名。如果需要认证,可以参考已有代码进行二开。 ### 7. 如何处理统计数据 A. 本项目把每个请求都记录到了数据库中,可以二开来统计转换的各种信息。 ### 8. 配置需求? A. 接口服务配置需求较低,没有太多计算任务,要下载链接文件,一般文件比较小,能很快下载就行。 另外两个服务需要大量的计算,因此需要选用高频率的CPU。准备硬件资源,需要考虑同时支持路数。 语音转文字服务每路占用2CPU/1GB内存,每秒能处理5秒的语音; 大模型服务每路2CPU/5GB,每秒能够处理2秒的语音(文字);没有测试过GPU加速的,最好是能够使用GPU加速,这个需要客户自己验证。 以上数据是在某云服务器上测试得出,由于环境各不相同,所以测试结果仅供参考。 假设是1台16C32G服务器,那么可以设置语音转文字服务3路,占用6CPU/3GB内存;设置大模型5路,占用10CPU/25GB内存。吞吐量每秒钟可以处理10-20秒的语音。