Estou tentando criar um script para usar o Whisper da OpenAI como fala para texto. A ideia básica é eu pressionar alguma combinação de teclas, ele começa a gravar em um arquivo de áudio em algum lugar, eu paro, ele analisa o áudio e pega o texto dele, e então ele cola todo esse texto diretamente no meu cursor em qualquer programa que eu esteja usando. É esta última parte que não sei como fazer - posso enviá-la para a área de transferência, mas ainda são necessárias algumas teclas extras para colar e quero que seja o mais suave possível. Existe uma maneira de fazer o que eu quero?
EDIT: aqui está o script completo, que você pode modificar conforme necessário.
#!/bin/bash
gunchislas() (
echo $BASHPID > [scripts path]/pid.txt
arecord -f cd -D "default" --file-type raw | lame -r - "[scripts path]/.stt.mp3"
)
waiting() {
zenity --info --text="Taking speech to text input now."
}
gunchislas & waiting & wait -n
pkill -P $(cat [scripts path]/pid.txt) --signal 9
aplay "[scripts path]/clock.wav"
whisper "[scripts path]/.stt.mp3" --language en --model tiny | cut -c 28- | awk NF=NF RS= OFS=" " | xclip
rm "[scripts path]/.stt.mp3"
rm "[scripts path]/pid.txt"
aplay "[scripts path]/recorded.wav" & xdotool type "$(xclip -o)"
clock.wav e gravado.wav são apenas pequenos sons de notificação que fiz para que você possa saber o que está fazendo
Para gerar texto programaticamente no cursor, pode-se usar ferramentas de simulação de teclado. Essas ferramentas enviam pressionamentos de tecla para um aplicativo.
xdotool type "$(xclip -o)"
pode de fato parecer uma maneira de fazê-lo funcionar. No entanto:Funcionará apenas no Xorg, não no Wayland, o padrão dos sistemas Ubuntu modernos.
Ele não será confiável quando o texto a ser digitado se tornar um pouco mais longo: há uma chance de que as teclas digitadas sejam perdidas.
Para resolver o problema um, você pode usar
ydotool
oudotool
. Essas ferramentas funcionam tanto no Xorg quanto no Wayland. Para manipular a área de transferência no Wayland,wl-clipboard
está disponível.Para resolver o problema dois, considere colar o texto da área de transferência em vez de digitá-lo. Para fazer isso, simule a tecla de atalho Ctrl+ Vou Shift+ Insert. Isso não apenas colará todo o texto de maneira confiável, mas também será muito mais rápido.
No seu script, o texto já está na área de transferência. Portanto, colar em vez de digitar o conteúdo é óbvio: você pode simplesmente substituir
xdotool type "$(xclip -o)
porxdotool key ctrl+v
. Usandodotool
, o comando será:echo key ctrl+v | dotoolc
Com o ydotool, torna-se
ydotool key 29:1 47:1 47:0 29:0