Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save turicas/da12b3c8e67a27e088d12d9c41be65d9 to your computer and use it in GitHub Desktop.
Save turicas/da12b3c8e67a27e088d12d9c41be65d9 to your computer and use it in GitHub Desktop.
Transcrição de textos em Português com whisper (OpenAI)
{
"cells": [
{
"cell_type": "markdown",
"source": [
"# Transcrição de textos em Português com whisper (OpenAI)\n",
"\n",
"Tutorial desenvolvido por [Álvaro Justen](https://twitter.com/turicas).\n",
"\n",
"Esse tutorial foi desenvolvido para ser executado no ambiente do [Google Colab](https://colab.research.google.com/). Acesse a [versão original do notebook](https://colab.research.google.com/drive/1hDJJNBsl4I3awJuAV2oTKyU0zUUttS_9#scrollTo=Rh3UMmOE3oFk) para facilitar o uso.\n",
"\n",
"Para transcrever um áudio e baixar os arquivos (tanto da transcrição quanto da legenda, que possui os tempos), execute os seguintes passos:\n",
"1. Copie esse notebook para seu Drive (menu \"File\" > \"Save a copy in Drive\");\n",
"1. Com a sua cópia desse notebook aberta, feche essa versão e suba o arquivo de áudio que deseja transcrever. Você pode fazer isso de 2 formas diferentes:\n",
" - Clique no ícone de pasta ![Gerenciador de arquivos](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAAkCAIAAACFVbTMAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA10lEQVRYhe3XoQ6DMBAG4HWZoRpbj8b2SdA8XJ/kt8VWU4u+k0xgyLYebBlLFu6X7R1fQ0obzDzPl5/n+ntSVVVVVXUzt9IEEQEYhuFh3DnXdd1RaggBwPN4SomI+r4/RI0xlqYAMLNz7uWstdZ7b639RGVmoS3GKCxrHEf5ZRTVJd77uq7lmnWmaXq5G95Wm6bZr6aUABCRXHam71VVVf9dLZ4SVVUxc87ZGLP/cTnnpfdDtW1bACGE/eS6Vy4wpT+O5X4VjniB3LxziuqhOdMeVlXV7+UONYVZvf36YV8AAAAASUVORK5CYII=) no canto esquerdo, depois no ícone de seta para cima ![Upload de arquivos](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAsCAIAAACYDW0sAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABZ0lEQVRYhe3YLZKDMBgG4K87axKLBgsWLLo6WLA5BGcAjc0dyCHQWLDxWJCsyAzTgQ75KbQ7u7wqE9I8hOaH9jbPM3wiXx9RL/iCL/iCX8m3soUQom3bnQYY4/v9fjDcNA1jTNmLEIJSagQrHnVd1zq9aN7fYxQjHoYBAAghhJCnDYqi6Pte2gCgP+4jJ5fRuA+e1fr28ctJ0z5lHevYZ20gcq7tRL2B7CdN03EcV6RSPQD2PG9VI1eXMi896tVYjWIPM8bKsrS2LWHGWNM0Qoiqqt4HS1WWu64z3aUt4UdVxuKEMIYXFSEka2TBwjaDgyAAANd1l1OIUuq67nJJP2brOI5jhFAQBEIIWYMxzvO867ooik6EAWALYIxNVfjVL3tPgzH2fV8W3gp7npfnud1ntWCE0DRNnHPOuVG/juPsN1B8x1mWGXlLkiTZb3BT/geifKHfJgzD7XFpDJ+U//ej7YL/PvwDoRKSyOZG/N4AAAAASUVORK5CYII=) e escolha o arquivo; ou\n",
" - Clique no ícone de pasta no canto esquerdo ![Gerenciador de arquivos](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAAkCAIAAACFVbTMAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA10lEQVRYhe3XoQ6DMBAG4HWZoRpbj8b2SdA8XJ/kt8VWU4u+k0xgyLYebBlLFu6X7R1fQ0obzDzPl5/n+ntSVVVVVXUzt9IEEQEYhuFh3DnXdd1RaggBwPN4SomI+r4/RI0xlqYAMLNz7uWstdZ7b639RGVmoS3GKCxrHEf5ZRTVJd77uq7lmnWmaXq5G95Wm6bZr6aUABCRXHam71VVVf9dLZ4SVVUxc87ZGLP/cTnnpfdDtW1bACGE/eS6Vy4wpT+O5X4VjniB3LxziuqhOdMeVlXV7+UONYVZvf36YV8AAAAASUVORK5CYII=) e arraste o arquivo para a área abaixo do ícone da pasta (onde a pasta `sample_data` está);\n",
"1. Coloque o nome do arquivo que deseja transcrever na célula de código ao fim do notebook: troque `nome do arquivo.mp3` pelo nome do arquivo que você fez upload no passo anterior. Maiúsculas são diferentes de minúsculas; mantenha as aspas;\n",
"1. Escolha um dos modelos disponíveis (mais detalhes abaixo) e edite a célula de código, trocando `medium` pelo modelo desejado. Mantenha as aspas. Maiúsculas são diferentes de minúsculas; mantenha as aspas. O modelo `small` costuma ter boa acurácia com baixo tempo de processamento;\n",
"1. Clique no botão *play* ![2023-03-28_09-35.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAIAAACR5s1WAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACC0lEQVRYhe2XoZOrMBDGw5vnggbdoPHxwfcPqC+qonWdaR0zRdbSztTVUw8+1ehuNT5M7QmGuzd3JVko866Cz26y/Mgu+wXr8XiQ39af3wYgZIT40gjRaIRo9BYQf/ttK4pCKXW/3wkhk8nEtm3f9/8TBABcLhcppVLqW8i2bc75dDpljHWFsJBju6qqw+GQZZlxZRAE8/mcUjowBABEUVSWJTKp67qbzQZ/JGYIAFiv1z/PXy/btne7HZLD8HVUVRVFUVcCQohSKoqiqqoGgEiSBF+FbyrLMkmSVyEAIM/zpyHGGKb18jzHvIMOIk3TthDnPI5jTMnP5/NLEFJKTZQxFsexEEL/gOv12h+iKApjW1FKV6vVcrnUlEYpVRRFTwhkYxNCgiDQl8aYqhXidrshIYipNMZUQ7qoZVn9NrYamOd5+CwAsN/v297YmKoVAu9AWZYdj0fNVDWmaoXwfZ9Squ8pjLVSSo1XDV1PcM410drYjOauT1JL56IAsFgsnoY8zyvLEmNsp9PJdV39Gt1JMMY0Xx2GQAhhJDBAEELCMHQcx5jlqRzHCcMQs9IAQSndbred7mo9NpqHVT0NO52H4zhIj63V4aKbJEnb9eJfCSHCMBz+ovspAEjTVEr5c35QSjnns9kM04kvQXyqNvp6Tnueh5lIw0MMq7f4Fx0hGo0QjUaIRm8B8QEDPfaBQgNQVQAAAABJRU5ErkJggg==) que fica no canto superior esquerdo da célula de código;\n",
"1. Aguarde o código terminar de executar - o botão *play* vira *stop* durante a execução e volta a ser *play* quando ela termina, precedido pelo tempo que o código demorou para executar. ![2023-03-28_09-37.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEoAAAArCAIAAABQGonZAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEqUlEQVRoge1ZT0iqWRQ/5cNiPrGRyCKI/IMTWDIRMSiBTam7oFqGydTjkQQjTG0mC5NKytm1eBsrpiDCbREUxWd/droxQZqi6PMRLfqsZHr5kajlLL5BGl9dr2ZYQ7+V3nPuj/Pz3nvuOdeCo6MjmUwGOUUkEsktYdYozHcAL4t3eW8Z7/LeMt7lvWX8z+V9yHcAj8Pv94fD4UAgAABisZjH4ykUiix4Xpc8iqJWVlbcbnc4HE4x8Xg8pVLZ3t4ukUjwCQteSVHGMMzMzAxJkmk9tVptX18fQRA4tK/i7FEUZTKZcLQBAEmSJpOJoigc52fJW7jY9jGB5zAAAEVRZrOZpmn8KTRNm81mHIXZy1u42O49+bxwsZ01AwAwDGOz2b49aWkRDodtNhvDMGi3LOWx2n4p+3la9DE7BhYOhyOjdXsImqYdDgfaJxt5O1/3e08+N/NrF6SmrAL7FxRFuVyuR00SiQQnebhcLvSvk7E8HxPoPPrjx+9Eyz/8nuncFCwvLz9lUiqVdrsd5w5YWlpCWFHyfEyg5a/Rv+PMf0YOrNXcsh35+PcfsFIzAm63G2GVSCR2u12j0aBJPB4Pwppm9faYQMuBlVWYW21+vz9tYiAIYnBwcGBgALFRw+Gw3+9/yoqSV0+Id+TjgQjdcmDd+bqfQ20AkFZbElqtFr1REVRpVq+eEE+LPrK7NJFILEh/zYk2ADg5OcF3Rm9UBFX6mrOnrAUAfvvy5458vJ4Q48eUcxQUFGQ6Bauk7ilr6RD8lKt1YyGVSvGdKYqanp5+apUQVLgdQ261AQBmTQwAJEnOzs4iKhsEVd4aIoVCQRAEOsHgtBEEQSBawXx2DEqlEmFlS+20bQSaJJ/yOjo6njJ5PB6z2YyTXfV6PcKaT3kSiQSR63HaCI1GU15ejnB45OxNTk6enZ2xWViv14dCoWThE4lE+Hy+xWJJHzsejEaj3+8PBoNZzBUKhUajEe3ziLzr6+upqamSkpLkSFtbG/vB6XRWVFRkEcpTIAjCYrEMDQ3hFzEPJ6ZNv49szpubGz6f/+04wzBer7epqQkATk9Px8bGRkZG7Hb75eVlRpGlgK1IhEIh/hShUIjZT3BMJlNpaWny++3t7dramtfrXV1dpWlaoVAka4XNzc3Kysq6ujoAmJ+f12g0BoMhFotRFFVTU/OQNB6P48cKAAKBQKfThUIh9uUPDY1GMzo6ij5ySaTKKywsrK6u7uzsbG5uJkny/v5eJBKxEc/NzfX09BQXFwNANBpdX1+PRqO1tbWNjY0ppJnKAwAul6tSqVQqVTQaDQaDsVgsxYEgCLVabbFYdDodl8vFpE19CIzH43d3d0VFRQBAkuT5+Xl3dzcA7O7uHh8ff/r0Kel5dXW1v7+/tbWlVqtbW1sfkj7/31m2XWIvBqlUir67EUhNLYFAwOl0Dg8Pczicw8NDuVwOAIlEYmNjo7+/P+k2MTFhMBjUajWHw/H5fCnyng9WDPrKxkGqPJlM1tDQYLVaE4mETCZTq9UAsLe3JxAIqqqqkm5dXV2Li4uRSKSoqKi3t/eZQbwcXssr9QvhVbxSvxze5b1lvMt7y/gHb4L7kHav3cAAAAAASUVORK5CYII=)\n",
"1. Abra o gerenciador de arquivos ![Gerenciador de arquivos](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAAkCAIAAACFVbTMAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA10lEQVRYhe3XoQ6DMBAG4HWZoRpbj8b2SdA8XJ/kt8VWU4u+k0xgyLYebBlLFu6X7R1fQ0obzDzPl5/n+ntSVVVVVXUzt9IEEQEYhuFh3DnXdd1RaggBwPN4SomI+r4/RI0xlqYAMLNz7uWstdZ7b639RGVmoS3GKCxrHEf5ZRTVJd77uq7lmnWmaXq5G95Wm6bZr6aUABCRXHam71VVVf9dLZ4SVVUxc87ZGLP/cTnnpfdDtW1bACGE/eS6Vy4wpT+O5X4VjniB3LxziuqhOdMeVlXV7+UONYVZvf36YV8AAAAASUVORK5CYII=) e procure por uma pasta que começa com \"output\". Lá estarão os arquivos da transcrição em vários formatos (`.txt` é apenas o texto, `.vtt` e `.srt` é legenda, com os tempos). Baixe os que desejar clicando nos três pontos ![2023-03-28_09-36.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAdCAIAAABE/PnQAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA+UlEQVRIie2VsQ2DMBBFL1E6u4cB6LkxbgtmYABmoKFjBegZwAMcvS1ReoAbIAVSRJE46BRLiZRfXfHx+5zP9mXbNsipa9bV/4CvANzUXw7DEEJAxKZpPg+YpmmeZwBg5qIoiOiVU9kiEXnUMcaEUwkgImMMABhjEvEB4KI+ySLiva+qylqbBXBS+ilyzoUQ6rpGxM8DnHNd1+113/cJhnKTvfePmpkTTiXgGDndIv0mMzMzI2IuwEnpL7sY47quxyP9VMop8t63bSsi1tpxHMuyfOVU/oFzbs8uIsuyJJxKwDFyIj6oW0REMcZ9inJddif1+2/yH/BWd68yZm4xFiWFAAAAAElFTkSuQmCC) e depois na opção \"Download\".\n",
"1. Depois de um tempo o notebook \"desconecta\" e todos os arquivos (tanto os que você enviou quanto os que foram gerados) se perdem. Baixe as transcrições tão logo o processo finalize para não perdê-las.\n",
"\n",
"\n",
"## Modelos disponíveis\n",
"\n",
"Você pode escolher qual o tamanho de modelo deseja usar. Os tamanhos impactam na qualidade do resultado e no tempo de processamento (quanto melhor a qualidade, mais tempo de processamento). A escolha entre eles também está à qualidade do áudio: se poluído com ruídos, provavelmente será necessário um modelo com maior qualidade para conseguir transcrever corretamente.\n",
"\n",
"A lista de possíveis modelos é, do mais rápido para o fim o maior qualidade:\n",
"\n",
"- tiny\n",
"- base\n",
"- small\n",
"- medium\n",
"- large\n",
"\n",
"\n",
"## Acelerando a execução do código\n",
"\n",
"A execução desse modelo é bem mais rápida em uma GPU. Você pode tentar usar uma GPU gratuitamente aqui no Colab clicando no menu \"Runtime\" > \"Change runtime type\". Depois disso, selecione \"GPU\" em \"Hardware Accelerator\":\n",
"\n",
"![2023-03-28_09-42.png](data:image/png;base64,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rVYPGDAgOTnZ4/HcwCuMd5qZM2c2NDSsXLmSm2O325csWaLT6aLqyzdGIBBc3bImxo4dW15efubMGTLpdruLiorWrFkDABMmTAAA8pkgtxeZTzqgtm3bxi0N/0WpcePG1dTU7Nixg5uzcePGq18hUygUubm527Zt475gXFFRUVBQcODAAYVCMWjQoC+++IJrHQeDwXfeeadTXUnjx4+vrKwkr/oAgN/v37BhA6lewJWwxOW9pqbGZrNx25IgHdXlwn2vimXZjRs3CoXCIUOG3Niuwo0aNeqTTz5xu93k1ZERI0ZIJJIPPvhg6NChUe+qXRNZf82aNdzrs2azefny5Z16g8vlck2YMGHJkiVkUigUDhgwIBQKkWSHQiHuTUqWZckIE3vl/ci4uLhRo0atWrXKbre3M8DQlpycHKVSuXHjRi7BZNDlmq57MtuyZs2acePGcT/ZkpOTIxAIwl8P7YiRI0fKZLIPP/yQS8Du3bsvXbr00EMPkUmhUBietus+COHvT2/cuJHP55Obs/2nr/2lRGJiYm5u7vPPP19cXLxly5ZOZfPO4ff7yfgrTdMxMTFut5ucXn5paenAgQMpirp48WJra6tSqeSqqJfX6OIW6G1QUFCwb9++5cuXl5SUDBs2zOl07ty50+PxrF27lhtSuxmZmZnFxcUrV64cO3YsGZrjzJo168svvywsLHzyySfj4uK2bNnS0tLypz/9CQDy8/MnTZr0wQcfmEymgQMHlpaW7ty5c8aMGaRaN2LEiNGjRy9atMjpdPbr1490PnC7/eMf//j111+//PLLP/30U58+fUpLS7/88st58+b1798/Km2vvfbajBkzJk+ePHny5NbW1g0bNmRmZpJXRd94441p06ZNnjy5sLBQqVRu37791KlTDzzwAFdLuq4//OEP27dvf+6555588snExMQdO3acPn363XffJYXL+PHjlyxZ8uKLLxYUFDgcjm3btoWPV5Eq4aJFi0aOHFlYWEhmvv3223q9Pisr64cffti7d29RUZFGo7nurtLS0vh8/vr1681mc2FhoUwmi0rnvffeu3Xr1vz8fPIMCASCUaNG7dmzJ3xksh1xcXGvvvrqggULJk+ePGnSpFAotGnTJpqmZ86cec2XGq5JqVQWFBR8+umngUAgNzdXr9dv2LBhzJgx5Gw/8MADO3fupCgqPT19//79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)\n",
"\n",
"> Nota: caso você esteja utilizando a versão gratuita do Colab a opção \"GPU class\" não estará habilitada e a disponibilidade de GPUs não é garantida."
],
"metadata": {
"id": "Rh3UMmOE3oFk"
}
},
{
"cell_type": "code",
"source": [
"!pip install openai-whisper\n",
"import subprocess\n",
"\n",
"filename = \"nome do arquivo.mp3\"\n",
"model_name = \"medium\"\n",
"subprocess.run(\n",
" [\n",
" \"whisper\", \n",
" \"--language\", \"pt\", \n",
" \"--word_timestamps\", \"True\",\n",
" \"--model\", model_name, \n",
" \"--output_dir\", f\"output-{model_name}\", \n",
" filename\n",
" ]\n",
")"
],
"metadata": {
"id": "fEOS5MIhxWSI"
},
"execution_count": null,
"outputs": []
}
],
"metadata": {
"accelerator": "GPU",
"colab": {
"provenance": []
},
"gpuClass": "premium",
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
@lucastexr
Copy link

Tá porra, tu é o cara mesmo! Porra que mão na roda kkkkkk

@ezaul
Copy link

ezaul commented Jul 12, 2023

Sabe nos dizer quando sairá linguagem pt-br? pois estou usando em meu home assistant e o whisper com pt converte muito errado

@turicas
Copy link
Author

turicas commented Jul 12, 2023

Sabe nos dizer quando sairá linguagem pt-br? pois estou usando em meu home assistant e o whisper com pt converte muito errado

O whisper já suporta Português do Brasil. Você pode alterar o tamanho do modelo para ter resultados melhores (o large, que demora mais, dá resultados mais precisos).

@RenataARamos
Copy link

Oi Turicas. Meu nome e Renata. Esta e a minha primeira vez usando este espaco. Encontrei o seu post no Google enquanto explorando maneiras de transcrever audios gravados via Zoom em portugues (Brasil). Eu uso Rev Max AI para transcricoes em ingles e a fidelidade e bem alta. Mas as que enviei em portugues, a fidelidade e muito baixa. Portanto aqui vai a minha perguta: este whisper, se eu conseguir usa-lo, resolvera o meu problema de fidelidade de transcricao?
Todos os audios foram gravados pelo Zoom em portugues falado no Brasil.
Muito Obrigada.

@lucastexr
Copy link

@RenataARamos eu usei o Whisper (assim como o Turicas colocou no console) e a fidelidade foi bem alta para PT-BR –o que fora impressionante visto que já havia testado em outras plataformas e nenhuma reconhecia o áudio da gravação;

Além do mais a execução é bem rápida (Minha gravação de 30 minutos demorou 4 minutos para ser transcrita) vale a pena tentar :)

@RenataARamos
Copy link

@RenataARamos eu usei o Whisper (assim como o Turicas colocou no console) e a fidelidade foi bem alta para PT-BR –o que fora impressionante visto que já havia testado em outras plataformas e nenhuma reconhecia o áudio da gravação;

Além do mais a execução é bem rápida (Minha gravação de 30 minutos demorou 4 minutos para ser transcrita) vale a pena tentar :)

