DEV Community

1

Ensinando o terminal a falar

Dessa vez vamos fazer uma coisa um pouco mais divertida, utilizar o Powershell para sintetizar voz ou seja, vamos fazer nosso script falar.

Conseguimos fazer isso utilizando um recurso do sistema, então é importante lembrar que a qualidade da pronuncia vai depender da linguagem instalada no sistema. Exemplo, eu estou usando meu Windows em ingles e passando texto em português para ele ler, o que deixa tudo bem engraçado devido a pronuncia.

Existem alguns usos interessantes para esse recurso, como deixar os retornos dos nossos scripts mais acessíveis, ao não depender unicamente de ler uma tela para saber o que aconteceu.
Um outro que já utilizei, é usar isso em conjunto com formas de se comunicar com outros computadores, criando uma espécie de "radio", podemos trabalhar nessa ideia no futuro.

Inicialmente, vamos trabalhar no script base para o recurso:

# Adiciona biblioteca
Add-Type -AssemblyName System.speech
# Cria narrador
$narrador = New-Object System.Speech.Synthesis.SpeechSynthesizer
# Recebe o texto
$texto = Read-Host "Informe o que deseja ouvir"
# Lê o texto
$narrador.Speak("$texto")
view raw narrador.ps1 hosted with ❤ by GitHub

Com esse script, pode passar como parâmetro uma mensagem para que o terminal leia. Mas vamos tentar colocar isso num cenário mais pratico, utilizando ele para uma resposta em um script nosso.

Vamos basicamente pegar nosso script que simula a configuração de um repositório GIT local e vamos adicionar aos retornos escritos, o narrador.

# Configuracoes
$urlDownload = "https://github.com/IGDEXE/MLSA-Powershell/archive/main.zip"
$pastaMyGIT = "C:\MyGIT"
$arquivoDownload = "$env:LOCALAPPDATA/GIT.zip"
# Configurando o Narrador
Add-Type -AssemblyName System.speech # Adiciona biblioteca
$narrador = New-Object System.Speech.Synthesis.SpeechSynthesizer # Cria narrador
# Funcao para criar pastas
function Validar-Pasta {
param (
# Aqui definimos qual a posicao e se é obrigatorio ou nao o parametro
# O contador de posicoes comeca em 0, é importante lembrar disso
[parameter(position=0,Mandatory=$True)]
$caminhoPasta
)
# Validamos se o caminho existe, salvando a resposta em uma variavel
$pastaValidacao = Test-Path -Path "$caminhoPasta"
# Se ela já existe, exibimos uma mensagem de erro
if ($pastaValidacao) {
# Recebendo o nome da pasta com base no caminho
$infoPasta = Get-ItemProperty $caminhoPasta
$nomePasta = $infoPasta.Name
# Informamos que a pasta já existe
Write-Host "Já existe o diretorio: $nomePasta"
$narrador.Speak("Já existe o diretorio: $nomePasta")
}
# Se a pasta existe, executamos o bloco de codigo
else {
# Executar o comando de criação de pasta
$esconderRetorno = New-Item -Path "$caminhoPasta" -ItemType "Directory" # Vamos jogar isso numa variavel para nao aparecer o retorno padrao na tela
# Recebendo o nome da pasta com base no caminho
$infoPasta = Get-ItemProperty $caminhoPasta
$nomePasta = $infoPasta.Name
# Mostrar mensagem de confirmação na tela
Write-Host "Criado diretorio: $nomePasta"
$narrador.Speak("Criado diretorio: $nomePasta")
}
}
# Para limpar a tela
Clear-Host
try {
# Cria a pasta na raiz do sistema
Validar-Pasta $pastaMyGIT
# Faz o download do arquivo
Write-Host "Fazendo o download"
$narrador.Speak("Fazendo o download")
Invoke-WebRequest -Uri "$urlDownload" -OutFile "$arquivoDownload"
# Descompacta para a pasta que criamos
Write-Host "Descompactando.."
$narrador.Speak("Descompactando..")
Expand-Archive -Path "$arquivoDownload" -DestinationPath "$pastaMyGIT" -Force
# Limpa a instalacao
Write-Host "Otimizando armazenamento.."
$narrador.Speak("Otimizando armazenamento..")
Remove-Item -Path "$arquivoDownload" -Force
# Conclui o processo
Write-Host "Configuração concluida"
$narrador.Speak("Configuração concluida")
Write-Host "Disponivel em: $pastaMyGIT"
$narrador.Speak("Disponivel em: $pastaMyGIT")
}
catch {
$ErrorMessage = $_.Exception.Message # Recebe o erro
Write-Host "Ocorreu um problema" # Mostra a mensagem
$narrador.Speak("Ocorreu um problema")
Write-Host "Erro: $ErrorMessage"
$narrador.Speak("Erro: $ErrorMessage")
}

Com isso, tornamos nosso script mais inclusivo e divertido.
Eu só não gostei muito da repetição de código com os textos, mas vamos cuidar disso na próxima postagem.

Top comments (0)

nextjs tutorial video

Youtube Tutorial Series 📺

So you built a Next.js app, but you need a clear view of the entire operation flow to be able to identify performance bottlenecks before you launch. But how do you get started? Get the essentials on tracing for Next.js from @nikolovlazar in this video series 👀

Watch the Youtube series