无服务器搭建直连语音服务(Mumble)

发表于 更新于

前言

如果你经常在 Linux 上玩游戏,可能会因为缺乏国内的语音工具支持而烦恼。或者你有其它理由需要一个私有的语音平台。实际上我们完全可以零成本搭建自己的语音服务,甚至不需要购买云服务器。

本文将告诉你怎么做。这是一篇新手向教程。过程十分简单!

条件

搭建仍然要满足一些前提才可以,请确保:

  • 你以及加入语音的好友都有 IPv6 网络
  • 你最好有一台运行 OpenWrt 的路由器

如果你没有 OpenWrt 路由器,用自己的电脑也是可以的。但使用 OpenWrt 路由器是最安全和有效的一种。

IPv6

IPv6 是直连的必要条件,因为国内的运营商分配的 IPv4 普遍是内部地址。这导致不同地区、不同运营商之间是无法使用分配的 IPv4 直连通信的。

即便国内民用宽带已经是大内网了,但庆幸的是运营商仍然在推动 IPv6 的普及。一般具有 IPv6 的宽带用户其分配的 IPv6 地址是公网地址,且能长期(数天)保持不变。从这里测试你的网络是否支持 IPv6。

我们的语音服务将建立在 IPv6 的直连网络中。假设只有两个人(包括你自己)语音,那么延迟相当于端到端直连。可以比各种公共语音工具更低,音质更好。

Mumble

Mumble 是一个久经考验的开源语音聊天系统,我们的主角就是它。

这个软件的外观一般,但功能十分可靠(很多开源软件都这样)。自我使用 Mumble 以来,它的核心体验非常好。如果你习惯了国内的语音工具那“狗皮膏药”似的界面,会觉得 Mumble 十分简陋,也算一种新的感觉。

通知你的语音好友,安装上最新的 Mumble 客户端。他们要做的仅仅如此。这里有一些我整理的下载链接:

如果你作为语音服务的主机想在本机而不是路由器上部署,请同时下载安装服务端。

部署服务端

要求

下文以 OpenWrt 为重点介绍配置和部署方法,你需要在 OpenWrt 上安装 Docker 和 Docker Compose。本文不做介绍。

如果你的路由器不符合条件,参考本机部署,配置仍然沿用。

快捷部署

进入 OpenWrt,使用 Docker 快速部署服务端。Docker Compose 配置文件如下:

services:
  server:
    image: mumblevoip/mumble-server
    network_mode: host
    restart: on-failure
    environment:
      MUMBLE_CUSTOM_CONFIG_FILE: /data/config.ini
    volumes:
      - ./data:/data

复制以上内容创建 docker-compose.yml 文件并保存到 mumble 目录中。接下来我们创建配置文件。

配置文件

先使用 mkdir -m 777 data 命令创建 data 目录。根据以上 Docker 配置,我们需要创建 data/config.ini 这个文件,复制以下内容:

host=
port=64738
serverpassword=password
database=/data/server.sqlite
logfile=/data/server.log
welcometext="欢迎来到我的 <b>Mumble</b> 服务器!"

之所以用 mkdir -m 777 创建目录是为了避免权限问题(因为我不清楚各位读者用的什么权限的系统用户)。

