(简体中文|Anglais|日本語)
SenseVoice est un modèle de base de la parole doté de plusieurs capacités de compréhension de la parole, notamment la reconnaissance automatique de la parole (ASR), l'identification de la langue parlée (LID), la reconnaissance des émotions vocales (SER) et la détection d'événements audio (AED).
Zoo modèle : modelscope, huggingface
Démo en ligne : démo modelscope, espace huggingface
SenseVoice se concentre sur la reconnaissance vocale multilingue de haute précision, la reconnaissance des émotions vocales et la détection d'événements audio.
Nous avons comparé les performances de reconnaissance vocale multilingue entre SenseVoice et Whisper sur des ensembles de données de référence open source, notamment AISHELL-1, AISHELL-2, Wenetspeech, LibriSpeech et Common Voice. En termes de reconnaissance du chinois et du cantonais, le modèle SenseVoice-Small présente des avantages.
En raison du manque actuel de références et de méthodes largement utilisées pour la reconnaissance des émotions vocales, nous avons effectué des évaluations de diverses mesures sur plusieurs ensembles de tests et effectué une comparaison complète avec de nombreux résultats de références récentes. Les ensembles de tests sélectionnés englobent des données en chinois et en anglais et incluent plusieurs styles tels que des performances, des films et des conversations naturelles. Sans peaufiner les données cibles, SenseVoice a pu atteindre et dépasser les performances des meilleurs modèles actuels de reconnaissance des émotions vocales.
De plus, nous avons comparé plusieurs modèles open source de reconnaissance des émotions vocales sur les ensembles de tests, et les résultats indiquent que le modèle SenseVoice-Large a obtenu les meilleures performances sur presque tous les ensembles de données, tandis que le modèle SenseVoice-Small a également surpassé les autres modèles open source sur la majorité des ensembles de données.
Bien qu'entraîné exclusivement sur les données vocales, SenseVoice peut toujours fonctionner comme un modèle de détection d'événements autonome. Nous avons comparé ses performances sur l'ensemble de données de classification des bruits environnementaux ESC-50 avec les modèles industriels largement utilisés BEATS et PANN. Le modèle SenseVoice a obtenu des résultats louables sur ces tâches. Cependant, en raison des limites des données et de la méthodologie de formation, ses performances de classification des événements présentent certaines lacunes par rapport aux modèles AED spécialisés.
Le modèle SenseVoice-Small déploie une architecture de bout en bout non autorégressive, ce qui entraîne une latence d'inférence extrêmement faible. Avec un nombre de paramètres similaire à celui du modèle Whisper-Small, il déduit plus de 5 fois plus vite que Whisper-Small et 15 fois plus rapide que Whisper-Large.
pip install -r requirements.txt
Prend en charge l'entrée audio dans n'importe quel format et de n'importe quelle durée.
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
: Le nom du modèle ou le chemin d'accès au modèle sur le disque local.trust_remote_code
:True
, cela signifie que l'implémentation du code du modèle est chargée à partir de remote_code
, qui spécifie l'emplacement exact du code model
(par exemple, model.py
dans le répertoire actuel). Il prend en charge les chemins absolus, les chemins relatifs et les URL réseau.False
, cela indique que l'implémentation du code du modèle est la version intégrée dans FunASR. Pour le moment, les modifications apportées à model.py
dans le répertoire courant ne seront pas effectives, car la version chargée est la version interne de FunASR. Pour le code du modèle, cliquez ici pour voir.vad_model
: Ceci indique l'activation du VAD (Voice Activity Detection). Le but de VAD est de diviser l’audio long en clips plus courts. Dans ce cas, le temps d'inférence inclut à la fois la consommation totale de VAD et de SenseVoice et représente la latence de bout en bout. Si vous souhaitez tester le temps d'inférence du modèle SenseVoice séparément, le modèle VAD peut être désactivé.vad_kwargs
: Spécifie les configurations pour le modèle VAD. max_single_segment_time
: désigne la durée maximale de segmentation audio par le vad_model
, l'unité étant la milliseconde (ms).use_itn
: indique si le résultat de sortie inclut la ponctuation et la normalisation inverse du texte.batch_size_s
: indique l'utilisation du traitement par lots dynamique, où la durée totale de l'audio dans le lot est mesurée en secondes (s).merge_vad
: s'il faut fusionner de courts fragments audio segmentés par le modèle VAD, avec la longueur fusionnée étant merge_length_s
, en secondes (s).ban_emo_unk
: s'il faut interdire la sortie du jeton emo_unk
. Si toutes les entrées sont des audios courts (<30 s) et qu'une inférence par lots est nécessaire pour accélérer l'efficacité de l'inférence, le modèle VAD peut être supprimé et batch_size
peut être défini en conséquence.
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 ,
)
Pour plus d'utilisation, veuillez vous référer à la documentation
Prend en charge l'entrée audio dans n'importe quel format, avec une limite de durée d'entrée de 30 secondes ou moins.
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 ])
Remarque : le modèle ONNX est exporté vers le répertoire du modèle d'origine.
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 ])
Remarque : le modèle Libtorch est exporté vers le répertoire du modèle d'origine.
export SENSEVOICE_DEVICE=cuda:0
fastapi run --port 50000
git clone https://github.com/alibaba/FunASR.git && cd FunASR
pip3 install -e ./
Exemples de données
{"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}
Référence complète à data/train_example.jsonl
Description:
key
: identifiant unique du fichier audiosource
:chemin d'accès au fichier audiosource_len
:nombre d'images fbank du fichier audiotarget
:transcriptiontarget_len
:longueur de la cibletext_language
:identifiant de langue du fichier audioemo_target
:étiquette d'émotion du fichier audioevent_target
:étiquette d'événement du fichier audiowith_or_wo_itn
:inclut la ponctuation et la normalisation inverse du texte 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
Les identifiants de langue incluent <|zh|>
、 <|en|>
、 <|yue|>
、 <|ja|>
et <|ko|>
.
BAC009S0764W0121 < | zh | >
BAC009S0916W0489 < | zh | >
asr_example_cn_en < | zh | >
ID0012W0014 < | en | >
train_emo.txt
Les étiquettes d'émotion incluent <|HAPPY|>
、 <|SAD|>
、 <|ANGRY|>
、 <|NEUTRAL|>
、 <|FEARFUL|>
、 <|DISGUSTED|>
et <|SURPRISED|>
.
BAC009S0764W0121 < | NEUTRAL | >
BAC009S0916W0489 < | NEUTRAL | >
asr_example_cn_en < | NEUTRAL | >
ID0012W0014 < | NEUTRAL | >
train_event.txt
Les étiquettes d'événements incluent <|BGM|>
、 <|Speech|>
、 <|Applause|>
、 <|Laughter|>
、 <|Cry|>
、 <|Sneeze|>
、 <|Breath|>
et <|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 "
S'il n'y a pas train_text_language.txt
, train_emo_target.txt
et train_event_target.txt
, la langue, l'émotion et l'étiquette de l'événement seront prédites automatiquement à l'aide du modèle 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 '
Assurez-vous de modifier train_tool dans finetune.sh par le chemin absolu de funasr/bin/train_ds.py
à partir du répertoire d'installation FunASR que vous avez configuré précédemment.
bash finetune.sh
python webui.py
Si vous rencontrez des problèmes d'utilisation, vous pouvez directement signaler des problèmes sur la page github.
Vous pouvez également scanner le code QR du groupe DingTalk suivant pour rejoindre le groupe communautaire pour la communication et la discussion.
AmusantASR |
---|