我正在尝试从 dota2 游戏文件中获取评论(解说员语音)。我设法解析了游戏文件并选择了我认为的语音数据。这是一种奇怪的格式 (CSVCMsg_VoiceData),其结构如下:
type CSVCMsg_VoiceData struct {
Client *int32 `protobuf:"varint,1,opt,name=client" json:"client,omitempty"`
Proximity *bool `protobuf:"varint,2,opt,name=proximity" json:"proximity,omitempty"`
Xuid *uint64 `protobuf:"fixed64,3,opt,name=xuid" json:"xuid,omitempty"`
AudibleMask *int32 `protobuf:"varint,4,opt,name=audible_mask" json:"audible_mask,omitempty"`
VoiceData []byte `protobuf:"bytes,5,opt,name=voice_data" json:"voice_data,omitempty"`
Caster *bool `protobuf:"varint,6,opt,name=caster" json:"caster,omitempty"`
Format *VoiceDataFormatT `protobuf:"varint,7,opt,name=format,enum=VoiceDataFormatT,def=1" json:"format,omitempty"`
SequenceBytes *int32 `protobuf:"varint,8,opt,name=sequence_bytes" json:"sequence_bytes,omitempty"`
SectionNumber *uint32 `protobuf:"varint,9,opt,name=section_number" json:"section_number,omitempty"`
UncompressedSampleOffset *uint32 `protobuf:"varint,10,opt,name=uncompressed_sample_offset" json:"uncompressed_sample_offset,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
这在读取数据时似乎有效。从逻辑上讲,当给出以下内容时,我可能正在寻找结构的 VoiceData 部分:
“格式”:0 “voice_data”: “UZ + ACgEAEAELgD4EQgEWAKV4mxnepfmhxKCQxAnKVNaHhKRXPIsmAH5RjXmJV0u + WTmrvgyCKxcraehjo / ZeKcFjksXQZEeOju4hLNv / MAB9KA7ww14Vc0ndYPB7dDXoXTexuxcW0Jg / diMgdH5ijWhe02Ch48KX86qJZYFyZV81AH76qCgh9AXliMdyWEgWTMbRD6xMX37WJALrXlSnxymIloSq2KGwXCcMXzQiSQIrcLVNfqdNJACCluFOIRKPmugUvsLZmnD04X0xhpAuNkwJECK4t51MBOWNWJlCAIDyZlJwWI45EPTjBB6yKyGOclu96qBV2MhFAh1d2J7WDZwe6YxOVu / BGkGcur9qTP85ZRfjANoiQxQrWvpoHFBFBy0AfX6k8XvbSwrk2nUAEP3P6kcmXORKUNKeu8HDnOUflQqtA5AkkTiun77fZrqnimIfWg ==”, “sequence_bytes”:23598094, “的section_number”:1, “SAMPLE_RATE”:16000
我能拉语音数据出来,像这样: UZ + ACgEAEAELgD4EQgEWAKV4mxnepfmhxKCQxAnKVNaHhKRXPIsmAH5RjXmJV0u + WTmrvgyCKxcraehjo / ZeKcFjksXQZEeOju4hLNv / MAB9KA7ww14Vc0ndYPB7dDXoXTexuxcW0Jg / diMgdH5ijWhe02Ch48KX86qJZYFyZV81AH76qCgh9AXliMdyWEgWTMbRD6xMX37WJALrXlSnxymIloSq2KGwXCcMXzQiSQIrcLVNfqdNJACCluFOIRKPmugUvsLZmnD04X0xhpAuNkwJECK4t51MBOWNWJlCAIDyZlJwWI45EPTjBB6yKyGOclu96qBV2MhFAh1d2J7WDZwe6YxOVu / BGkGcur9qTP85ZRfjANoiQxQrWvpoHFBFBy0AfX6k8XvbSwrk2nUAEP3P6kcmXORKUNKeu8HDnOUflQqtA5AkkTiun77fZrqnimIfWg ==
然而,这是我碰到了一些障碍的地方。此数据的格式未知。我试图对可能的格式进行一些研究,我发现 Steam 在 2011 年开始使用 SILK 编解码器处理语音数据 - 但是当尝试将此数据写入文件并使用 opus 打开它时(我相信它支持SILK) opus 解码器告诉我它无法打开文件 - 所以我不是 100% 相信它是 Silk 编解码器。识别音频数据不是我有丰富经验的事情 - 所以任何建议都会很棒。
我注意到结构中有一个 VoiceDataFormatT 部分,但我能找到的唯一定义是:
type VoiceDataFormatT int32
这似乎没有太大帮助!:/
编辑 1: 根据用户 Ian Cook 的建议,我已将 base64 中的数据解码为以下内容(作为十六进制转储):
BB 3F 80 0A 01 00 10 01 0B 80 3E 04 42 01 16 00 A5 78 9B 19 DE A5 F9 A1 C4 A0 90 C4 09 CA 54 D6 87 84 A4 87 8 9 5 B 9 5 B 7 9 D B AB BE 0C 82 2B 17 2B 69 E8 63 A3 F6 5E 29 C1 63 92 C5 D0 64 47 8E 8E EE 21 2C DB FF 30 00 7D 28 0E F0 C3 5E 6 7 D 3 7 D 3 E 5 B 7 5 E 3 B 17 16 D0 98 3F 76 23 20 74 7E 62 8D 68 5E D3 60 A1 E3 C2 97 F3 AA 89 65 81 72 65 5F 35 00 7E FA A8 28 5 7 4 F A8 28 5 7 4 F 8 C 8 5 C 8 4 F 7 F 5F 7E D6 24 02 EB 5E 54 A7 C7 29 88 96 84 AA D8 A1 B0 5C 27 0C 5F 34 22 49 02 2B 70 B5 4D 7E A7 4D 24 06 1 9 A 24 06 1 9 A 24 06 E 1 9 A 24 06 E 1 9 F4 E1 7D 31 86 90 2E 36 4C 09 10 22 B8 B7 9D 4C 04 E5 8D 58 99 42 00 80 F2 66 52 70 58 8E 39 10 F4 1 B7 9D 4C 04 E5 8D 58 99 42 00 80 F2 66 52 70 58 8E 39 10 F4 1 B7 E3 2 5 5 B C 5 E3 2 5 04 B 5 8 B 1D 5D D8 9E D6 0D 9C 1E E9 8C 4E 56 EF C1 1A 41 9C BA BF 6A 4C FF 39 65 17 E3 00 DA 22 43 14 2B 5A FA 68 1C50 45 07 2D 00 7D 7E A4 F1 7B DB 4B 0A E4 DA 75 00 10 FD CF EA 47 26 5C E4 4A 50 D2 9E BB C1 C3 9C E5 1F 90 3 9 DFA 6 FAA 6 BA 3 8A 62 1F 5A
我仍然不知道这些信息是什么 - 我已经尝试使用 ffmpeg(假设是 pcm)将其转换为 wav 文件,但它仍然以白噪声的形式出现。
编辑 2: 所以我想到如果我包含更多数据样本可能会有所帮助 - 可以在此处找到解码的数据十六进制(每个样本由换行符分隔):
我注意到每个似乎都以以下十六进制开头:
BB 3F 80 0A 01 00 10 01 0B 80 3E 04
翻译成:
»?€ €>
我仍然不知道如何将其转换为音频数据。
编辑 3: 我已经将更多的数据转储上传到以下 pastebin(更多数据),它不是一个完整的转储,因为它大约 15mb 并且当我尝试粘贴时 pastebin 崩溃了!
数据文件是一个 dota2 演示文件(扩展名 .dem),它是我使用 GoLang 和 Manta 重放解析(在这里找到)解析的 protobuf 消息的集合。这允许我提取任何类型的消息,我选择 OnCSVCMsg_VoiceData,它返回 m.Audio.VoiceData 的形式:CSVCMsg_VoiceData(我在上面显示的结构)。
编辑 4
这是(最后)带有连接的 voiceData 消息的文件的链接。
这是 protobuff消息原始文件的链接