@lucastexr Obrigada. Estou tentando. Mas meu limitado conhecimento em Google Colab ou qq lgg computacional esta atrapalhando o processo. De qq forma uma gravacao de 2 hrs esta a mais de uma hora rodando. Vamos ver....

@mrfurquim
Copy link

Isso aqui é a elite.

@johnidm
Copy link

johnidm commented Aug 2, 2023

Pessoal, apenas para contribuir com a thread tem uma versão que roda com mais performance - https://github.com/guillaumekln/faster-whisper

@edjunhoscj
Copy link

Que coisa fantástica!! Meu parabéns e reconhecimento!!!

@jmsmoreira
Copy link

Olá, Turicas. Pesquisando como transcrever áudio em texto, caí aqui em seu tutorial. Consegui usar a transcrição no Drive+Colab. Será que pode me ajudar? Tem fazer transcrição por parágrafos com o Whiper? Ele dá as frases com quebra de linha, seria possível ele gerar a transcrição por parágrafos? Obrigado pela ajuda. Abraço

@ivanpfigueiredo
Copy link

obrigado.

@johnidm
Copy link

johnidm commented Oct 23, 2023

@jmsmoreira acredito que você não vai conseguir fazer isso com o Whiper.

O Whiper devolve a transcrição com pontuação. Voce pode fazer a quebra por paragrafos com bibliotecas como o NLTK e spaCy. Isso normalmente é conhecido como sentence tokenizer.