下面是各个配置选项的解释:

  • host: 服务端的监听地址。留空表示允许来自所有 IP 的访问,包括外部的 IPv4 和 IPv6。
  • port: 监听的端口。值 64738 就是 Mumble 的默认端口。
  • serverpassword: 连接服务器时使用的密码。(此选项需要自行编辑
  • database: 数据库文件路径。此处我们保存到 data 目录,名为 server.sqlite
  • logfile: 日志文件路径。此处保存到 data 目录,名为 server.log
  • welcometext: 欢迎消息。新用户连接到服务器时输出的消息内容。

更多请参考 Murmur.ini 的 Wiki 页面。

完成配置以后执行 docker compose up -d 部署 Mumble 服务端。稍等片刻待它启动,文件树会是以下的样子:

.
├── data
│   ├── config.ini
│   └── server.sqlite
└── docker-compose.yml

使用 docker compose logs 命令查看控制台日志:

server-1  | <W>2024-05-25 18:24:48.320 Murmur 1.5.634 running on Linux: Ubuntu 22.04.4 LTS [x64]: Booting servers
server-1  | <W>2024-05-25 18:24:48.336 1 => Password for 'SuperUser' set to 'jssEL3mAdGwq'
server-1  | <W>2024-05-25 18:24:48.348 1 => Server listening on 0.0.0.0:64738
server-1  | <W>2024-05-25 18:24:48.351 1 => Generating new server certificate.
server-1  | <W>2024-05-25 18:24:48.586 1 => Not registering server as public

日志包含 Mumble 服务端程序(Murmur)的版本、系统版本以及架构、绑定的地址和端口等。注意 jssEL3mAdGwq 是它为我们生成的超级用户密码(随机)。作用参考超级用户

本机部署

如果你的路由器不符合条件,也可以直接部署在本机或局域网其它设备上。

配置方法和上面完全相同,如果用 Windows 作为服务端要注意配置中的文件路径。完成后参考测试连接连接到本机服务(127.0.0.1),没问题就可以邀请朋友测试公网连接了。

现实中,无论是 Windows 还是 Linux,一般默认会启用防火墙。你可能需要添加防火墙规则,让端口可以被外部访问。同时路由器也可能会有防火墙限制来自外部流量直接对内部设备的访问,所以我建议你不要直接分享自己电脑的 IPv6,而是用路由器做转发。

端口转发配置

上图是 OpenWrt 的端口转发配置,你需要转发来自外部 IPv6 的流量到 LAN 口下的内网机器(确保找到自己的机器 IP)。这里我将「外部端口」设置为了 64739,和配置中并不对应,因为对应配置的是「内部端口」。

完成后他人就可以用你路由器的 IPv6 地址和转发中设置的外部端口连接到你本机的 Mumble 服务了。

你的确可以直接关闭所有防火墙,也不用路由器转发,这是最轻松简单的。但个人电脑和局域网将不再安全,有被入侵和攻击的风险,不建议这样做。

测试连接

内网连接

打开 Mumble 客户端,依次点击「服务器」-「连接」-「添加」,填写自己的路由器 Mumble 连接信息:

Mumble 新建连接

如上图所示。地址就是路由器或内网机器的 IP,端口为 64738,用户名写自己常用的名字。别名随意,上图的 router 是路由器的英文,如果你部署在本机可取名为 locale

添加完成后连接,正常来讲会听到一个悦耳的声音,瞬间连接成功。左侧会有这样的日志:

[19:34:50] 正在连接服务器 192.168.1.1 。

[19:34:50] 已连接。

[19:34:51] 欢迎消息:欢迎来到我的 Mumble 服务器!
初次连接时可能会弹出一个证书警告,请选择「是」。这是正常的,因为我们没有配置证书。

然后右侧的房间/用户列表中,你一个人显示在 Root 下。这表示部署和连接都成功了。

公网连接

首先获取你路由器的 IPv6 地址,从路由器的「接口」页面可以看到。不方便看路由器时也可以请求 test.ipw.cn6.ipw.cn 获取。

然后让远在另一个网络中的人使用 Mumble 添加连接,填写你路由器的 IPv6 地址即可,端口仍然一样。名称随意。很快你会看到另一个 Mumble 连接的声音,并看到以下日志:

[19:36:35] Mumla_User 连接到服务器并加入频道。

这里的 Mumla_User 是我用手机的移动网络运行 Mumble 客户端来模拟新用户加入。

不要用手机或其它外放设备在同一个房间测试,会造成可怕的啸叫声。

到这里就已经完全的成功了。内网包括你自己的电脑,以及外网的其他人都可以加入到你的语音服务中。记得把密码分享给他们。

频道管理

如果你只有少数几个好友和自己使用语音,那么上面的过程已经足够了。如果你为更多人服务,就得进行频道管理了。频道可以让不同的人群进入不同的小组,虽共用一个服务但互不干扰。

超级用户

作为服务端管理者,你可以随时修改密码、端口等配置,能一定程度确保安全性。但难以直接管理频道。这时候我们需要超级用户,超级用户可以从客户端动态管理频道,十分方便。

如果你没有记下 Mumble 自动生成的超级用户密码,可以重新生成密码。从 Docker 部署的环境中生成超级用户密码,使用以下命令:

docker compose exec server mumble-server -ini /data/config.ini -supw <password>

<password> 替换为自己的密码。

如果部署在 Windows 上,可以这样:

# 进入 Mumble 服务端安装目录
cd %ProgramFiles%\Mumble
# 执行生成命令
murmur.exe -ini <config_path> -supw <password>

<config_path> 替换为自己的 ini 配置文件路径, <password> 替换为自己的密码。

编辑频道

使用 SuperUser 这个用户名和超级用户密码重新连接 Mumble 服务器。在客户端窗口的右侧区域右键会看到「添加」、「编辑」等菜单。

Mumble 频道

如图所示,我添加了「Apex Legends」和「Dont’s Staver (饥荒)」两个新频道。双击名称切换频道。

其实 Root 自身也是一个频道,因为频道以树形组织,允许嵌套。所以你可以在以游戏命名的频道里边继续创建 房间1房间2 这样的子频道。

这样就可以让更多群体加入你的 Mumble 服务了。如果你使用的是自己的服务器,要特别注意只能将服务器信息告知给信任的人,避免遭到攻击。

功能介绍

这里介绍一些具有高实用价值的基础功能,不定期更新。

文字交流

Mumble 是可以进行基本的文字交流的。如图所示:

Mumble 文字聊天

你可以像我一样,在界面设置中将 Mumble 的布局修改为「堆叠」。

压缩质量

点击客户端的「配置」-「设置」进入音频输入,可以看到压缩里边有两个滑动条,其中质量表示音频的压缩率。

我们以著名的语音聊天软件 Discord 为参考,它的音频质量在 8bk 到 96kb。默认为 64kb。Mumble 可以设置远超 96kb 的音频质量,最高达 192kb。我们可以按需设置,通常良好的网络下可以设置得更高。

Mumble 的中文翻译可能会将 kbps 显示为「千字节」,这其实是没必要的。大家明白就好。

语音阀值

点击客户端的「配置」-「设置」进入音频输入,可以看到安静阀值和语音阀值两个滑动条。安静阀值可以避免环境音输出到队友那边。

举个例子,我们故意敲击键盘,观察键盘声音能达到的音量。将语音阀值滚动条拖动到键盘声的最大音量右边。这样键盘声音就不会作为音频信号输出了。因为我们自己的说话声是明显大于键盘音的,所以不会对交流产生影响。

结束语

Mumble 还可以通过超级用户进行复杂的 ACL 权限管理,客户端还可以使用插件和游戏集成。更多内容有待你们自行发掘。

作者头像 一点点入门知识 打赏作者
本文由作者按照 CC BY 4.0 进行授权
分享: