当前位置:   article > 正文

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

jetson nano tts语音模块

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

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

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

  1. #include <stdio.h>
  2. #include <iconv.h>
  3. #include <string.h>
  4. #include <string>
  5. #include <iostream>
  6. #include "uart.hpp"
  7. using namespace std;
  8. #define OUTLEN 255
  9. #define debug
  10. int code_convert(char *from_charset,char *to_charset,char *inbuf,size_t inlen,char *outbuf,size_t outlen);
  11. int utfTOgb2312(char *inbuf,int inlen,char *outbuf,int outlen);
  12. void print(const std::string& content);
  13. void speaker(const std::string& content)
  14. {
  15. #ifdef debug
  16. print(content);
  17. #endif
  18. char *p = (char*)content.c_str();
  19. #ifdef debug
  20. printf("%s\n",p);
  21. #endif
  22. static unsigned char out[OUTLEN];
  23. int rec = utfTOgb2312(p,strlen(p),(char*)out,OUTLEN);
  24. int len = strlen((char*)out);
  25. #ifdef debug
  26. printf("rec=%d,strlen(out)=%d\n",rec,len);
  27. for (int i=0;i<len;i++) printf("%x ",out[i]);
  28. printf("\n");
  29. #endif
  30. unsigned char headOfFrame[5];
  31. unsigned char length;
  32. unsigned char ecc = 0;//定义校验字节
  33. length=len;
  34. /*senddata**/
  35. headOfFrame[0] = 0xFD ;//构造帧头FD
  36. headOfFrame[1] = 0x00 ;//构造数据区长度的高字节
  37. headOfFrame[2] = length + 3;//构造数据区长度的低字节
  38. headOfFrame[3] = 0x01 ;//构造命令字:合成播放命令
  39. headOfFrame[4] = 0x00 ;//构造命令参数:编码格式为GB2312
  40. for(char i=0; i<5; i++)//依次发送构造好的5个帧头字节
  41. {
  42. ecc=ecc^(headOfFrame[i]);//对发送的字节进行异或校验
  43. }
  44. for(char i=0; i<length; i++)//依次发送待合成的文本数据
  45. {
  46. ecc=ecc^(out[i]);//对发送的字节进行异或校验
  47. }
  48. #ifdef debug
  49. printf("\nresualt:\n");
  50. for (int i=0;i<5;i++) printf("%x ",headOfFrame[i]);
  51. for (int i=0;i<length;i++) printf("%x ",out[i]);
  52. printf("%x \n",ecc);
  53. #endif
  54. // 将字符数据通过串口发送到模块
  55. speaker_sendString((char*)&headOfFrame[0], 5);
  56. speaker_sendString((char*)&out[0], length);
  57. speaker_sendString((char*)&ecc, 1);
  58. }
  59. int main()
  60. {
  61. std::string strspk = "这是用C++写的语音播报模块";
  62. speaker(strspk);
  63. return 0;
  64. }
  65. // ==================================================
  66. // ==================================================
  67. // 编码转换
  68. int code_convert(char *from_charset,char *to_charset,char *inbuf,size_t inlen,char *outbuf,size_t outlen)
  69. {
  70. iconv_t cd;
  71. int rc;
  72. char **pin = &inbuf;
  73. char **pout = &outbuf;
  74. cd = iconv_open(to_charset,from_charset);
  75. if (cd==0) return -1;
  76. if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
  77. iconv_close(cd);
  78. return 0;
  79. }
  80. // utf8码转为GB2312
  81. int utfTOgb2312(char *inbuf,int inlen,char *outbuf,int outlen)
  82. {
  83. return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
  84. }
  85. void print(const std::string& content)
  86. {
  87. std::cout<<content<<std::endl;
  88. }

注:speaker_sendString(char*,int size)

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

附上程序测试结果:

 完美解决问题nice。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/587914
推荐阅读
相关标签
  

闽ICP备14008679号