@jmsmoreira
Copy link

@johnidm Muito obrigado pela resposta. Abraço.

@airtonac
Copy link

airtonac commented Dec 5, 2023

Olá @turicas ,
Tentei rodar o modelo small e medium, mas em ambos ocorreu algum tipo de erro, acredito que por falta de dependências. Vou colar o output do console aqui.

Esta parte apareceu em vermelho:
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. llmx 0.0.15a0 requires cohere, which is not installed. llmx 0.0.15a0 requires openai, which is not installed.

No fim a ferramenta criou as pastas output-xxx, mas não criou nenhum arquivo.

Abraço,
Airton

Collecting openai-whisper Downloading openai-whisper-20231117.tar.gz (798 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 798.6/798.6 kB 6.0 MB/s eta 0:00:00 Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... done Requirement already satisfied: triton<3,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from openai-whisper) (2.1.0) Requirement already satisfied: numba in /usr/local/lib/python3.10/dist-packages (from openai-whisper) (0.58.1) Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from openai-whisper) (1.23.5) Requirement already satisfied: torch in /usr/local/lib/python3.10/dist-packages (from openai-whisper) (2.1.0+cu118) Requirement already satisfied: tqdm in /usr/local/lib/python3.10/dist-packages (from openai-whisper) (4.66.1) Requirement already satisfied: more-itertools in /usr/local/lib/python3.10/dist-packages (from openai-whisper) (10.1.0) Collecting tiktoken (from openai-whisper) Downloading tiktoken-0.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.0/2.0 MB 29.4 MB/s eta 0:00:00 Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from triton<3,>=2.0.0->openai-whisper) (3.13.1) Requirement already satisfied: llvmlite<0.42,>=0.41.0dev0 in /usr/local/lib/python3.10/dist-packages (from numba->openai-whisper) (0.41.1) Requirement already satisfied: regex>=2022.1.18 in /usr/local/lib/python3.10/dist-packages (from tiktoken->openai-whisper) (2023.6.3) Requirement already satisfied: requests>=2.26.0 in /usr/local/lib/python3.10/dist-packages (from tiktoken->openai-whisper) (2.31.0) Requirement already satisfied: typing-extensions in /usr/local/lib/python3.10/dist-packages (from torch->openai-whisper) (4.5.0) Requirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from torch->openai-whisper) (1.12) Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from torch->openai-whisper) (3.2.1) Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from torch->openai-whisper) (3.1.2) Requirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from torch->openai-whisper) (2023.6.0) Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests>=2.26.0->tiktoken->openai-whisper) (3.3.2) Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.26.0->tiktoken->openai-whisper) (3.6) Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.26.0->tiktoken->openai-whisper) (2.0.7) Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.26.0->tiktoken->openai-whisper) (2023.11.17) Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->torch->openai-whisper) (2.1.3) Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy->torch->openai-whisper) (1.3.0) Building wheels for collected packages: openai-whisper Building wheel for openai-whisper (pyproject.toml) ... done Created wheel for openai-whisper: filename=openai_whisper-20231117-py3-none-any.whl size=801356 sha256=30351f055493abac3a821be4d9363be78eb538908b230d82546562190b0e44cf Stored in directory: /root/.cache/pip/wheels/d0/85/e1/9361b4cbea7dd4b7f6702fa4c3afc94877952eeb2b62f45f56 Successfully built openai-whisper Installing collected packages: tiktoken, openai-whisper **ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. llmx 0.0.15a0 requires cohere, which is not installed. llmx 0.0.15a0 requires openai, which is not installed.** Successfully installed openai-whisper-20231117 tiktoken-0.5.2

