espeak가 netcat에서 파이프된 stdout을 계속해서 말하도록 만드는 방법

espeak가 netcat에서 파이프된 stdout을 계속해서 말하도록 만드는 방법

나는 원격 서버에서 입력을 받는 netcat에서 파이프된 콘텐츠를 알리기 위해 espeak를 사용하여 일종의 PA 시스템으로 사용하고 싶은 Raspberry pi 3을 가지고 있습니다. 파이에서는 다음과 같이 리스너를 시작합니다.

nc -lk 7777 | espeak

원격 컴퓨터(테스트 목적으로 Macbook Pro)에서 발행합니다.

echo "hello world" | nc raspberrypi 7777

가장 먼저 보낸다고 하는데 더 보내려고 하면 음성도 출력되지 않고 터미널에 텍스트도 쓰지 않습니다. netcat은 여전히 ​​실행 중이지만 espeak는 중지된 것과 같습니다.

터미널에 stdout을 넣고 Mac에서 echo | nc 명령을 스팸으로 보내 모든 것이 예상대로 pi에 표시되도록 파이프 없이 리스너를 시작해 보았습니다.

솔루션을 찾기 위해 인터넷 검색을 시도했는데 nc 리스너에서 데이터 파일로 stdout을 지속적으로 공급하는 방법이 있지만 espeak와 관련된 내용은 볼 수 없습니다.

또한 nc를 tee 및 logave와 같은 다른 명령에 연결해 보았지만 예상대로 작동하여 nc의 출력을 파일에 지속적으로 기록했습니다.

고쳐 쓰다

나는 위에서 언급한 설정이 Linux Mint를 리스너로 실행하는 강력한 데스크톱과 에코를 보내는 클라이언트로 Ubuntu Server를 실행하는 거의 강력한 서버 상자에서 원활하게 작동하도록 아래 설명에서 언급했습니다. 이것은 NC가 아니라 Pi가 책임이 있다고 생각하게 만듭니다. 나는 이것이 Pi의 오디오와 관련이 있다고 의심하여 ​​몇 가지를 시도했습니다.

  • mplayer를 사용하여 HDMI와 3.5mm 잭을 통해 Wi-Fi를 통해 mp3 라디오 방송국을 스트리밍하면 무슨 일이 일어나고 있는지 알 수 있었지만 심각한 끊김 현상이 발생했습니다. 이더넷을 통해 시도했지만 동일한 결과를 얻었습니다.

  • mplayer를 사용하여 HDMI를 통해 로컬에 저장된 mp3 파일을 재생하는 경우에도 동일한 지연이 발생합니다.

  • aplay를 사용하여 HDMI를 통해 동일한 mp3를 재생하면 큰 백색 소음이 발생합니다.

또한 대화형 모드에서 espeak를 시도했지만 동일한 문제가 발생했습니다. 입력한 첫 번째 줄은 표시되지만 이후의 모든 줄은 무시됩니다. 가끔 위와 같이 nc를 건드리면 내가 입력하려던 줄을 한꺼번에 다 뱉어내는 경우가 있습니다.

답변1

내 pi jessie에서 3가지 다른 버전의 netcat을 시도 했지만 netcat -lk지원하지 않거나 -k첫 번째 연결 후 서버가 바쁜 루프에 갇히게 됩니다.

$ 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}])

socat나에게 도움이 된 것을 사용하는 것이 좋습니다 . 다음은 동등한 행입니다.

socat -u TCP4-LISTEN:7777,reuseaddr,fork - | espeak

답변2

Raspbian을 다시 설치하면 문제가 해결된 것 같습니다. 제가 초기 프로젝트에 알사를 방해하는 뭔가를 설치한 것 같아요.

이제 Espeak는 일반 대화형 모드와 netcat에서 콘텐츠를 스트리밍할 때 모두 응답합니다. 하지만 오디오가 5~10초 정도 지나면 고장이 나기 시작하지만 짧은 메시지만 읽어주기 때문에 나에게는 문제가 되지 않는다고 생각합니다. 이 문제는 다른 포럼에서 언급되었습니다.이것은 링크입니다이 주제에 대한 raspberypi.org 포럼 스레드로 이동하면 파이 오디오가 불안정하다는 것이 맞는 것 같습니다. 기본적으로 저에게 효과가 있었던 링크에 언급된 해결책은 espeak가 음성을 사운드 카드 대신 stdout으로 출력하도록 강제한 다음 이를 재생으로 파이프하는 것이었습니다.

espeak --stdout <text> | aplay -q

이는 netcat을 통해 콘텐츠를 파이핑할 때도 매우 잘 작동합니다.

답변3

필요하지 않다고 가정하면 해당 기능을 nc사용할 수 있습니다 . 그래도 가져와야 할 수도 있습니다. Raspbian을 사용하고 있으므로 다음 명령을 사용하여 가져오세요.-cncat

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

원치 않는 파일이 많이 있으므로 nmap이로 인해 ncat이 발생합니다.

필요한 서버를 설정하려면 다음 명령을 실행하십시오.

ncat -l 7777 -k -c "espeak"

연결(어떤 변형이라도 사용할 수 있음 nc):

ncat [your host ip] 7777

클라이언트가 접속할 때 명령을 실행하여 클라이언트에 명령을 보내고, 클라이언트로부터 명령을 받는 역할 -c을 합니다. 이를 통해 원격으로 명령을 실행할 수 있습니다 .ncatstdoutstdinespeak

더 쉬운 또 다른 방법은 을 사용하는 것인데 ssh, 제가 귀하의 경우에 했던 방법입니다. pi에서 활성화된 SSH 서버를 사용할 수 raspi-config있거나 어려운 방법으로 수행할 수 있어야 합니다.

당신은 또한 오디오 문제를 발견했습니다. 제 파이에도 이 문제가 있었습니다. 그것은 모두 어리석음으로 귀결됩니다. SD 카드에 Raspbian을 다시 플래시할 때까지 문제를 해결할 수 없었던 것을 기억합니다. 전력이 부족하면 오디오가 고르지 않게 될 수도 있습니다. 저는 볼륨을 듣기 좋은 수준으로 낮추고 증폭 스피커를 사용하여 소리를 더 크게 만들어 이 문제를 해결했습니다. 효과는 매우 좋습니다!

관련 정보