(簡體中文|英文|日本文)
SenseVoice是一個語音基礎模型,具有多種語音理解能力,包括自動語音辨識(ASR)、口語辨識(LID)、語音情緒辨識(SER)和音訊事件偵測(AED)。
模型動物園:modelscope、huggingface
線上示範:modelscope 演示、huggingface space
SenseVoice專注於高精準度多語言語音辨識、語音情緒辨識和音訊事件偵測。
我們在開源基準資料集(包括 AISHELL-1、AISHELL-2、Wenetspeech、LibriSpeech 和 Common Voice)上比較了 SenseVoice 和 Whisper 的多語言語音辨識效能。在中文和粵語辨識方面,SenseVoice-Small模型具有優勢。
由於目前缺乏廣泛使用的語音情緒辨識基準和方法,我們在多個測試集上對各種指標進行了評估,並與近期基準的大量結果進行了全面比較。所選測試集包含中英文數據,並包含表演、電影、自然對話等多種風格。在無需對目標資料進行微調的情況下,SenseVoice 能夠達到並超越當前最佳語音情緒辨識模型的效能。
此外,我們在測試集上對比了多個開源語音情緒辨識模型,結果表明,SenseVoice-Large模型在幾乎所有資料集上都取得了最好的效能,而SenseVoice-Small模型也超越了其他開源模型大多數資料集。
儘管專門針對語音資料進行訓練,SenseVoice 仍然可以用作獨立的事件偵測模型。我們將其在環境聲音分類 ESC-50 資料集上的表現與廣泛使用的行業模型 BEATS 和 PANN 進行了比較。 SenseVoice 模型在這些任務上取得了值得稱讚的結果。然而,由於訓練資料和方法的限制,其事件分類性能與專門的 AED 模型相比存在一些差距。
SenseVoice-Small 模型部署非自迴歸端對端架構,從而實現極低的推理延遲。由於參數數量與 Whisper-Small 模型相似,其推斷速度比 Whisper-Small 快 5 倍以上,比 Whisper-Large 快 15 倍。
pip install -r requirements.txt
支援任何格式和任何持續時間的音訊輸入。
from funasr import AutoModel
from funasr . utils . postprocess_utils import rich_transcription_postprocess
model_dir = "iic/SenseVoiceSmall"
model = AutoModel (
model = model_dir ,
trust_remote_code = True ,
remote_code = "./model.py" ,
vad_model = "fsmn-vad" ,
vad_kwargs = { "max_single_segment_time" : 30000 },
device = "cuda:0" ,
)
# en
res = model . generate (
input = f" { model . model_path } /example/en.mp3" ,
cache = {},
language = "auto" , # "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" ])
print ( text )
model_dir
:模型的名稱,或模型在本機磁碟上的路徑。trust_remote_code
:True
時,表示模型的程式碼實作是從remote_code
載入的,它指定model
程式碼的確切位置(例如,目前目錄中的model.py
)。它支援絕對路徑、相對路徑和網路 URL。False
時,表示模型的程式碼實作是 FunASR 內的整合版本。此時,目前目錄下的model.py
所做的修改將不會生效,因為載入的版本是FunASR內部的版本。型號代碼請點擊此處查看。vad_model
:這表示VAD(語音活動偵測)的活化。 VAD 的目的是將長音訊分割成較短的剪輯。在這種情況下,推理時間包括VAD和SenseVoice的總消耗,並代表端對端延遲。如果您想單獨測試SenseVoice模型的推理時間,可以停用VAD模型。vad_kwargs
:指定VAD模型的配置。 max_single_segment_time
:表示vad_model
進行音訊分段的最大時長,單位為毫秒(ms)。use_itn
:輸出結果是否包含標點符號和反文字標準化。batch_size_s
:指示使用動態批次,其中批次中音訊的總持續時間以秒 (s) 為單位。merge_vad
:是否合併VAD模型分割的短音頻片段,合併長度為merge_length_s
,單位為秒(s)。ban_emo_unk
:是否禁止emo_unk
代幣的輸出。如果所有輸入都是短音訊(<30s),需要大量推理來加快推理效率,可以去除VAD模型,並相應設定batch_size
。
model = AutoModel ( model = model_dir , trust_remote_code = True , device = "cuda:0" )
res = model . generate (
input = f" { model . model_path } /example/en.mp3" ,
cache = {},
language = "zh" , # "zh", "en", "yue", "ja", "ko", "nospeech"
use_itn = False ,
batch_size = 64 ,
)
更多使用請參考文檔
支援任意格式的音訊輸入,輸入時長限制為30秒或更短。
from model import SenseVoiceSmall
from funasr . utils . postprocess_utils import rich_transcription_postprocess
model_dir = "iic/SenseVoiceSmall"
m , kwargs = SenseVoiceSmall . from_pretrained ( model = model_dir , device = "cuda:0" )
m . eval ()
res = m . inference (
data_in = f" { kwargs [ 'model_path' ] } /example/en.mp3" ,
language = "auto" , # "zh", "en", "yue", "ja", "ko", "nospeech"
use_itn = False ,
ban_emo_unk = False ,
** kwargs ,
)
text = rich_transcription_postprocess ( res [ 0 ][ 0 ][ "text" ])
print ( text )
# pip3 install -U funasr funasr-onnx
from pathlib import Path
from funasr_onnx import SenseVoiceSmall
from funasr_onnx . utils . postprocess_utils import rich_transcription_postprocess
model_dir = "iic/SenseVoiceSmall"
model = SenseVoiceSmall ( model_dir , batch_size = 10 , quantize = True )
# inference
wav_or_scp = [ "{}/.cache/modelscope/hub/{}/example/en.mp3" . format ( Path . home (), model_dir )]
res = model ( wav_or_scp , language = "auto" , use_itn = True )
print ([ rich_transcription_postprocess ( i ) for i in res ])
注意:ONNX 模型匯出到原始模型目錄。
from pathlib import Path
from funasr_torch import SenseVoiceSmall
from funasr_torch . utils . postprocess_utils import rich_transcription_postprocess
model_dir = "iic/SenseVoiceSmall"
model = SenseVoiceSmall ( model_dir , batch_size = 10 , device = "cuda:0" )
wav_or_scp = [ "{}/.cache/modelscope/hub/{}/example/en.mp3" . format ( Path . home (), model_dir )]
res = model ( wav_or_scp , language = "auto" , use_itn = True )
print ([ rich_transcription_postprocess ( i ) for i in res ])
注意:Libtorch 模型匯出到原始模型目錄。
export SENSEVOICE_DEVICE=cuda:0
fastapi run --port 50000
git clone https://github.com/alibaba/FunASR.git && cd FunASR
pip3 install -e ./
數據舉例
{"key": "YOU0000008470_S0000238_punc_itn", "text_language": "<|en|>", "emo_target": "<|NEUTRAL|>", "event_target": "<|Speech|>", "with_or_wo_itn": "<|withitn|>", "target": "Including legal due diligence, subscription agreement, negotiation.", "source": "/cpfs01/shared/Group-speech/beinian.lzr/data/industrial_data/english_all/audio/YOU0000008470_S0000238.wav", "target_len": 7, "source_len": 140}
{"key": "AUD0000001556_S0007580", "text_language": "<|en|>", "emo_target": "<|NEUTRAL|>", "event_target": "<|Speech|>", "with_or_wo_itn": "<|woitn|>", "target": "there is a tendency to identify the self or take interest in what one has got used to", "source": "/cpfs01/shared/Group-speech/beinian.lzr/data/industrial_data/english_all/audio/AUD0000001556_S0007580.wav", "target_len": 18, "source_len": 360}
完整參考data/train_example.jsonl
描述:
key
: 音訊檔案唯一IDsource
:音訊檔案路徑source_len
:音訊檔案的fbank幀數target
:轉錄target_len
:目標長度text_language
:音訊檔案的語言idemo_target
:音訊檔案的情緒標籤event_target
:音訊檔案的事件標籤with_or_wo_itn
:是否包含標點符號和反文字規範化train_text.txt
BAC009S0764W0121 甚至出现交易几乎停滞的情况
BAC009S0916W0489 湖北一公司以员工名义贷款数十员工负债千万
asr_example_cn_en 所有只要处理 data 不管你是做 machine learning 做 deep learning 做 data analytics 做 data science 也好 scientist 也好通通都要都做的基本功啊那 again 先先对有一些>也许对
ID0012W0014 he tried to think how it could be
train_wav.scp
BAC009S0764W0121 https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/BAC009S0764W0121.wav
BAC009S0916W0489 https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/BAC009S0916W0489.wav
asr_example_cn_en https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example_cn_en.wav
ID0012W0014 https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example_en.wav
train_text_language.txt
語言 ID 包括<|zh|>
、 <| <|en|>
<|yue|>
、 <|ja|>
和<|ko|>
。
BAC009S0764W0121 < | zh | >
BAC009S0916W0489 < | zh | >
asr_example_cn_en < | zh | >
ID0012W0014 < | en | >
train_emo.txt
情緒標籤包括<|HAPPY|>
、 <|SAD|>
、 <|ANGRY|>
、 <|NEUTRAL|>
、 <|FEARFUL|>
、 <|DISGUSTED|>
和<|SURPRISED|>
。
BAC009S0764W0121 < | NEUTRAL | >
BAC009S0916W0489 < | NEUTRAL | >
asr_example_cn_en < | NEUTRAL | >
ID0012W0014 < | NEUTRAL | >
train_event.txt
事件標籤包括<|BGM|>
、 <|Speech|>
、 <|Applause|>
、 <|Laughter|>
> 、 <|Cry|>
、 <|Sneeze|>
、 <|Breath|>
和<|Cough|>
.
BAC009S0764W0121 < | Speech | >
BAC009S0916W0489 < | Speech | >
asr_example_cn_en < | Speech | >
ID0012W0014 < | Speech | >
Command
# generate train.jsonl and val.jsonl from wav.scp, text.txt, text_language.txt, emo_target.txt, event_target.txt
sensevoice2jsonl
++scp_file_list= ' ["../../../data/list/train_wav.scp", "../../../data/list/train_text.txt", "../../../data/list/train_text_language.txt", "../../../data/list/train_emo.txt", "../../../data/list/train_event.txt"] '
++data_type_list= ' ["source", "target", "text_language", "emo_target", "event_target"] '
++jsonl_file_out= " ../../../data/list/train.jsonl "
如果沒有train_text_language.txt
、 train_emo_target.txt
和train_event_target.txt
,將使用SenseVoice
模型自動預測語言、情緒和事件標籤。
# generate train.jsonl and val.jsonl from wav.scp and text.txt
sensevoice2jsonl
++scp_file_list= ' ["../../../data/list/train_wav.scp", "../../../data/list/train_text.txt"] '
++data_type_list= ' ["source", "target"] '
++jsonl_file_out= " ../../../data/list/train.jsonl "
++model_dir= ' iic/SenseVoiceSmall '
確保將finetune.sh中的train_tool修改為先前設定的FunASR安裝目錄中funasr/bin/train_ds.py
的絕對路徑。
bash finetune.sh
python webui.py
如果您在使用上遇到問題,可以直接在github頁面提出Issue。
您也可以掃描以下釘釘群二維碼加入社區群進行交流和討論。
有趣的ASR |
---|