#discord #discord-bot #pipe #style #unix #input

app stdinman

将音频管道传输到 Discord,Unix 风格

1 个不稳定版本

0.1.0 2023 年 9 月 4 日

66#discord-bot

WTFPL 许可证

44KB
152 代码行

stdinman

通过机器人将原始音频通过管道传输到 Discord 的工具。输入数据必须是 PCM 32 位浮点小端格式(即 f32le)。

如果您的音频格式不是上述格式,可以使用 ffmpeg 等工具将其转换为所需格式。

ffmpeg -re -i sample.mp3 -map 0:a:0 -c:a:0 pcm_f32le -ar 48000 -ac 2 -f f32le - | stdinman

动机

有几种有趣的 Discord 机器人,例如用于播放 YouTube 链接、soundcloud 等。然而,作为一个 Arch Linux 用户,我希望有一个非常可组合的工具 - 通过机器人将任何原始音频播放到 Discord 的能力。

这正是这个程序所做的。用户可以完全自行准备音频源 - 例如麦克风、扬声器输出(即 alsa 监视器)、互联网音频流(或任何可以传递给 ffmpeg 的东西),或者旋转黑胶唱片*。请查看食谱部分以获取更多信息。

构建

确保您已安装 rust 工具链,例如通过 rustup,然后运行

cargo build --release

二进制文件将在 ./target/release/stdinman 中。将其复制到您的 PATH 中的某个位置或直接在此处运行它。

用法

stdinman 通过 Discord 机器人工作,连接到语音频道。您必须确保此机器人

  • 添加到您想流式传输音频的服务器
  • 具有“连接”和“说话”语音权限

您需要提供机器人的令牌和您想连接到的语音频道的 ID。这些可以通过 CLI 参数传递

stdinman --bot-token [BOT_TOKEN] --voice-channel-id [VOICE_CHANNEL_ID]

或者,只需运行 stdinman 一次,它将在 $XDG_CONFIG_HOME/stdinman/stdinman.toml 中生成一个配置文件,您可以在其中存储机器人令牌和语音频道 ID。

现在只需将音频管道传输到 stdinman!请查看食谱部分以获取一些示例。

可以通过环境变量配置日志: export RUST_LOG=stdinman=DEBUG

食谱

涉及 pactl 的配方适用于 Linux 系统上的 PulseAudio(或通过 Pulseaudio shim 使用 Pipewire)。使用 ffmpeg 的示例也可以在 Mac 上使用。

将 ffmpeg 输出流式传输到 Discord

ffmpeg 是一款惊人的音视频工具,可以处理大量的输入格式。如果您可以将音频从源传递到 ffmpeg,或者甚至是一个视频(假设您只需要音频),您可以配置它输出 32 位浮点 PCM 音频,然后将其通过 stdinman 管道传输并流式传输到 Discord。

您应该在输入上使用 -re 标志,以确保 ffmpeg 实时消费它。

ffmpeg -re -i sample.mp3 -map 0:a:0 -c:a:0 pcm_f32le -ar 48000 -ac 2 -f f32le - | stdinman

通过 librespot 和 ffmpeg 直接将 Spotify 流式传输到 Discord

通过使用来自 librespot 的出色工作,您可以创建一个“Spotify Connect”设备,您的账户可以播放音频,其输出可以传输到另一个程序。

使用中间的 ffmpeg 确保格式匹配,然后我们可以将其通过 stdinman 管道传输并直接流式传输到 Discord!

librespot -n stdinman_connect --backend pipe -b 320 | ffmpeg -f s16le -ac 2 -ar 44100 -re -i pipe:0 -map 0:a:0 -c:a:0 pcm_f32le -ar 48000 -ac 2 -f f32le - | stdinman

有关如何使用 librespot 的更多信息,请查看他们的 存储库

注意:使用 librespot 可能违反 Spotify 的 规定

(Linux)通过 Discord 播放计算机扬声器的输出

注意:如果您在同一台计算机上的语音频道中,您会在音频中听到一种“回声”——首先您的耳机/扬声器,然后是带有延迟的 Discord 中的音频。在这种情况下,建议将音频输出到虚拟接收器,然后通过机器人播放(请参阅下一个配方)。这还有一个额外的优势,即共享特定应用程序的音频而不是整个系统的音频。

您可以使用 pactl 查看与您的扬声器对应的监视输入

$ pactl list short sources
77	alsa_output.pci-0000_00_1f.3.3.analog-stereo.monitor	PipeWire	s32le 2ch 48000Hz	SUSPENDED
78	alsa_input.pci-0000_00_1f.3.3.analog-stereo	PipeWire	s32le 2ch 48000Hz	SUSPENDED

在这种情况下,alsa_output.pci-0000_00_1f.3.3.analog-stereo.monitor 是扬声器的监视器。要与其一起使用 stdinman

parec -d alsa_output.pci-0000_00_1f.3.3.analog-stereo.monitor --format=float32le --rate=48000 | stdinman

(Linux)仅通过 Discord 播放特定应用程序的音频

这将将来自应用程序的所有音频路由到虚拟接收器,然后您可以将其传递到 stdinman 以流式传输到 Discord。

为此,我们首先需要通过 pactl 创建虚拟接收器。您可以将 stdinman-demo 替换为您想要的任何名称。

pactl load-module module-null-sink media.class=Audio/Sink sink_name=stdinman-demo channel_map=left,right

然后,使用一些 GUI,如 pavucontrol,将程序的输出设置到这个新的接收器

changing the output of a program to the new sink

(注意:您将无法再在正常的扬声器上听到此应用程序)

然后,使用这个接收器的监视器与 parec 一起使用,并将输出传递给 stdinman!

parec -d stdinman-demo.monitor --format=float32le --rate=48000 | stdinman

谢谢

非常感谢 Enitoni 的 pulseshitter,这是我这个项目的灵感。

还要感谢 serenity & songbird 的出色开发者,他们让使用 Discord 机器人和在 Rust 中流式传输音频变得如此简单。

依赖关系

~13–17MB
~323K SLoC