VIA 移植 讯飞的TTS 编码与多线程

VIA平台上移植讯飞的TTS,在移植讯飞提供的Sample时,遇到在Syntext死机重启的问题,一直没能解决,后来从VIA公司拿到他们早些年移植后的版本,移到我们的D300中是好用的.

移植过程按说明步骤就好,下面就几点困扰我多时的问题与大家讨论:
一. 编码问题:
如果你对
UNICODE,GBK,UTF-8的区别不是很明白的话,还是读一读这篇文章. UNICODE,GBK,UTF-8区别
,
讯飞的TTS支持近10种的编码,默认的为GBK,但VIA平台上中文默认的为Unicode,英文默认的为ASCII.要想讯飞的TTS与VIA一起能正常工作,就需要统一编码,这里选择的是UTF-8.
提取VIA控件中的文字资源,加上自己定义的文字,合并后用TTS播放:
MenuItemC *item = new MenuItemC();
……
           StringC Name =
item->GetText(); 
           uint32
length=Name.GetLength()/2*3
+3;———-A
           char*
wstrResult=new char[length];
          
memset(wstrResult, 0, length);
          
int32 Chars1 =
Name.ToUtf8Str(wstrResult,length);————–B
           char
words[
3]={0};
          
words[
0]=0xE4;————-C
          
words[
1]=0xB9;
          
words[
2]=0x8B;
          
strcat(wstrResult,words);
 TtsInterSoundTst4(wstrResult);—————D
           delete
[] wstrResult;
———————E    
           wstrResult =
NULL;
就其中的某些部分详细说明一下. [A] Name.GetLength()得到的是控件中文本的长度,Unicode编码的,每个汉字占两个Bytes
(即两个Char),而UTF-8中每个汉字是由三个Bytes组成的,所以要除2乘3得到转换UTF-8后所需要的空间,加3是因为在后面加上了一个UTF-8的汉字占三个Bytes.
[B]是StringC的一个方法,可以输出UTF-8格式的内容,这里就把VIA默认的Unicode转换为了UTF-8.[C]Words[3]
一个UTF-8汉字的空间,[D]调用讯飞的TTS接口进行播放.此时wstrResult应该是UFT-8编码的字节表示,可以用MonPrintf((char*)wstrResult)打印出来查看.
二. 多线程的问题:
如果TtsInterSoundTst4的实现这么来写:
int
TtsInterSoundTst4(char* p)
{
MonPrintf("TtsSynthStartWithPlay!–
strlen(ChsTxtbP) = %d", strlen(ChsTxtbP));
TtsUiCallbackReg(TtsUiCallbackProc,
NULL);
TtsSynthStartWithPlay(p, strlen(p), NULL);—————–
F
return
0;
}
则TTS无法正常播放,起初以为是编码的问题,折腾了许久,后来才发现是多线程与指针的使用有问题,因为TtsSynthStartWithPlay是异步的,所以执行到F这里进,主线程会继续返回,执行E,而F由于优先级较低,所以会稍后执行,但在E的时候,指针指向的空间己被Delete,到TTS来播放时,己经找不到对应的内容了!所以更改了一下,在TtsInterSoundTst4进行了复制,在TTS播放完后,再释放空间.
int
TtsInterSoundTst4(char* p)
{
      content
= (char*) ValMalloc(j+1);
  memset(content, 0, j+1);
   memcpy(content,p,j);
   content[j]=’\0′;
MonPrintf("TtsSynthStartWithPlay!– strlen(content) = %d",
strlen(
content));
TtsUiCallbackReg(TtsUiCallbackProc,
NULL);
TtsSynthStartWithPlay(content, strlen(content), NULL);—————–
F
return
0;
}
至此TTS可以正常播放从VIA控件中获取的Unicode编码的内容,实现读屏.

 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.