내 질문에 답하기 위해 Raspberry Pi에 로봇을 만들려고 합니다.
처음에는 이름을 들었을 때만 응답하도록 설정했는데 정말 효과가 좋았습니다. 그런데 이제 좀 더 자연스러운 대화를 추가하다 보니 문제가 생겼습니다.
로봇이 aplay 명령을 사용하여 말할 때마다 arecord 명령은 자신의 음성을 캡처하여 처리를 위해 로봇에 보냅니다. 로봇은 내 목소리와 자신의 목소리의 차이를 구분할 수 없었기 때문에 반복적으로 스스로에게 말하기 시작했습니다(매우 우스꽝스럽습니다. 덧붙여야겠습니다).
듣고 있는 내용이 정확히 말하는 내용인지 확인하기 위해 봇 코드를 검사했지만(텍스트로 변환한 후) 잘 작동하지 않으며(때로는 자체적으로 이해하고 거의 변경하지 않음) 약간의 추가 시간이 소요되었습니다. 이것을 발견하기 위한 처리 시간이 있었는데, 그 동안 내가 듣고 있는 소리가 자신의 소리인지 알아내려고 하기 때문에 내 명령이 처리되지 않았습니다.
동일한 시스템의 aplay 인스턴스가 말한 내용을 record 인스턴스가 무시하도록 만드는 방법이 있는지 궁금합니다. 나는 낮은 수준의 솔루션이 확실히 가능하다고 생각합니다(예: 헤드폰 없이 Skype를 사용하는 방법이 궁금합니다. 친구의 음성을 무한히 반복하지 않기 위해 음성 인식을 사용할 필요는 없습니다).
한동안 해결책을 찾고 있었지만 이 문제에 대한 언급을 찾을 수 없는 것 같습니다(일반적인 문제인 것 같습니다). 어쩌면 나는 이 현상의 이름을 모를 수도 있다. 아이디어?
답변1
arecord
제어 중인 스피커의 마이크를 통해 사운드를 캡처하는 데 문제가 있는 경우 aplay
지연이 발생할 수 있습니다.
고객님께서 찾으시는 키워드는에코 취소. 예를 들어 Linux 기반 스마트폰에서는 ALSA 및 Pulseaudio에 기존 소프트웨어를 사용할 수 있습니다.
기본적으로 알고리즘은 수신된 입력과 전송된 출력을 연관시켜 지연을 측정하고 볼륨을 결정한 다음 입력에서 올바른 지연 및 스케일링이 포함된 출력을 빼서 이를 취소해야 합니다.