恢复与重放Garmin语音指令
设备损坏与数据恢复
我们拿到了一台损坏的Garmin nuvi 56LM GPS设备,从中恢复了一个包含语音日志的文本文件。这个过程比较特殊,因此我们觉得分享这个故事会很有趣。
由于设备损坏严重,芯片提取成为唯一选择。芯片是SanDisk 8 GB eMMC芯片,多次读取产生的哈希值相同,表明芯片状态稳定。
文件系统提取与分析
使用R-studio成功从转储中恢复/提取了文件系统,发现了两个分区:
- FAT16(128 MB)
- FAT32(3.3 GB)
在寻找带时间戳的经纬度坐标时,发现了一些值得注意的文件:
FAT16/.System/SQLite/RecentStops.db 包含带有缩放经纬度数值的"history"表。将这些原始数字乘以180/2^31,可获得可绘制的经纬度坐标。
FAT16/.System/SQLite/pre.db “route_segment"表包含时间戳和经纬度路线信息。“history"表包含起始经纬度、结束经纬度和开始时间。
FAT16/.System/Diag/EventLogs/*.TXT 包含可能带时间戳的经纬度坐标,但文件也包含非ASCII/二进制字节。
语音日志的发现
BJ提醒我们注意一个有趣的工件:
FAT32/Voice/logs/vpm_log_all.log 这个文本文件按时间顺序记录GPS语音指令。由于缺乏测试设备,我们不能保证车辆正好在语音提示的位置,但这可能用于显示用户在该区域或知道该区域。
语音日志包含如下行:
|
|
语音字符串分析
语音部分是"Map Phonetics: “和”(MDB Lang: 23)“之间的字符串。这些字符串使用的是X-SAMPA系统(国际音标ASCII表示法的一种)。
行格式可概括为:
|
|
语音合成解决方案
我们发现了一个使用Amazon Polly Speech API的网站(http://ipa-reader.xyz/),可以将X-SAMPA IPA字符串转换为语音。但为了处理大量日志条目,我们寻找了免费替代方案。
espeak-ng 是一个开源C库,Ubuntu可通过以下命令安装:
|
|
转换过程
我们需要将X-SAMPA字符串转换为espeak-ng可理解的Kirshenbaum字符串:
- 在输入字符串前后加上’[[‘和’]]’,让符号被解释而非拼写出来
- 将’{‘字符替换为’a’
- 将双引号"替换为单引号’,表示主要重音
- 将’%‘替换为’,’,表示次要重音
- 将’A’替换为’a’
例如,语音日志字符串:
|
|
转换为:
|
|
要将其保存为WAV文件:
|
|
Python脚本自动化
我们编写了Python3脚本(parse_garmin56LM.py),使用免费的espeak-ng库将Garmin 56LM语音日志文本转换为WAV文件。
脚本逻辑:
- 打开/读取vpm_log_all.txt
- 对每一行:提取语音字符串,转换为espeak-ng输入,生成WAV文件
- 生成包含原始行文本、转换后文本和WAV文件链接的HTML报告
运行方式:
|
|
最终成果
我们成功编写了脚本,从Garmin nuvi 56LM(2014)语音日志中提取IPA字符串并转换为WAV文件。脚本的字符串转换代码(见"process_voicestring"函数)可能需要根据用户数据/语言设置进行调整。该脚本可能适用于其他Garmin GPS型号,但尚未测试。