@turicas
Copy link
Author

turicas commented Dec 6, 2023

@airtonac não sei o que pode ser, mas tente rodar o pip install com a opção -U para atualizar os pacotes do seu ambiente e/ou então usar uma versão mais antiga do pacote openai-whisper (as últimas versões deram alguns conflitos). De toda forma, a mensagem final foi de sucesso, então talvez funcione mesmo assim.

@ivanpfigueiredo
Copy link

ivanpfigueiredo commented Dec 6, 2023 via email

@celestino-lourenco
Copy link

boa tarde, baixei o whisper é a transcrição no padrão medim é muito boa. Porém a transcirção é muito lenta. Leva 15 minutos para transcrever 1 minuto de audio de mp3! Como o audio tem 120 minutos vai levar dias para fazer a transcrição! Isso se a internet não cair! Essa performance é normal ou anormal. Estou usando o formato CPU, porque se usar o GPU T4 o arquivo não carrega e dá pau! tem como acelerar o processo para que o uso seja viável para mim ? grato pela ajuda

@jmsmoreira
Copy link

@celestino-lourenco Costumo transcrever mp3 de 20 minutos no padrão Medium e não leva 4 minutos... Não sei porque, mas como dito acima, não estava gerando o arquivo para download no fim da transcrição. Aí passei a usar o seguinte código e deu certo, transcreve rápido e gera o arquivo em txt e outros formatos para download. Segue como uso

