使用FunASR处理语音识别

FunASR是阿里的一个语音识别工具,比SpeechRecognition功能多安装也很简单;

官方介绍:FunASR是一个基础语音识别工具包,提供多种功能,包括语音识别(ASR)、语音端点检测(VAD)、标点恢复、语言模型、说话人验证、说话人分离和多人对话语音识别等。FunASR提供了便捷的脚本和教程,支持预训练好的模型的推理与微调。

网址:FunASR/README_zh.md at main · alibaba-damo-academy/FunASR · GitHub

安装直接用:pip install funasr  -i https://pypi.tuna.tsinghua.edu.cn/simple

读取音频需要(我没ffmpeg):pip install torchaudio  -i https://pypi.tuna.tsinghua.edu.cn/simple

官网说:如果需要使用工业预训练模型,安装modelscope(可选)pip install modelscope  -i https://pypi.tuna.tsinghua.edu.cn/simple

如果按照官网的代码直接使用model名,第一次使用这个model时,会自动下载对应的model,会在C:\Users\你的用户名\.cache目录里新建modelscope文件夹,将所用到的model下载到里面;

model = AutoModel(model="paraformer-zh",  vad_model="fsmn-vad", punc_model="ct-punc", 
                  # spk_model="cam++"
                  )

所用到的model会在/modelscope/hub/iic/目录里找到,可以拷贝出来使用,代码里直接指定model目录;

也可以自己去他们网站下载model拿来用:FunASR/model_zoo at main · alibaba-damo-academy/FunASR · GitHub

model直接搞出来用:

语音转文字demo:

#!/usr/bin/env python3
# coding = utf-8
"""
# Project: workspace_py
# File: test_funasr.py
# Author: XWF
# Time: 2024/4/15 16:14
"""

from funasr import AutoModel

print('test')

model_path = 'models/modelscope/hub/iic/speech_seaco_paraformer_large_asr_nat-zh-cn-16k-common-vocab8404-pytorch'
vad_path = 'models/modelscope/hub/iic/speech_fsmn_vad_zh-cn-16k-common-pytorch'
punc_path = 'models/modelscope/hub/iic/punc_ct-transformer_zh-cn-common-vocab272727-pytorch'
model = AutoModel(model=model_path,  # model_revision="v2.0.4",
                  vad_model=vad_path,  # vad_model_revision="v2.0.4", vad_kwargs={},
                  punc_model=punc_path,  # punc_model_revision="v2.0.4", punc_kwargs={},
                  # device='cuda:0',
                  device='cpu',
                  ncpu=4,
                  # spk_model="cam++", spk_model_revision="v2.0.4",
                  disable_log=True,
                  disable_pbar=True
                  )

res = model.generate(input='test_24000_16.wav', batch_size_s=300)
print(res)
print(type(res), type(res[0]), res[0].get('text'))

# res = model.generate(input='test_8000_16.pcm', batch_size_s=300)
# print(res)
# print(res[0].get('text'))

with open('test_24000_16.wav', 'rb') as f:
    wav_data = f.read()
res = model.generate(input=wav_data,batch_size_s=1)
print(res)

with open('test_8000_16.pcm', 'rb') as f:
    pcm_data = f.read()
res = model.generate(input=pcm_data, batch_size_s=1)
print(res)

运行结果:

弄到model后直接使用model目录指定model就行,不用再下载了,也不用指定版本;

也可以使用各个model_version指定版本,下载的时候会使用指定的版本下载;

在AutoModel里使用disable_log=True和disable_pbar=True可以关闭那些红红的打印日志,不然满屏幕就会这样:

但是不知道input='test_8000_16.pcm'为啥老是找不到文件报错,跑不通,设置了fs好像也不行;

官网还有许多其他的功能可以去看看;

关于input直接用wav文件正确,但用wav的bytes就识别不对的问题,我去GitHup提问有人告诉我直接使用wav文件,会识别wav头重新调整采样率等信息,而使用bytes不会重新采样,所以使用非16k的会识别错误,得到的方法大概就是换用8k的模型,或者设置采样率参数;

但是设置的fs参数可能需要自己调,好像也不一定就直接是采样率,可能跟别的有关;

### 集成 FunASR 实现原生项目的实时语音识别 #### 修改 WebSocket 地址 为了使 FunASR 能够正常工作,在 Android 项目中需先修改 `WebSocket` 的地址 ASR_HOST,将其设置为所使用的服务器 IP 地址。这一步骤至关重要,因为只有当客户端能够成功连接至服务器时,才能获取到语音识别的结果[^3]。 ```java // 假设在某个配置文件或常量类中定义了这个变量 public static final String ASR_HOST = "ws://your.server.ip.address"; ``` #### 添加依赖项 确保项目已引入必要的库来支持 WebSockets 和其他可能需要的功能。通常情况下,可以通过 Gradle 文件添加相应的依赖: ```gradle dependencies { implementation 'org.java_websocket:Java-WebSocket:1.5.2' } ``` #### 初始化并启动监听器 创建一个新的线程用于处理来自麦克风的数据流,并通过 WebSocket 发送到远程服务器进行处理。一旦接收到响应,则解析 JSON 数据以提取最终的文字结果。 ```java import org.java_websocket.client.WebSocketClient; import org.json.JSONObject; ... private void startListening() { // 创建 WebSocket 客户端实例... wsClient = new WebSocketClient(URI.create(ASR_HOST)) { @Override public void onOpen(ServerHandshake handshakedata) { Log.d(TAG, "Connected to server"); } @Override public void onClose(int code, String reason, boolean remote) { Log.d(TAG, "Connection closed by " + (remote ? "server" : "us")); } @Override public void onError(Exception ex) { Log.e(TAG, "Error occurred", ex); } @Override public void onMessage(String message) { try { JSONObject jsonResult = new JSONObject(message); if (!jsonResult.isNull("result")) { String recognizedText = jsonResult.getString("result"); runOnUiThread(() -> textView.setText(recognizedText)); } } catch (JSONException e) { e.printStackTrace(); } } }; // 连接到 WebSocket 服务器... wsClient.connect(); // 开始录音并将音频数据发送给服务器... audioRecord.startRecording(); byte[] buffer = new byte[BUFFER_SIZE]; while(isListening){ int bytesRead = audioRecord.read(buffer, 0, BUFFER_SIZE); if(wsClient.isOpen()){ wsClient.send(Base64.encodeToString(buffer, Base64.DEFAULT)); } } } @Override protected void onDestroy(){ super.onDestroy(); isListening = false; audioRecord.stop(); audioRecord.release(); if(wsClient != null && wsClient.isOpen()) wsClient.close(); } ``` 上述代码展示了如何在一个简单的 Android 应用程序中集成了 FunASR 来实现实时语音转文字功能。需要注意的是实际开发环境中还需要考虑更多细节问题,比如权限管理、UI 更新机制以及异常情况下的恢复策略等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值