1 个不稳定版本
0.1.0 | 2023 年 9 月 4 日 |
---|
66 在 #discord-bot
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
,将程序的输出设置到这个新的接收器
(注意:您将无法再在正常的扬声器上听到此应用程序)
然后,使用这个接收器的监视器与 parec
一起使用,并将输出传递给 stdinman!
parec -d stdinman-demo.monitor --format=float32le --rate=48000 | stdinman
谢谢
非常感谢 Enitoni 的 pulseshitter,这是我这个项目的灵感。
还要感谢 serenity & songbird 的出色开发者,他们让使用 Discord 机器人和在 Rust 中流式传输音频变得如此简单。
依赖关系
~13–17MB
~323K SLoC