下载软件包 硬件文字转语音说明资料.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