fast-whisper é uma reimplementação do modelo Whisper da OpenAI usando CTranslate2, que é um mecanismo de inferência rápida para modelos Transformer.
Esta implementação é até 4 vezes mais rápida que openai/whisper para a mesma precisão e usando menos memória. A eficiência pode ser melhorada ainda mais com a quantização de 8 bits na CPU e na GPU.
Para referência, aqui está o tempo e o uso de memória necessários para transcrever 13 minutos de áudio usando diferentes implementações:
Implementação | Precisão | Tamanho do feixe | Tempo | Máx. Memória GPU | Máx. Memória da CPU |
---|---|---|---|---|---|
openai/sussurro | fp16 | 5 | 4m30s | 11.325 MB | 9.439 MB |
sussurro mais rápido | fp16 | 5 | 54 anos | 4755MB | 3.244 MB |
sussurro mais rápido | int8 | 5 | anos 59 | 3.091 MB | 3.117 MB |
Executado com CUDA 11.7.1 em um NVIDIA Tesla V100S.
Implementação | Precisão | Tamanho do feixe | Tempo | Máx. memória |
---|---|---|---|---|
openai/sussurro | fp32 | 5 | 10m31s | 3.101 MB |
sussurro.cpp | fp32 | 5 | 17m42s | 1581 MB |
sussurro.cpp | fp16 | 5 | 12m39s | 873 MB |
sussurro mais rápido | fp32 | 5 | 2m44s | 1.675 MB |
sussurro mais rápido | int8 | 5 | 2m04s | 995 MB |
Executado com 8 threads em um Intel(R) Xeon(R) Gold 6226R.
Implementação | Precisão | Tamanho do feixe | Tempo | Gigafala WER |
---|---|---|---|---|
distil-whisper/distil-grande-v2 | fp16 | 4 | - | 10.36 |
destilação mais rápida-grande-v2 | fp16 | 5 | - | 10.28 |
distil-whisper/distil-medium.en | fp16 | 4 | - | 21/11 |
fast-distil-medium.en | fp16 | 5 | - | 21/11 |
Executado com CUDA 11.4 em NVIDIA 3090.
Para distil-whisper/distil-large-v2
, o WER é testado com amostra de código do link. para faster-distil-whisper
, o WER é testado com a configuração:
from faster_whisper import WhisperModel
model_size = "distil-large-v2"
# model_size = "distil-medium.en"
# Run on GPU with FP16
model = WhisperModel ( model_size , device = "cuda" , compute_type = "float16" )
segments , info = model . transcribe ( "audio.mp3" , beam_size = 5 , language = "en" )
A execução da GPU requer a instalação das seguintes bibliotecas NVIDIA:
Nota : As versões mais recentes do ctranslate2
suportam apenas CUDA 12 e cuDNN 9. Para CUDA 11 e cuDNN 8, a solução alternativa atual é fazer o downgrade para a versão 3.24.0
do ctranslate2
, para CUDA 12 e cuDNN 8, fazer o downgrade para a versão 4.4.0
de ctranslate2
, (Isso pode ser feito com pip install --force-reinstall ctranslate2==4.4.0
ou especificando a versão em requirements.txt
).
Existem várias maneiras de instalar as bibliotecas NVIDIA mencionadas acima. A forma recomendada está descrita na documentação oficial da NVIDIA, mas também sugerimos outros métodos de instalação abaixo.
Nota: Para todos os métodos abaixo, tenha em mente a nota acima sobre as versões CUDA. Dependendo da sua configuração, pode ser necessário instalar as versões CUDA 11 das bibliotecas que correspondem às bibliotecas CUDA 12 listadas nas instruções abaixo.
As bibliotecas (cuBLAS, cuDNN) estão instaladas nestas imagens oficiais do NVIDIA CUDA Docker: nvidia/cuda:12.3.2-cudnn9-runtime-ubuntu22.04
.
pip
(somente Linux) No Linux essas bibliotecas podem ser instaladas com pip
. Observe que LD_LIBRARY_PATH
deve ser definido antes de iniciar o Python.
pip install nvidia-cublas-cu12 nvidia-cudnn-cu12==9. *
export LD_LIBRARY_PATH= ` python3 -c ' import os; import nvidia.cublas.lib; import nvidia.cudnn.lib; print(os.path.dirname(nvidia.cublas.lib.__file__) + ":" + os.path.dirname(nvidia.cudnn.lib.__file__)) ' `
O Whisper-standalone-win do Purfview fornece as bibliotecas NVIDIA necessárias para Windows e Linux em um único arquivo. Descompacte o arquivo e coloque as bibliotecas em um diretório incluído no PATH
.
O módulo pode ser instalado a partir do PyPI:
pip install faster-whisper
pip install --force-reinstall " faster-whisper @ https://github.com/SYSTRAN/faster-whisper/archive/refs/heads/master.tar.gz "
pip install --force-reinstall " faster-whisper @ https://github.com/SYSTRAN/faster-whisper/archive/a4f1cc8f11433e454c3934442b5e1a4ed5e865c3.tar.gz "
from faster_whisper import WhisperModel
model_size = "large-v3"
# Run on GPU with FP16
model = WhisperModel ( model_size , device = "cuda" , compute_type = "float16" )
# or run on GPU with INT8
# model = WhisperModel(model_size, device="cuda", compute_type="int8_float16")
# or run on CPU with INT8
# model = WhisperModel(model_size, device="cpu", compute_type="int8")
segments , info = model . transcribe ( "audio.mp3" , beam_size = 5 )
print ( "Detected language '%s' with probability %f" % ( info . language , info . language_probability ))
for segment in segments :
print ( "[%.2fs -> %.2fs] %s" % ( segment . start , segment . end , segment . text ))
Aviso: segments
é um gerador , portanto a transcrição só começa quando você itera sobre ela. A transcrição pode ser concluída reunindo os segmentos em uma lista ou em um loop for
:
segments , _ = model . transcribe ( "audio.mp3" )
segments = list ( segments ) # The transcription will actually run here.
O trecho de código a seguir ilustra como executar a transcrição em lote em um arquivo de áudio de exemplo. BatchedInferencePipeline.transcribe
é um substituto imediato para WhisperModel.transcribe
from faster_whisper import WhisperModel , BatchedInferencePipeline
model = WhisperModel ( "turbo" , device = "cuda" , compute_type = "float16" )
batched_model = BatchedInferencePipeline ( model = model )
segments , info = batched_model . transcribe ( "audio.mp3" , batch_size = 16 )
for segment in segments :
print ( "[%.2fs -> %.2fs] %s" % ( segment . start , segment . end , segment . text ))
Os pontos de verificação Distil-Whisper são compatíveis com o pacote Faster-Whisper. Em particular, o ponto de verificação distil-large-v3 mais recente foi intrinsecamente projetado para funcionar com o algoritmo de transcrição Faster-Whisper. O trecho de código a seguir demonstra como executar inferência com distil-large-v3 em um arquivo de áudio especificado:
from faster_whisper import WhisperModel
model_size = "distil-large-v3"
model = WhisperModel ( model_size , device = "cuda" , compute_type = "float16" )
segments , info = model . transcribe ( "audio.mp3" , beam_size = 5 , language = "en" , condition_on_previous_text = False )
for segment in segments :
print ( "[%.2fs -> %.2fs] %s" % ( segment . start , segment . end , segment . text ))
Para obter mais informações sobre o modelo distil-large-v3, consulte o cartão do modelo original.
segments , _ = model . transcribe ( "audio.mp3" , word_timestamps = True )
for segment in segments :
for word in segment . words :
print ( "[%.2fs -> %.2fs] %s" % ( word . start , word . end , word . word ))
A biblioteca integra o modelo Silero VAD para filtrar partes do áudio sem fala:
segments , _ = model . transcribe ( "audio.mp3" , vad_filter = True )
O comportamento padrão é conservador e remove apenas o silêncio por mais de 2 segundos. Veja os parâmetros VAD disponíveis e os valores padrão no código-fonte. Eles podem ser personalizados com o argumento do dicionário vad_parameters
:
segments , _ = model . transcribe (
"audio.mp3" ,
vad_filter = True ,
vad_parameters = dict ( min_silence_duration_ms = 500 ),
)
O filtro Vad é habilitado por padrão para transcrição em lote.
O nível de log da biblioteca pode ser configurado assim:
import logging
logging . basicConfig ()
logging . getLogger ( "faster_whisper" ). setLevel ( logging . DEBUG )
Veja mais opções de modelo e transcrição na implementação da classe WhisperModel
.
Aqui está uma lista não exaustiva de projetos de código aberto usando sussurro mais rápido. Sinta-se à vontade para adicionar seu projeto à lista!
faster-whisper
. É facilmente implantável com Docker, funciona com OpenAI SDKs/CLI, oferece suporte a streaming e transcrição ao vivo..lrc
no idioma desejado usando OpenAI-GPT. Ao carregar um modelo de seu tamanho, como WhisperModel("large-v3")
, o modelo CTranslate2 correspondente é baixado automaticamente do Hugging Face Hub.
Também fornecemos um script para converter qualquer modelo Whisper compatível com a biblioteca Transformers. Eles podem ser os modelos OpenAI originais ou modelos ajustados pelo usuário.
Por exemplo, o comando abaixo converte o modelo Whisper "large-v3" original e salva os pesos no FP16:
pip install transformers[torch] > =4.23
ct2-transformers-converter --model openai/whisper-large-v3 --output_dir whisper-large-v3-ct2
--copy_files tokenizer.json preprocessor_config.json --quantization float16
--model
aceita um nome de modelo no Hub ou um caminho para um diretório de modelo.--copy_files tokenizer.json
não for usada, a configuração do tokenizer será baixada automaticamente quando o modelo for carregado posteriormente.Os modelos também podem ser convertidos a partir do código. Consulte a API de conversão.
model = faster_whisper . WhisperModel ( "whisper-large-v3-ct2" )
model = faster_whisper . WhisperModel ( "username/whisper-large-v3-ct2" )
Se você estiver comparando o desempenho com outras implementações do Whisper, certifique-se de executar a comparação com configurações semelhantes. Em particular:
model.transcribe
usa um tamanho de feixe padrão de 1, mas aqui usamos um tamanho de feixe padrão de 5.OMP_NUM_THREADS
, que pode ser definida ao executar seu script: OMP_NUM_THREADS=4 python3 my_script.py