As tecnologias de voz da inteligência artificial (IA) vêm transformando a maneira como interagimos com as máquinas. Neste post, nos aprofundaremos no mundo da IA para reconhecimento automatizado de fala apresentando o Whisper.
O que é Whisper?
O Whisper pode ser acessado com Python via uma API ou com a versão de código aberto disponível no repositório GitHub.
OpenAI Whisper aceita vários formatos de arquivo de áudio como entrada, incluindo mp3, mp4, mpeg, mpga, m4a, wav e webm.
Whisper suporta alguns formatos de arquivo de saída como texto, JSON, SRT e VTT.
IA para reconhecimento automatizado de fala: Whisper API
Para acessar o Whisper com a API, as instruções são as mesmas fornecidas aqui para a API do ChatGPT. Ou seja, é preciso entrar no site da OpenAI, se registrar e solicitar uma chave para a API. A key é a mesma usada para acessar o ChatGPT.
Também é preciso instalar a biblioteca openai. A instalação com pip é:
pip install openai
Para fazer a instalação com conda:
conda install -c conda-forge openai
Para usar a API é bem simples, abaixo mostramos um exemplo para transcrição de áudio para texto. Basta importar a biblioteca, selecionar um áudio (não se esqueça de trocar a path para a path do seu áudio) e solicitar a transcrição. Mas a API tem uma enorme desvantagem: seu uso de graça é bem limitado.
import openai
openai.api_key = "sua_key"
audio = "path_para_seu_audio/audio.mp3"
with open(audio, "rb") as audio_file:
transcript = openai.Audio.transcribe(
file = audio_file,
model = "whisper-1",
response_format="text",
language="pt"
)
print(transcript)
IA para reconhecimento automatizado de fala: Whisper de código aberto
Para evitar a versão paga, a solução é usar o Whister disponibilizado no GitHub. A instalação pode ser feita com o comando abaixo:
pip install -U openai-whisper
Essa versão do Whisper também é fácil de usar. É preciso escolher um modelo. Existem 5 com tamanhos diferentes. O modelo tiny é o menor. Com o modelo selecionado, os comandos para fazer transcrições e traduções são bem simples.
Abaixo mostramos os comandos para fazer uma transcrição de um áudio em inglês obtido aqui.
import whisper
model = whisper.load_model("tiny")
audio = "path_para_audio/3 English Vocabulary.mp3"
result = model.transcribe(audio, verbose = True, language="en")
Esses são os resultados obtidos.
[00:00.000 --> 00:03.360] Taki, gauche, garrish, let's learn some vocabulary.
[00:03.360 --> 00:08.400] The other day I was walking next to a nice restaurant and they had this sign on it, and my husband said,
[00:08.400 --> 00:12.240] how tacky? Why does the city make these restaurants put up this awful sign?
[00:12.240 --> 00:16.880] Taki, not in good taste. The front of this restaurant was beautiful. They had great plants,
[00:16.880 --> 00:21.040] great style, and this sign just ruined it. Well, my son, whose five says,
[00:21.040 --> 00:26.080] what's tacky mean? And my husband said, gauche, and I'm like, what is my husband thinking?
[00:26.080 --> 00:30.800] My kid's not going to know gauche. Something that's gauche is unsophisticated a little bit
[00:30.800 --> 00:35.360] awkward. This word seems like it could be pronounced gauche, but this one is actually gauche.
[00:35.360 --> 00:41.040] And garrish means bright and showy. What a garrish sign to have to put on the front of a beautifully
[00:41.040 --> 00:43.040] style restaurant.
Depois, testamos um áudio em português obtido aqui. Para português, o desempenho do Whisper foi pior, por isso optamos por usar um modelo maior. Nossa escolha foi pelo modelo small.
model = whisper.load_model("small")
audio = "/path_para_audio/NÃO SEI DIZER QUEM SOU Clarice Lispector Fernanda Torres.mp3"
result = model.transcribe(audio, verbose = True, language="pt")
Esse é o resultado da transcrição. Ela não é perfeita, mas é boa. Existem dois modelos maiores que não testamos. É provável que eles tenham resultados mais precisos.
[00:00.000 --> 00:10.760] É curioso como não sei dizer quem sou, quer dizer, sei o bem, mas não posso dizer.
[00:10.760 --> 00:16.480] Sobre tudo eu tenho medo de dizer porque no momento que eu tenho to falar não só não
[00:16.480 --> 00:23.880] exprima o que eu sinto, como que eu sinto se transforma lentamente no que eu digo.
[00:23.960 --> 00:28.880] O pelo menos o que me faz agir não é o que eu sinto, mas eu digo.
[00:31.880 --> 00:38.320] Sinto que em sol e a impressão está lojada na parte alta do cérebro.
[00:38.320 --> 00:47.160] Nos lábios, na língua principalmente, nas perfísstidos braços e também correndo dentro.
[00:47.720 --> 00:54.600] Bem dentro do meu corpo, mas onde, onde mesmo eu não sei dizer.
[00:55.600 --> 01:01.600] Então primeiro eu vou ler aqui a carta que a mamãe mandou para ela.
[01:03.120 --> 01:04.600] Em 68.
[01:06.200 --> 01:11.080] Atualmente, São Paulo se representa de arma do doze,
[01:12.040 --> 01:18.880] o lice nas pocas dos teátos, telefonemos a meiação, que errou para cada um de nós,
[01:18.880 --> 01:21.480] e nossas casas de gente de teatro.
[01:22.680 --> 01:23.880] É o nosso mundo.
[01:25.480 --> 01:27.280] E o nosso mundo, claríssimo.
[01:28.480 --> 01:34.280] Não é este pela circunstâncias obligatoriamente político, polêmico, contundente.
[01:35.240 --> 01:44.280] Nós aqui, ele, mundo, de que nos fala títico, onde iríamos, onde nos descontreimos,
[01:45.000 --> 01:46.360] parclaremos.
[01:47.680 --> 01:50.080] A nossa geração não haverá.
[01:51.360 --> 01:54.080] Quando eu tinha 15 anos pensava a luce,
[01:54.080 --> 01:57.080] na dameente que minha geração desfariu ao nó.
[01:58.040 --> 01:59.680] Nossa geração falou,
[02:00.680 --> 02:03.360] numa melancholia de canção sem palavra,
[02:04.200 --> 02:06.200] tão comum você é pelo desenôler.
[02:07.120 --> 02:11.480] O amor não é pelo 21, é ajuste e social.
[02:12.480 --> 02:20.280] Pine, que ela frase maravilhosa, mas não esquecer que hoje, o que ainda é tempo de moranças.
[02:27.080 --> 02:27.680] Você não pode ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que ter que
Para fazer a tradução do áudio para inglês, basta adicionar task=”translate” no argumento transcribe como mostrado abaixo.
model = whisper.load_model("small")
audio = "/path_para_audio/NÃO SEI DIZER QUEM SOU Clarice Lispector Fernanda Torres.mp3"
result = model.transcribe(audio, verbose = True, language="pt", task="translate")
O resultado é esse abaixo.
[00:00.000 --> 00:10.760] É [00:00.000 --> 00:04.700] It's curious how I don't know how to say who I am.
[00:04.700 --> 00:06.200] What do you mean?
[00:06.200 --> 00:10.700] I know well, but I can't say.
[00:10.700 --> 00:15.400] Above all, I'm afraid to say, because at the moment I try to speak,
[00:15.400 --> 00:18.600] not only, not express what I feel,
[00:18.600 --> 00:23.900] as what I feel, it turns slowly into what I say.
[00:23.900 --> 00:29.900] Or at least what makes me act is not what I feel, but what I say.
[00:30.900 --> 00:37.900] I feel who I am and the impression is housed in the upper part of the brain,
[00:37.900 --> 00:44.900] in the lips, in the tongue, mainly, on the surface of the arms
[00:44.900 --> 00:49.900] and also running inside, right inside my body.
[00:49.900 --> 00:54.900] But where, where really, I don't know how to say.
[00:55.900 --> 01:04.900] So first I'll read here the letter that my mother sent to her, in 1968.
[01:04.900 --> 01:10.900] Currently, São Paulo represents itself as a sweet weapon,
[01:10.900 --> 01:14.900] police in the doors of theaters,
[01:14.900 --> 01:21.900] we call the threat, a terror for each of us in our theater people's houses.
[01:22.900 --> 01:24.900] It is our world.
[01:24.900 --> 01:27.900] And our world, Clarice,
[01:27.900 --> 01:34.900] not this one, due to the obviably political, controversial, and confusing circumstances,
[01:34.900 --> 01:38.900] but that world that tells us, Czech Republic,
[01:38.900 --> 01:44.900] where we will rest, where we will be discontracted.
[01:44.900 --> 01:50.900] Oh, Clarice, our generation will not see.
[01:50.900 --> 01:56.900] When I was 15 years old, I thought hallucinatively that my generation would disappear or not.
[01:56.900 --> 02:02.900] Our generation failed in a melancholy of song without words,
[02:02.900 --> 02:05.900] so common in the 19th century.
[02:05.900 --> 02:10.900] Love in the 21st century is social justice.
[02:10.900 --> 02:19.900] It is that wonderful phrase, but not to forget that today is still a time of years.
Conclusões
Neste post, apresentamos o Whisper da OpenAI. Ele é uma tecnologia de reconhecimento de fala disponível tanto através de API quanto com uma versão de código aberto. O Whisper é fácil de usar e tem bom desempenho. Porém, a API tem a grande desvantagem de ter acesso de graça bastante restrito. Felizmente, a versão de código aberto é uma alternativa eficiente e sem custos para quem deseja criar aplicações que com reconhecimento de fala.