Jetson Nano 入坑之路 ----(9)C++调用SYN6288语音播报模块

        最近在用SYN6288语音播报模块做项目,需要用C++做成这个语音播报模块。

        但是遇到了一个问题,就是输入的中文字符编码在Ubuntu下面是hex-utf,而在Windows下是hex-gb2312,所以在Windows下测的好好的代码,放到Ubuntu下就乱报语音。

        下面直接把我的研究成果发出来吧,直接封装好了的。

#include <stdio.h>
#include <iconv.h>
#include <string.h>
#include <string>
#include <iostream>
#include "uart.hpp"
using namespace std;
#define OUTLEN 255
#define debug

int code_convert(char *from_charset,char *to_charset,char *inbuf,size_t inlen,char *outbuf,size_t outlen);
int utfTOgb2312(char *inbuf,int inlen,char *outbuf,int outlen);
void print(const std::string& content);


void speaker(const std::string& content)
{
#ifdef debug
    print(content);
#endif  
    char *p = (char*)content.c_str();
#ifdef debug
    printf("%s\n",p);
#endif 
    static unsigned char out[OUTLEN];
    
    int rec = utfTOgb2312(p,strlen(p),(char*)out,OUTLEN);
    int len = strlen((char*)out);

#ifdef debug
    printf("rec=%d,strlen(out)=%d\n",rec,len);
    for (int i=0;i<len;i++) printf("%x ",out[i]);
    printf("\n");
#endif  
    
    unsigned char headOfFrame[5];
    unsigned char length;
    unsigned char ecc  = 0;//定义校验字节
    length=len;
    
    /*senddata**/
    headOfFrame[0] = 0xFD ;//构造帧头FD
    headOfFrame[1] = 0x00 ;//构造数据区长度的高字节
    headOfFrame[2] = length + 3;//构造数据区长度的低字节
    headOfFrame[3] = 0x01 ;//构造命令字:合成播放命令
    headOfFrame[4] = 0x00 ;//构造命令参数:编码格式为GB2312
    
    for(char i=0; i<5; i++)//依次发送构造好的5个帧头字节
    {  
        ecc=ecc^(headOfFrame[i]);//对发送的字节进行异或校验	
    }
    for(char i=0; i<length; i++)//依次发送待合成的文本数据
    {  
        ecc=ecc^(out[i]);//对发送的字节进行异或校验
    }

#ifdef debug
    printf("\nresualt:\n");
    for (int i=0;i<5;i++) printf("%x ",headOfFrame[i]);
    for (int i=0;i<length;i++) printf("%x ",out[i]);
    printf("%x \n",ecc);
#endif
   
    // 将字符数据通过串口发送到模块
    speaker_sendString((char*)&headOfFrame[0], 5);
    speaker_sendString((char*)&out[0], length);
    speaker_sendString((char*)&ecc, 1);
}

int main()
{
    std::string strspk = "这是用C++写的语音播报模块";
    speaker(strspk);

    return 0;
}

// ==================================================
// ==================================================

// 编码转换
int code_convert(char *from_charset,char *to_charset,char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
    iconv_t cd;
    int rc;
    char **pin = &inbuf;
    char **pout = &outbuf;

    cd = iconv_open(to_charset,from_charset);
    if (cd==0) return -1;
    if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
    iconv_close(cd);
    return 0;
}

// utf8码转为GB2312码
int utfTOgb2312(char *inbuf,int inlen,char *outbuf,int outlen)
{
    return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
}

void print(const std::string& content)
{
    std::cout<<content<<std::endl;
}

注:speaker_sendString(char*,int size)

这函数是笔者自己写的一个串口发送的函数,目前还在测试使用阶段,后续再写博客分享出来

附上程序测试结果:

 完美解决问题nice。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Jetson Xavier NX模块用户手册.pdf是一份为Jetson Xavier NX模块编写的用户手册。该手册提供了有关该模块的详尽信息,以帮助用户正确使用该模块。 首先,手册介绍了Jetson Xavier NX模块的基本概况,包括其功能、规格和硬件接口等。用户可以了解到模块的处理器性能、内存容量、存储接口、外部接口等关键特性。 其次,手册提供了关于模块的安装和部署的详细说明。用户可以了解到如何将模块正确安装到主机设备上,如何连接外部设备和传感器,以及如何配置和初始化模块。 然后,手册介绍了模块的软件开发环境和工具。用户可以了解到如何使用JetPack软件套件进行模块的软件开发和调试,以及如何使用NVIDIA提供的SDK和工具来利用模块的计算能力。 此外,手册还包含了一些实际的示例和案例,展示了模块在计算机视觉、深度学习、自动驾驶等领域的应用。通过这些案例,用户可以了解到如何利用模块的强大计算能力来开展自己的项目和应用。 最后,手册还提供了一些常见问题和故障排除的解决方案。用户可以在遇到问题时查阅手册,找到相应的解决方法,以节省时间和精力。 总之,Jetson Xavier NX模块用户手册是一份重要的文档,它提供了关于该模块的全面指导和使用说明,帮助用户正确、高效地使用这个强大的计算模块。无论是初学者还是有经验的开发者,都可以从中获得帮助和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星羽空间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值