!pip install git+https://github.com/openai/whisper.git
!sudo apt update && sudo apt install ffmpeg

!pip install openai-whisper
import subprocess

!whisper "Nomedoarquivo.mp3" --model medium --language pt

Assim gera o arquivo para dowload. Deixo também o ambiente de execução em GPU

@celestino-lourenco
Copy link

Olá Moreira grato pelo retorno, carreguei os 3 scripts indicados por ti. Mas deu dois conflitos : 1) quando carreguei o scrip - !whisper "ID_19_MICHELLE POJETO_3_EPs.mp3" --model medium --language pt - deu o seguinte erro
_.../bin/bash: line 1: whisper: command not found. Isso com ou sem o termo "--language pt".
2) Em ambiente de execução / acelerado de hardware tinham apenas as opções CPU, T4 GPU, TPU. Quando ativei o T4 GPU o arquivo MP3 sumiu e com o CPU o arquivo ficava presente. Caso você tenha alguma sugestão para superar esses dois conflitos agradeço-lhe muito. Muito obrigado

@jmsmoreira
Copy link

@celestino-lourenco duas coisas. sobre o arquivo sumir... vc começa o processo alterando o ambiente, depois carrega o mp3... Quer me mandar o arquivo, eu faço a transcrição e te devolvo... Talvez seja mais fácil. Aí eu te mando as prints da tela... Meu e-mail é jmsmoreira@gmail.com

