背景

需求是把微信多个对话里的语音全部保存下来, 保存到一个文件或者一份链接. 指向多个文件.

调查

目前主流的方案是手动点击收藏, 然后把语音转存为笔记, 然后实际就变成了一份silk文件, 在android或者在pc上就能够从目录里提取出来, 进行编码转换.

wechatExporter导出ios设备

wxbackup导出ios设备

微痕迹 app

微信语音导出助手 for android

手动导出转换语音

0. 进入微信聊天记录所在位置

1
2
mkdir ~/Downloads/voice
cd ~/Library/Containers/com.tencent.xinWeChat/Data

1. 复制出音频, 按照时间顺序重命名.

1
2
3
find . -name '*.silk' | xargs -L1 -I {} cp -af {} ~/Downloads/voice/ 
cd ~/Downloads/voice/
i=1; for x in `ls -tr *.silk`; do cp -af $x "$i".silk; let i=i+1; done;

2. silk解码转换为mp3

kn007/silk-v3-decoder: [Skype Silk Codec SDK]Decode silk v3 audio files (like wechat amr, aud files, qq slk files) and convert to other format (like mp3). Batch conversion support.

主要使用以上脚本

1
sh converter.sh ~/Downloads/voice ~/Downloads/out mp3

3. 安装ffmpeg

1
brew install ffmpeg

4. 筛选后, 拼接mp3

生成要拼接的文件的目录.

1
ls ./ | xargs -I {}  realpath {} | xargs -I {} echo "file '""{}""'" >> ~/Downloads/filelist.txt

使用ffmpeg进行拼接

1
ffmpeg -f concat -safe 0 -i filelist.txt -y output.mp3

5. 校验拼接后的mp3长度和

1
2
python3 xx.py ${mp3_path}

输出的结果和我上面拼接后的文件的长度一致, ok没问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/bin/python3
import os
import sys
import glob
import json
import logging
import subprocess

def get_file_duration(file):
process = subprocess.Popen("ffprobe {} -print_format json -show_format -show_streams".format(file), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout = process.communicate()[0]
logging.debug(f"stdout: {stdout}")
format_data = json.loads(stdout)
duration = parse_duration(file, format_data)
return duration

def parse_duration(file, data):
format_data = data.get('format', {})
res = float(format_data.get('duration'))
if not res:
res = 0
logging.error(f"{file} cannot get duration")
return res

def get_mp3_files(path):
files = list(glob.glob(os.path.join(path, "*.mp3")))
return files

def calc_duration(data_list):
res = sum(data_list)
return res

def main():
logging.basicConfig(level=logging.INFO)
result = []
files = get_mp3_files(sys.argv[1])
logging.debug(files)
for file in files:
result.append(get_file_duration(file))
print(calc_duration(result))




main()

使用wxbackup完整导出聊天记录

1. 使用微信自带的迁移聊天记录功能迁移到ipad/iphone上

ipad/iphone登录同一个微信账号, 需要安卓机和ios设备在同一个局域网(即同一Wifi里), 然后进入设置 -> 聊天 -> 聊天记录备份与迁移.

2. 将ipad连接到mac/pc上, 将ios设备进行整机备份

高版本macOS比如10.15是在finder里进行的备份, 低版本则在itunes中.

参照apple官方文档即可, 如何备份您的 iPhone、iPad 和 iPod touch - Apple 支持 (中国) 备份速度通过lightning转usb-c, 最快也只有40MB/s, how long should an initial backup take on… - Apple Community

3. 备份后, 使用wxbackup的软件, 指定ios设备在mac/pc里的备份数据库路径

可能因为finder高版本导致默认打开软件时没找到备份路径, 手动指定到~/Library/Application Support/MobileSync/Backup即可. 就立刻会显示出微信的聊天记录了.

不过似乎存在一个缺憾, 不能全选导出. 只能一个个选择导出.

4. 点进各个对话目录里index.html查看和微信一般的web页面来看记录吧

Reference

  1. Windows下批量转换Silk v3音频文件为MP3格式 | kn007的个人博客
  2. mryqu.github.io/微信语音导出和转换.md at f48df2cb1fc0e604eca4c5452b5c7498fe5717bd · mryqu/mryqu.github.io
  3. 关于微信语音导出,这个方法强烈建议~
  4. 批量导出微信语音消息为mp3并附python修改文件名脚本 | 韶华尐沐
  5. 批量导出微信语音的方法(技术向) – vector090's blog
  6. 微信聊天记录导出方案总结
  7. (1 封私信 / 20 条消息) 如何导出微信【收藏】中的语音文件? - 知乎
  8. tsycnh/WeChatExporter: 一个可以快速导出、查看你的微信聊天记录的工具
  9. 微信聊天记录导出
  10. Collections/GitHub 出品:一键导出解密微信聊天记录.md at c9901d41cb43ba8cbb04d8331b853fd3da13a3bf · RobertWang/Collections