SenseVoiceSmall阿里开源大模型,SenseVoice 是具有音频理解能力的音频基础模型,包括语音识别(ASR)、语种识别(LID)、语音情感识别(SER)和声学事件分类(AEC)或声学事件检测(AED)。经过超过40万小时的数据训练,支持50多种语言
SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测
- 多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。
- 富文本识别:
- 具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。
- 支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。
- 高效推理: SenseVoice-Small 模型采用非自回归端到端框架,推理延迟极低,10s 音频推理仅耗时 70ms,15 倍优于 Whisper-Large。
- 微调定制: 具备便捷的微调脚本与策略,方便用户根据业务场景修复长尾样本问题。
- 服务部署: 具有完整的服务部署链路,支持多并发请求,支持客户端语言有,python、c++、html、java 与 c# 等。
项目地址:https://github.com/FunAudioLLM/SenseVoice
以下为模型调用方法,输出的文字可能会包括一些表情,可以通过正则化的方式移除这些表情:
import pyaudio
import numpy as np
import wave
import os
from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(
model=r"D:\Downloads\SenseVoiceSmall",
trust_remote_code=True,
remote_code="./model.py",
vad_model="fsmn-vad",
vad_kwargs={"max_single_segment_time": 30000},
device="cpu",
use_itn=True,
disable_update=True,
disable_pbar = True,
disable_log = True
)
# 利用语音识别模型将音频数据转换为文本
def sound2text(audio_file):
"""
利用语音识别模型将音频数据转换为文本
"""
# en
res = model.generate(
input=audio_file,
cache={},
language="zh", # "zh", "en", "yue", "ja", "ko", "nospeech"
use_itn=True,
batch_size_s=60,
merge_vad=True, #
merge_length_s=15,
)
text = rich_transcription_postprocess(res[0]["text"])
return text
if __name__ == "__main__":
# 读取音频文件
audio_file = r"C:\Users\lvkong\Desktop\temp_wave\waving_20250513_135512_嗯鹅.wav"
# 如果音频文件存在,直接读取
if os.path.exists(audio_file):
with wave.open(audio_file, 'rb') as wf:
audio_data = wf.readframes(wf.getnframes())
else:
# 否则录制一段音频
print("请开始说话(录音5秒钟)...")
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000
RECORD_SECONDS = 5
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
stream.stop_stream()
stream.close()
p.terminate()
# 保存录音
with wave.open(audio_file, 'wb') as wf:
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
audio_data = b''.join(frames)
print(f"录音已保存为 {audio_file}")
# 利用语音识别模型将音频数据转换为文本
text = sound2text(audio_file)
# 输出文本
print("识别结果:")
print(text)
正则化移除除中文外的其他内容:
# 提取字符串中的汉字
def extract_chinese(input_string):
"""
提取字符串中的汉字
:param input_string: 原始字符串
:return: 转换后的中文字符串
"""
# 使用正则表达式提取所有汉字
chinese_characters = re.findall(r'[\u4e00-\u9fa5]', input_string)
# 将汉字列表合并为字符串
chinese_text = ''.join(chinese_characters)
# 返回中文字符串
return chinese_text
此外,SenseVoiceSmall模型还支持pipeline的方式加载调用
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
inference_pipeline = pipeline(
task=Tasks.auto_speech_recognition,
model=r'D:\Downloads\SenseVoiceSmall',
model_revision="master",
device="cuda:0",
use_itn=True,
disable_update=True)
rec_result = inference_pipeline(r"D:\Project\Chat_Project\output_5.wav")
print(rec_result)