📄 t2s (utf8-unicode).h
字号:
/*************************************************** Copyright(C), 2008 , JUST File name: t2s.h Author: StevenZ Version: 1.0 Date: 08/09/06 Description: XF-S4240语音合成芯片的接口函数 ps:此为UNICODE版 History: 08/06/07 开始些基本接口 08/06/15 测试 08/07/22 改写成UNICODE版,及自动打开关闭设备***************************************************/#ifndef _T2S_H#define _T2S_H#include<stdio.h>#include<stdlib.h>#include<fcntl.h>#include<unistd.h>#include<string.h>#define T2S_DEVICE_NAME "/dev/xf-s4240"#define GB 1#define GBK 2#define BIG5 3#define UNICODE 4#define MALE 0#define FEMALE 1#define DEFAULT 255#define STAY_O 254#define MAX_TEXT 1024struct _text_ { char str[MAX_TEXT];
int size;};/*************************************************** Function: T2S_t2s Description:开始语音合成 Input: s--需要语音合成的内容的指针 ps:如果连续执行两个此函数,第二个会将第一个中断,请自己延迟 Output: 无 Return:void***************************************************/void T2S_t2s(char *s);/*************************************************** Function: T2S_pause Description:暂停当前语音合成 Input: 无 Output: 无 Return:void***************************************************/void T2S_pause(void);/*************************************************** Function: T2S_continue Description:继续当前语音合成 Input: 无 Output: 无 Return:void***************************************************/void T2S_contiue(void);/*************************************************** Function: T2S_stop Description:结束当前语音合成 Input: 无 Output: 无 Return:void***************************************************/void T2S_stop(void);/*************************************************** Function: T2S_option Description:设置语音合成的参数 Input: voice-男声或女声,MALE/FEMALE/STAY_O/DEFAULT volume-音量,0~10/STAY_O/DEFAULT speed-语速,0~10/STAY_O/DEFAULT Output: 无 Return:void***************************************************/void T2S_option(int voice,int volume,int speed);void text_init(struct _text_ *src)
{
src->str[0]='\0';
src->size=0;
}void text_input(struct _text_ *src,char s[])
{
int i=0;
while(s[i]) { src->str[i]=s[i];
i++;
} src->size=i;}void utf8_to_unicode(struct _text_ *src){ int srcptr=0; int desptr=0; int i,j; int srcsize=src->size; struct _text_ des; if (src->size<=0) return; text_init(&des); for(j=0;j<srcsize;j++) { char temp=src->str[srcptr]; if ((temp&0x80)==0) { /*begin with 0*/ des.str[desptr]=src->str[srcptr]; desptr++;
des.str[desptr]=0x00;
desptr++;
des.size+=2;
srcptr++; } else if((temp&0xE0)==0xC0) { /*begin with 110*/ des.str[desptr]=src->str[srcptr]; desptr++; srcptr++; des.str[desptr]=src->str[srcptr]; desptr++; srcptr++; des.size+=2; } else if((temp&0xF0)==0xE0) { /*begin with 1110*/ des.str[desptr]&=0x0; des.str[desptr+1]&=0x0; des.str[desptr+1]|=(src->str[srcptr]&0x1F)<<4; des.str[desptr+1]|=(src->str[srcptr+1]&0x3C)>>2; des.str[desptr]|=(src->str[srcptr+1]&0x03)<<6; des.str[desptr]|=(src->str[srcptr+2]&0x3F);
des.size+=2;
desptr+=2;
srcptr+=3;
j+=2; } } src->size=des.size;
for(i=0;i<src->size;i++)
{
src->str[i]=des.str[i];
} src->str[i]='\0';}void move(struct _text_ *src,int n)
{
int i;
i=src->size;
for(;i>=0;i--)
{
src->str[i+n]=src->str[i];
}
}
int add_head(struct _text_ *src,int flag)
{ int sz=src->size; if(sz>1020) return 0; move(src,5); src->str[0]=0xFD; sz+=2; src->str[1]=(char)((sz&0xff00)>>8); src->str[2]=(char)sz; src->str[3]=0x01; switch(flag) { case GB :src->str[4]=0x0; break; case GBK :src->str[4]=0x1; break; case BIG5 :src->str[4]=0x2; break; case UNICODE :src->str[4]=0x3; break; default: return 0; } src->size+=5;}/* api*/int T2S_start(int *T2S_fd){/*t2s must starts with it*/ *T2S_fd=open(T2S_DEVICE_NAME,O_RDWR); printf("T2S_fd=%d\n",*T2S_fd); if(*T2S_fd==-1) { printf("T2S start error!\n"); return 0; } return 1;}void T2S_end(int *T2S_fd){/*t2s must ends with it*/ close(*T2S_fd);}int T2S_t2s(char *s){/*t2s without holding*/ //int n; int T2S_fd; struct _text_ t; text_init(&t); text_input(&t,s); utf8_to_unicode(&t); if(!add_head(&t,UNICODE)) { printf("add_head() ERROR\n"); exit(1); } /*for(n=0;n<t.size;n++) { printf("0x%x\n",t.str[n]); }*/ T2S_start(&T2S_fd); write(T2S_fd,t.str,t.size); T2S_end(&T2S_fd);}
int T2S_t2s_hold(char *s)
{/*t2s with hold,wait for the last t2s ends*/ int T2S_fd;
struct _text_ t;
text_init(&t);
text_input(&t,s); utf8_to_unicode(&t);
if(!add_head(&t,UNICODE)) { printf("add_head() ERROR\n"); exit(1); }
for(;;)
{
if(!T2S_IsBusy())
break;
} T2S_start(&T2S_fd);
write(T2S_fd,t.str,t.size); T2S_end(&T2S_fd);
}void T2S_pause(void){/*pause t2s*/ int T2S_fd; char cmd[]={0xFD,0x00,0x01,0x03}; T2S_start(&T2S_fd); write(T2S_fd,cmd,sizeof(cmd)); T2S_end(&T2S_fd); }void T2S_contiue(void){/*continue t2s*/ int T2S_fd; char cmd[]={0xFD,0x00,0x01,0x04}; T2S_start(&T2S_fd); write(T2S_fd,cmd,sizeof(cmd)); T2S_end(&T2S_fd); }void T2S_stop(void){/*stop t2s*/ int T2S_fd; char cmd[]={0xFD,0x00,0x01,0x02}; T2S_start(&T2S_fd); write(T2S_fd,cmd,sizeof(cmd)); T2S_end(&T2S_fd); }int T2S_IsBusy(void){/*if t2s is processing,return 1,else return 0*/ char cmd[]={0xFD,0x00,0x01,0x21}; char c; int T2S_fd; T2S_start(&T2S_fd); write(T2S_fd,cmd,sizeof(cmd)); read(T2S_fd,&c,1); if(c==0x4E) { T2S_end(&T2S_fd); return 1; sleep(1); } T2S_end(&T2S_fd); return 0;}void T2S_option(int voice,int volume,int speed){/** voice MALE/FEMALE/STAY_O/DEFAULT* volume int 0~10/STAY_O/DEFAULT* speed int 0~10/STAY_O/DEFAULT* DEFAULT default option* STAY_O last option*/ int T2S_fd; char s[20]; struct _text_ t; s[0]='\0'; switch(voice) { case MALE:strcat(s,"[m4]");break; case FEMALE:strcat(s,"[m3]");break; case DEFAULT:strcat(s,"[m3]");break; case STAY_O: default: } switch(volume) { case 0:strcat(s,"[v0]");break;
case 1:strcat(s,"[v1]");break;
case 2:strcat(s,"[v2]");break;
case 3:strcat(s,"[v3]");break;
case 4:strcat(s,"[v4]");break;
case 5:strcat(s,"[v5]");break;
case 6:strcat(s,"[v6]");break;
case 7:strcat(s,"[v7]");break;
case 8:strcat(s,"[v8]");break;
case 9:strcat(s,"[v9]");break;
case 10:strcat(s,"[v10]");break;
case DEFAULT:strcat(s,"[v5]");break;
case STAY_O: default: } switch(speed) { case 0:strcat(s,"[s0]");break; case 1:strcat(s,"[s1]");break; case 2:strcat(s,"[s2]");break; case 3:strcat(s,"[s3]");break; case 4:strcat(s,"[s4]");break; case 5:strcat(s,"[s5]");break; case 6:strcat(s,"[s6]");break; case 7:strcat(s,"[s7]");break; case 8:strcat(s,"[s8]");break; case 9:strcat(s,"[s9]");break; case 10:strcat(s,"[s10]");break; case DEFAULT:strcat(s,"[s5]");break; case STAY_O: default: } text_init(&t);
text_input(&t,s);
if(!add_head(&t,GB))
{
printf("ERROR\n");
exit(1);
}
T2S_start(&T2S_fd);
write(T2S_fd,t.str,t.size); T2S_end(&T2S_fd);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -