当前位置: 首页 > news >正文

踩大坑:json格式存储wav二进制内容

需求描述:

需要将wav音频文件以二进制的形式读出,存放到 json 中,发送post请求到服务,服务解析json,得到二进制内容后放进ASR模型得出转录结果。

记一次坑:

# 将wav以二进制形式读出存放到json中
f = open("zh_test_16k.wav","rb+")
content = f.read()
request_dict['audio'] = str(content)
with open('request.json', 'w') as file:
     	file.write(json.dumps(request_dict)) 
f.close()

通过 curl管道传输request.json中的内容
(网上的命令杂七杂八,记录正确命令为 -X
-d参数房放前面,url放后面,且url用引号)

curl -X POST -d @request64.json --header “Content-Type:application/json” ‘localhost:7000/foundry_module/executor?executor=api_executor&module=asr_uni’

# 从服务端得到数据
datas = self.rfile.read(int(self.headers['content-length'])) 
datas = json.loads(datas)
wav_content = datas["audio"].encode()

encode():str转为bytes
decode():bytes转为str

wav_content # type(wav_content)= bytes 
f = open("zh_test_16k.wav","rb+")
content = f.read()
# type(content)= bytes
if(wav_content==content):
	print("相等")

始终不能输出"相等",此时已经快调疯了

解决办法

先将二进制内容通过base64编码

# import foundry;
import base64;
import hashlib;
import json

encoded = base64.b64encode(open('zh_test_16k.wav', 'rb').read());                     
#decoded = base64.b64decode(encoded)
request_dict = {}
f = open('zh_test_16k.wav','rb+')
sound_wav_rb = f.read()
request_dict['audio'] = str(encoded)
request_dict['audio_format'] = 0
request_dict['sample_rate'] = 0
request_dict['lang'] = 0
with open('request64.json', 'w') as file:
     file.write(json.dumps(request_dict)) 
f.close()

传输request64.json文件内容

curl -X POST -d @request64.json --header “Content-Type:application/json” ‘localhost:7000/foundry_module/executor?executor=api_executor&module=asr_uni’

字符串截取base64编码不包含’b’ 和引号的内容,再解码,最后放入模型

datas = self.rfile.read(int(self.headers['content-length']))
datas = json.loads(datas)
wav_content = datas["audio"][2:-1]
wav_content = base64.b64decode(wav_content)

踩坑原因

json存在编译格式的问题,会导致原二进制文件内容多加 ”/“,因此不与原wav文件的二进制内容一致

下次不要直接以二进制读的方式,将内容存到json中了!

相关文章:

  • ChatGPT 简介
  • 猜数字大小 II
  • Python3 pip
  • 【C语言】指针进阶
  • 两年外包生涯做完,感觉自己废了一半....
  • 加油站会员管理小程序实战开发教程10
  • 基于SpringBoot+vue的无偿献血后台管理系统
  • Redis底层原理(持久化+分布式锁)
  • SQL代码编码原则和规范
  • 一招鉴别真假ChatGPT,并简要介绍ChatGPT、GPT、GPT2和GPT3模型之间的区别和联系
  • 【MyBatis】| MyBatis的逆向⼯程
  • 2023年美赛C题Wordle预测问题二建模及Python代码详细讲解
  • 网络编程(一)
  • Linux生产者消费模型
  • POI处理Excel (xlsx格式) 设置单元格格式为数值 且千分位分隔 保留两位小数
  • 动漫人物眼睛画法
  • win10电脑性能优化设置
  • 【ArcGIS Pro二次开发】(5):UI管理_自定义控件的位置
  • Jackson 序列化:Cannot deserialize value of type `java.time.LocalDateTime`
  • 自抗扰控制ADRC之微分器TD
  • 西藏艺术来到黄浦江畔,“隐秘之门”艺术展外滩三号开幕
  • 春山谷雨前,并手摘芳烟
  • 经济日报:从三个变化看外贸破局之道
  • 一图看懂|特朗普政府VS美国顶尖高校:这场风暴如何刮起?
  • 中国正在俄罗斯国内生产武器?外交部:坚决反对无端指责和政治操弄
  • 9部门发文促进家政服务消费扩容升级