@ivanpfigueiredo
Copy link

!pip install git+https://github.com/openai/whisper.git !sudo apt update && sudo apt install ffmpeg

!pip install openai-whisper import subprocess

!whisper "Nomedoarquivo.mp3" --model medium --language pt

Obrigado!

@GabrielaVictorio
Copy link

!pip install git+ https://github.com/openai/whisper.git !sudo apt update && sudo apt install ffmpeg

!pip install subprocesso de importação openai-whisper

!whisper "Nomedoarquivo.mp3" --model médio --linguagem pt

Assim gera o arquivo para download. Deixo também o ambiente de execução em GPU

Fiz exatamente como vc postou, mas meu áudio está demorando horas pra ser transcrito (20 min).
Tem mais alguma coisa que eu possa fazer?

@mesompi
Copy link

mesompi commented Mar 8, 2024

Estava enfrentando o seguinte erro na saída do comando

AssertionError: libcuda.so cannot found!

Para corrigir execute antes do !pip

Audio disponível aqui

!export LC_ALL="en_US.UTF-8"
!export LD_LIBRARY_PATH="/usr/lib64-nvidia"
!export LIBRARY_PATH="/usr/local/cuda/lib64/stubs"
!ldconfig /usr/lib64-nvidia


!pip install openai-whisper
import subprocess

