[인랑게임에 딱] Discord의 통화전송봇을 discord.js로 만들고 싶어💭

안녕하세요, 최근에 친구에게 초대되어 Among Us에 빠져 있습니다. 유행하고 있네요.

온라인으로 인랑 같은 게임을 할 때, Discord에서 음성 채팅을 하면서 하는 일이 많습니다만, 「추방」이나 「무잔인 모습으로 발견된」 후에는 회의에 참가할 수 없는 특성이 붙는 것입니다 .
  • 음성 채팅에 남은 다음 게임의 모습을 묵묵히 듣는다
  • 다른 보이스 채팅으로 옮겨 탈락자끼리 '속이었다—!'나 '더 할 수 있었구나~' 등 이야기한다

  • 탈락했을 때는 어느 쪽인가의 선택을 강요당하게 됩니다.

    둘 다 채우고 싶다는 욕심 정신의 전, 'Discord의 음성 채팅이 다른 채널로 전송할 수 있으면 모습을 보면서 더 즐길 수 있는 것은 아닐까? ? 』라고 생각하고 작성하기로 했습니다.

    ※ 후술합니다만, 문제로서 AudioStream의 합성이 되어 있지 않기 때문에 복수인으로 동시에 말했을 때에 음성이 중단되는 일이 있어, 해결책 모집중입니다.

    완성 이미지





    이 이미지를 바탕으로 개발하겠습니다.

    개발 환경


  • Node.js 12.18.4
  • discord.js 12.3.1

  • 구현



    전체는 이렇게 되었습니다. GitHub
    채널 선택 등으로 커져 버렸으므로, 전송의 코어의 부분만 여기에서 소개하겠습니다.

    전송원측의 클라이언트로부터 음성을 취득해, 그대로 전송처의 클라이언트로부터 송신하고 있습니다.

    module/core.js
    // 前略
    
    // Streamにデータを流して初期化しないと正常に動作しないようです
    this.connection.from.play(new Silence(), { type: "opus" })
    this.connection.to.play(new Silence(), { type: "opus" })
    
    this.connection.from.on("speaking", (user, speaking) => {
      // 転送元の誰かが発話した際のみ処理を行う
      if (speaking.bitfield !== 1) return
      const stream = this.connection.from.receiver.createStream(user.id)
    
      // TODO: ここで他のStreamと合成をしたい
    
      this.connection.to.play(stream, { type: "opus" })
    })
    
    // 後略
    

    요약



    탈락 후도 모습을 보면서 이야기를 할 수 있는 음성 채팅을 준비할 수 있었습니다.
    Discord.js는 처음으로 Bot의 디렉토리 구성 등이 아직 갖추어지지 않았기 때문에 앞으로 조정을 실시합니다.

    또, 현상의 문제점으로서 AudioStream가 합성할 수 없고 복수인이 발화했을 때는 1프레임을 서로 빼앗아, 끊어져 끊어져 버린다고 하는 것이 있습니다.
    이쪽을 해결하지 않는 것에는 그다지 쓰기가 좋다고 말할 수 없기 때문에, 어떻게든 해결해 나가고 싶다고 생각하고 있습니다.

  • marge-stream 을 사용한 방법에서는 음성 합성을 하는 것은 아니므로 음성이 차례로 풀려나는 것만으로 해결에는 이르지 않았습니다.

  • WebAudioAPI를 사용한 방법 도 생각했습니다만, 브라우저를 만지고 있는 것은 아니기 때문에 받아들이기가 어렵다고 생각하고 있습니다.

  • 해결책 생각해 온 분 계시시면 코멘트나 풀 요청 받을 수 있으면 대단히 도움이 됩니다🙏

    여러분도 Discord Bot에서 좋은 게임 라이프를!

    좋은 웹페이지 즐겨찾기