como obter o speak para falar continuamente stdout canalizado do netcat

3

Eu tenho um Raspberry pi 3 que eu quero usar como uma espécie de sistema de PA, usando o espeak para anunciar coisas canalizadas do netcat, que está recebendo entrada de um servidor remoto. No pi, eu inicio o ouvinte assim:

nc -lk 7777 | espeak

e na máquina remota remota (um Macbook pro para fins de teste) eu emito

echo "hello world" | nc raspberrypi 7777

Ele fala a primeira coisa que eu mando, mas se eu tentar enviar mais coisas, ele não emitirá fala, e não há texto escrito no terminal. É como se o echo parasse, mesmo que o netcat ainda esteja em execução.

Eu tentei iniciar o ouvinte sem um pipe, para que ele apenas coloque stdout no terminal, e eu posso enviar spam para o echo | Comando nc do Mac e ter tudo isso aparecer como esperado no pi.

Eu tentei pesquisar uma solução no Google, e há coisas sobre alimentar continuamente o stdout de um ouvinte do nc para um arquivo de dados, mas não consigo ver nada relacionado especificamente ao espeak.

Eu também tentei canalizar o nc para outros comandos como tee e logsave, e eles se comportam como eu esperava, continuamente gravando a saída de nc em um arquivo.

UPDATE

Eu notei em um comentário abaixo que eu era capaz de obter a configuração mencionada acima para trabalhar tranquilamente com meu desktop robusto rodando Linux Mint como ouvinte e uma caixa de servidores quase tão pesada rodando servidor Ubuntu quanto o cliente enviando os ecos . Isso me fez pensar que algo sobre o Pi, não nc, era o culpado. Minha suspeita é que tem algo a ver com o áudio do Pi, então eu tentei algumas coisas:

  • A transmissão de uma estação de rádio mp3 via Wi-Fi através de HDMI e do conector de 3,5 mm usando o mplayer resultou em gagueira, embora eu pudesse entender o que estava acontecendo. Tentando-o através da Ethernet, obteve o mesmo resultado.

  • Usar o mplayer para reproduzir um arquivo mp3 armazenado localmente em HDMI também resultou na mesma gagueira.

  • usando aplay para reproduzir o mesmo mp3 em HDMI produziu ruído branco alto.

Eu também tentei espeak no modo interativo, e o mesmo problema se manifesta. Ele diz a primeira linha que eu digito, mas ignora todas as linhas subseqüentes. Às vezes, enquanto mexer com nc como acima, ele vai cuspir rapidamente todas as linhas que eu tentei alimentá-lo de uma só vez.

    
por user2368261 28.04.2016 / 03:12

3 respostas

2

Eu tentei netcat -lk no meu pi jessie com as 3 versões diferentes do netcat, mas elas não suportam -k , ou o servidor acabou em um loop ocupado após a primeira conexão:

$ strace nc -l -k -p 7777 </dev/null | espeak --stdout >/dev/null
poll([{fd=0, events=POLLIN}, {fd=-1}], 2, -1) = 1 ([{fd=0, revents=POLLNVAL}])

Sugiro que você use socat , que funcionou para mim. Aqui está a linha equivalente:

socat -u TCP4-LISTEN:7777,reuseaddr,fork - | espeak
    
por 28.04.2016 / 16:00
0

Uma reinstalação do Raspbian parece ter resolvido o problema. Acho que instalei algo durante um projeto anterior que interferiu na Alsa.

O Espeak agora é responsivo no modo interativo e regular ao enviar informações do netcat. No entanto, ele vai começar a quebrar depois de cerca de 5 ou 10 segundos de áudio, mas eu não acho que isso seja um problema para mim, pois ele só estará lendo mensagens curtas. Este problema foi mencionado em alguns outros fóruns também. Aqui está um link para uma postagem nos fóruns do raspberypi.org sobre este tópico, e Parece que eu estava certo sobre o áudio do pi ser esquisito. Basicamente, a solução mencionada no link que funciona para mim é forçar o espeak a produzir a fala para stdout em vez da placa de áudio, e depois canalizar isso para a reprodução.

espeak --stdout <text> | aplay -q

Isso funciona perfeitamente quando você também canaliza coisas através do netcat.

    
por 01.05.2016 / 19:00
0

Supondo que você não precisa de nc , é possível usar o recurso -c de ncat . Você pode ter que obtê-lo, e como você está usando o raspbian, use isto para obtê-lo:

apt-get install nmap --no-install-recommends

Existem muitos arquivos desnecessários com nmap , portanto você deve obter ncat.

Para configurar o servidor desejado, execute isto:

ncat -l 7777 -k -c "espeak"

Para se conectar (observe que você pode usar qualquer variação nc ):

ncat [your host ip] 7777

O que -c faz em ncat é executar um comando quando um cliente se conecta e enviar o comando stdout para o cliente e receber o stdin do cliente. Isso permite que você execute remotamente o comando espeak .

Outra coisa mais fácil de fazer é usar ssh , que foi o que eu fiz na sua situação. Você deve ser capaz de ativar o servidor ssh no seu pi usando raspi-config , ou fazer da maneira mais difícil.

Você também nota problemas de áudio, que eu também tive com o meu pi. Tudo se resume a ser estúpido, e acho que me lembro de não ser capaz de consertá-lo até que eu reburnt raspbian para o meu cartão SD. Ter uma fonte de alimentação inadvertida também pode fazer com que o áudio gagueje, o que resolvi girando o volume para baixo até um ponto em que não parecia ruim, e usei um alto-falante amplificado para torná-lo mais alto. Trabalhou como um encanto!

    
por 19.05.2016 / 01:58