下载软件包 硬件文字转语音说明资料.zip
- 配置助手-V3.6.3/配置助手-模式切换.exe
- 配置助手-V3.6.3/配置助手V7_musl声卡控制器V2.exe
- 配置助手-V3.6.3/配置助手-多路报警控制器v2.exe
配置助手-模式切换.exe 可以配置设备为单机模式 ;【单纯的当做文字转语音播放器】 【联网模式 同时有文字转语音的的功能和IP音响的功能(需要音响连接媒体服务器)】
配置助手V7_musl声卡控制器V2.exe 可以控制文字转语音的 物理音量(还有其他的声卡配置)
配置助手-多路报警控制器v2.exe 可以配置设备工作模式和 报警联动其他的功能
使用方式 单机模式1:
配置音响 静态IP地址:/配置助手-V3.6.3/配置助手-音响版v3.exe [如果搞不明白看这里]
配置完设备 静态IP地址
输入设备的IP地址 和 设备端口号6005 然后发送需要播报的文字内容进行测试
源码脚本测试 方法: 安装nodejs 12 命令行执行
node ./mp3_parser_public.js
var net = require('net');
const dgram = require('dgram');
const clientudp = dgram.createSocket('udp4'); //创建一个UDP 通信 句柄
play_tts_local("1111221121212哈哈哈哈哈");
function play_tts_local( ttsr ){
var fuck = getTTString(ttsr); //把要播放的 内容转化为字节打包
var fuckbuf = Buffer.from(fuck,"base64"); // 打包的内容 转BASE64
console.log(fuckbuf);
// 把 转化好的Base64 字节序 发送到设备的6005端口 发送完 关闭通信
clientudp.send(fuckbuf,6005,'192.168.0.101',(err) => {
clientudp.close();
});
}
TTS 高级技巧 跳转这里
// 这是字节序的转码 函数
function getTTString(str) {
// 文本编码(Unicode编码)
const textHexBytes = stringToHexBytes(str);
// '0x01'为命令
// '0x03'为文本编码格式:标识为Unicode
const dataHexBytes = ['0x01', '0x03'].concat(textHexBytes);
// 获取数据区长度,转换为16进制
const dataLengHexBytes = numberToRexBytes(dataHexBytes.length);
//
// 命令格式为'0xFD' + 数据区长度16进制byte数组 + 数据区16进制byte数组
//
const bytes = ['0xFD'].concat(dataLengHexBytes).concat(dataHexBytes);
// console.log('bytes=', bytes)
// return bytes
// 转换为base64
const base64 = bytesToBase64(bytes);
// console.log('base64=', base64)
// 返回
return base64;
}
PYthon 转中文打包 参考源码
import sys,base64,socket,struct
# 添加系统路径
sys.path += ["../ini/"] # 添加自己指定的搜索路径
import config as conf
# 实例化实时语音播报
serverHost = conf.system_ini.get('speaker', 'host')
serverPort = conf.system_ini.get('speaker', 'port')
seedCode = conf.system_ini.get('speaker', 'seedcode')
#将16进制数据当做字节流传递
def strToHex(data):
"""
str2 = bytes('','utf-8')
str2 += struct.pack('B',s_int)
文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes,正是这使得两者的区分特别清晰。你不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然)。
"""
str1 = "" #初始化
str2 = bytes('','utf-8') #初始化为字节:Python 3最对文本和二进制数据作了更为清晰的区分
while data:
str1 = data[0:2] #分割字符串,获取前两个字符
s_int = int( str1, 16) #字符串转换成16进制
str2 += struct.pack('B',s_int) #转换成字节流,“B“为格式符,代表一个unsigned char
data = data[2:] #分割字符串,去掉字符串前两个字符
return str2
#将数字转换为16进制Byte数组
def numberToHexBytes(number):
HexBytes = bytes()
#获取Unicode编码,转换为16进制
unicodeHex = hex(number).replace('0x','').upper()
#字母数字等一位数前补零
if len(unicodeHex) == 1:
unicodeHex = unicodeHex.zfill(2)
#先填入高字节,再填入低字节
#ASCI码(英文,数字等)不存在高字节,补零
HexBytes += b'00'
HexBytes += unicodeHex.encode('utf-8')
return HexBytes
#语言文本转语音格式base64字符串
def textToHexBytesToBase64(txt):
HexBytes = bytes()
for i in range(0, len(txt)):
# 获取unicode编码,转换为16进制
unicodeHex = hex(ord(txt[i])).replace('0x','').upper()
if len(unicodeHex) <= 2: #ASCI码(英文,数字等)
#先填入低字节,再填入高字节(补零),
HexBytes += unicodeHex.encode('utf-8')
HexBytes += b'00'
else:
HexBytes += unicodeHex[2:4].encode('utf-8')
HexBytes += unicodeHex[0:2].encode('utf-8')
#拼接命令和文本格式
HexBytes = b'01' + b'03' + HexBytes
#获取数据长度
bLength = numberToHexBytes(int(len(HexBytes)/2))
#拼接包头和数据长度
HexBytes = b'FD' + bLength + HexBytes
#十六进制字符串转字节流
HexBytes = strToHex(HexBytes)
#字节流转base64
b64 = str(base64.b64encode(HexBytes), encoding="utf-8")
return b64
#设备初始化
def speaker_init(sHost,sPort,sCode,CmdList):
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((sHost,sPort))
for c in CmdList:
tts = textToHexBytesToBase64(c)
json_content = '{"cmd":"PLAYTTS","snlist":["%s"],"ttstring":"%s"}' % (sCode,tts)
client.send(json_content.encode('utf-8'))
#播放语音文本字符串
def play_voice(serverHost,serverPort,seedCode,sText):
#转换
tts = textToHexBytesToBase64(sText)
#拼接发送数据
json_content = '{"cmd":"PLAYTTS","snlist":["%s"],"ttstring":"%s"}' % (seedCode,tts)
try:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.settimeout(2)
# 发送数据
client.connect((serverHost, serverPort)) # 建立一个链接
client.send(json_content.encode('utf-8')) # 发送一条信息 python3 只接收btye流
client.close()
except Exception as e:
return e
return 'success'
if __name__ == '__main__':
#设备服务器
serverHost = "192.168.0.79" #广东省广州市 腾讯云 提供ip
serverPort = 6003
#设备code
seedCode = "ddf9b0f7fc942a24b6bee24892cd0034"
speaker_txt = "你好,测试,现场发现违规行为,未带安全帽,请注意,安全施工"
ret = play_voice(serverHost,serverPort,seedCode,speaker_txt)
print(ret)
C# 文字打包
private void button7_Click(object sender, EventArgs e)
{
byte[] smd = Encoding.GetEncoding("gb2312").GetBytes(textBox2.Text); //把文字Gb2312 放到字节序数组
byte[] tou = new byte[] { 0xFD,0x00,0x00,0x01,0x01 }; //包头
byte[] sendsmd = new byte[tou.Length+smd.Length];
tou.CopyTo(sendsmd, 0);
smd.CopyTo(sendsmd, tou.Length);
var datalenth= BitConverter.GetBytes(short.Parse((smd.Length + 2).ToString()));
sendsmd[1] = datalenth[1];
sendsmd[2] = datalenth[0];
ttstring = Convert.ToBase64String(sendsmd); //最后一步转 base64 得到 可以发送的结果
//udp send ttstring
}
其他的语言自己看着捣鼓 几行代码 自己看着翻译一下 【翻译好 可以贡献出来我这边贴出来 再次感谢各位贡献】
打包依据
单机模式下 播放音频文件URL
设备服务端口:6002
UDP 连接 设备6002端口 发送 A1 +(url的base64编码)
如果设备正在播放url 停止音频文件播放
UDP 连接 设备6002端口 发送 A5 +(url的base64编码)
示例代码(nodejs):
const dgram = require('dgram');
const clientudp = dgram.createSocket('udp4');
A5();
function A5(){ //单机模式停止播放正在播放的url
var url="http://xxxxxx.xxx.xxx/11.mp3";
var fuckbuf = Buffer.from(url).toString('base64');;
var content = "A5"+fuckbuf;
console.log(content );
clientudp.send(content,6002,'192.168.3.101',(err) => {
clientudp.close();
});
}
function A1(){ //单机模式开始播放url
var url="http:///xxxxxx.xxx.xxx/11.mp3";
var fuckbuf = Buffer.from(url).toString('base64');;
var content = "A1"+fuckbuf;
console.log(content );
clientudp.send(content,6002,'192.168.3.101',(err) => {
clientudp.close();
});
}
作者:oxiaom 创建时间:2024-11-26 13:31
最后编辑:oxiaom 更新时间:2025-04-10 10:53
最后编辑:oxiaom 更新时间:2025-04-10 10:53