洒家好久不写博客,最近从垃圾堆里翻出博客代码,修整一番。语音包是很久之前做出来的,最近没有队友不怎么打游戏,这里只是写篇娱乐文章刷一下存在感。
介绍¶
用到的设备和部分软件¶
- 运行游戏(CS:GO)的电脑(Windows)
- 控制放语音的电脑(屏幕越大越好,平板,手机也能凑合用)
- Web 服务器(可以用虚拟机,最好在本地或局域网)
- 浏览器
- Voicemeeter 虚拟声卡等软件
- Matlab
效果展示¶
用另一台设备可以控制打游戏的电脑播放语音包。接收端打开接收页面,发送端打开发送页面。进入游戏,发送端点击方块发送任意语音,接收页面就会立即播放这条语音,在游戏中按语音键就可以将其发出。
可以达到以下效果:
- 语音包没有噪音和回音,自己可以听到语音包
- 放语音包的同时可以正常说话,说话没有噪音和回音
- 无需复杂操作,直接扫码就能控制接收端
- 稍加练习就可以在 1 秒钟左右快速放出语音
接收端:
发送端:
竞品缺点分析¶
这一套方案对比现有的其他语音包方案有明显的优势。现有的语音包方案有:
- 直接用手机对着话筒播放
- 用 AUX 线
- 绑定快捷键(例如 EXP Soundboard)
- 集成 CS:GO 控制台(例如 SLAM)
- 立体声混音,切出游戏播放
很明显,以上方案各有缺点:
- 有噪音或回音
- 快捷键有限且难记
- 控制台操作复杂,发送太慢
- 网上下载的语音质量太差,音量不统一,语音包总量有限
- 配置为发语音包时不能说话
- 声卡限制或 bug
针对以上缺点,洒家必须自己搞一个语音包。
开始搞事¶
收集素材¶
从网络上可以轻松下载各种语音包,例如李云龙、卢本伟、二次元、守望先锋等语音包。这些语音质量不完美,数量较少,因此还需要自己录一些语音。
在 bilibili 搜索录播视频,先看弹幕列表了解精彩言论的大致位置。跳过去听一听然后记录下值得保存的语音的时刻。
搞一个录音软件,集中录下来。此处使用 macOS 版 Audio Hijack。
简单的剪辑一下原始音频文件,去掉开头和结尾的空白部分。此处使用 macOS 版 QuickTime Player 内置的剪辑功能。
统一音量¶
无论从网上下载还是自己录音,得到的音频文件的音量往往有很大差距,必须把音量标准化。
洒家用 Matlab 写程序处理了一番,规定一个标准音频文件,将其他所有音频文件音量标准化。洒家实验了很多思路,考虑过等响度曲线,用过傅里叶变换,最后采用了一种简单的思路。提取音频文件的振幅,求绝对值,排序,取最大的 部分振幅的平均振幅,以此参数为标准进行标准化。经过测试,这种方法还不够完美,但是已经够用了。
写 Web 代码¶
使用 PHP
,websocket
, docker
一顿操作搞出一个网站。上文有截图。
Sender
通过 websocket
传输要发送的语音的 URL
,websocket server
会把收到的消息转发给所有 Receiver
。每一个 Receiver
在打开时会随机生成一个 Client code
,并生成包含此 Client code
的二维码。Receiver
只对包含此 code
的消息做出响应。打开 Sender
时需要输入 Client code
,从而只控制对应的 Receiver
,同时不影响其他 Receiver
。(此处不考虑消息重放)
按类别和场景,音频文件分成多个部分,方便快速定位语音。在实践上,一般把这套系统部署到局域网的 Web Server 或者电脑虚拟机中,以减少延迟。
Windows 版内录软件¶
洒家用的是 VB-Audio 做的内录虚拟声卡 Virtual Audio Cable 和虚拟混音器 Voicemeeter 两个软件。不同的设备的设置和需要的组件可能不同,洒家的配置如下。
为了达到效果,音频信号的流动方向应该是:
按照这个思路,配置 Voicemeeter。(洒家的电脑有 bug,配置略有不同)
在游戏中设置默认输入和输出设备。同时设置系统默认输入输出设备,作为浏览器的配置。
设置完成后打开发送端和接收端,就可以进入游戏发语音包了。
游戏中放语言包的效果和经验¶
一般放语言包的目的有:
- 冒充名人,例如卢本伟
- 娱乐和指挥,例如李云龙
- 骂人,例如茄子和卢本伟
洒家经常放卢本伟的语音。效果最好的时候,整局游戏中队友都以为自己遇到了卢本伟(笑)。被识破了之后,所有人也都在说这个语音包太牛 X 了。效果最好的语音有:当时就是那个骂人的事情嘛,我得先去反省一下
等,还有连环语音 这是这 10 年以来第二款惹我生气的游戏
、第一款游戏叫英雄联盟
,以及超级骂人语音。每次总能遇到不一样的队友做出不一样的反应。有一次我遇到了卢本伟的资深粉丝,我发的每一句语音他都知道出自哪里。(难道是同行?)
有时候也可以放李云龙的语音指挥队友,效果最好的时候,一群队友问我 李团长,怎么打
。李云龙语音包的主要问题是语音数量太少,战术指挥的时候不够用。
经验¶
- 放弃不合适的听众
- 不是所有人都觉得语音包有意思,队友们反应冷淡就赶紧换个房间
- 不要打扰队友
- 游戏里活着的时候不放,死了再放,否则容易被所有人屏蔽
- 言多必失,一句话只放一遍,打完一局赶紧退
- 听众需要新鲜感
- 有一次所有人都以为卢本伟本人来了,直到我一句话放了两遍
- 不要放网络上能随便下载到的语音,多放自己录的语音
- 听众需要新鲜感
- 听过这些语音的人马上就能知道来了个语音包
总结¶
一顿操作之后,算下来打游戏的时间还没有做语音包的时间长(笑)。