filename = "/content/Alfabeto_portugues_brasileiro.ogg"
model_name = "medium"
completed_process  = subprocess.run(
  [
    "whisper", 
    "--language", "pt", 
    "--word_timestamps", "True",
    "--model", model_name, 
    "--output_dir", f"output-{model_name}", 
    filename
  ],
    capture_output=True,  # Capture the output of the process
    text=True  # Convert the output to text (for Python 3.7 and later)
)


# Print the output of the process
print("STDOUT:", completed_process.stdout)
print("STDERR:", completed_process.stderr)

@mileenamury
Copy link

Pessoal, encontrei uma forma similar que funcionou 100%! Não estava conseguindo também e encontrei esse vídeo: https://www.youtube.com/watch?v=9prLBRpwZ78&list=LL&index=4

É simples: primeiro altere a execução do ambiente, mudando o tipo para T4GPU.

copie para executar: !pip install git+https://github.com/openai/whisper.git

!sudo apt update && sudo apt install ffmpeg

Quando terminar a execução, você carrega seu arquivo mp3, e arrasta ele para a pasta "sample_data".

Daí vc executa o seguinte comando em outra linha:

!whisper "/content/sample_data/arquivo.mp3" --model medium

Precisa ser especificamente o caminho do arquivo dentro da pasta sample, como fazer isso? 3 pontinhos e "copiar caminho".
Execute e baixe o arquivo txt.
O arquivo que transcrevi tinha 1h 27min, e deu tudo certo no "medium". Demorou 21 minutos.

prints:
Captura de tela 2024-03-23 172430
Captura de tela 2024-03-23 172452

Captura de tela 2024-03-23 172856

@vieiradatalab
Copy link

Olá, bom dia!
Muito obrigado pelo tutorial e pelas dicas!!
Já estou usando aqui para transcrição de entrevistas.... muito bom.
Só uma dúvida...
É possível fazer algum tipo de marcação entre as pessoas que falam?
Tipo... Entre o entrevistador e o entrevistado...
Fazer marcações...
Isso é fala do entrevistador...
Isso é fala do entrevistado...
Pode haver algum parâmetro que se possa configurar para isso?

@turicas
Copy link
Author

turicas commented Mar 27, 2024

Olá, bom dia! Muito obrigado pelo tutorial e pelas dicas!! Já estou usando aqui para transcrição de entrevistas.... muito bom. Só uma dúvida... É possível fazer algum tipo de marcação entre as pessoas que falam? Tipo... Entre o entrevistador e o entrevistado... Fazer marcações... Isso é fala do entrevistador... Isso é fala do entrevistado... Pode haver algum parâmetro que se possa configurar para isso?

@vieiradatalab o modelo whisper não permite fazer essa segmentação de quem está falando. Existem alguns outros modelos que fazem, mas não tenho exemplos prontos e fáceis de usar assim.

@vieiradatalab
Copy link

Olá, bom dia! Muito obrigado pelo tutorial e pelas dicas!! Já estou usando aqui para transcrição de entrevistas.... muito bom. Só uma dúvida... É possível fazer algum tipo de marcação entre as pessoas que falam? Tipo... Entre o entrevistador e o entrevistado... Fazer marcações... Isso é fala do entrevistador... Isso é fala do entrevistado... Pode haver algum parâmetro que se possa configurar para isso?

@vieiradatalab o modelo whisper não permite fazer essa segmentação de quem está falando. Existem alguns outros modelos que fazem, mas não tenho exemplos prontos e fáceis de usar assim.

Opa... muito obrigado pela resposta.
Nós usávamos a ferramenta "transcriptor". Essa ferramenta faz a segmentação de quem está falando. Contudo, a qualidade da transcrição é muito ruim. Por isso estamos buscando outras alternativas.
Mesmo sem exemplos prontos, vc consegue citar outros modelos que possam fazer essa segmentação??

@turicas
Copy link
Author

turicas commented Apr 1, 2024

@guilhermegomes2
Copy link

guilhermegomes2 commented May 8, 2024

Olá amigo @turicas

Como faço para que, no arquivo TXT, também sair impresso o tempo inicial e final do áudio?

@bishoppython
Copy link

Olá Amigos eu fiz dessa forma e também obtive êxito!
!whisper "arquivo.mp3" --language Portuguese --model medium #or large or small

espero poder ter ajudado!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment