日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

java 调用linux的tts_中文TTS 的简单实现(基于linux)之 实现语音合成

發(fā)布時(shí)間:2023/12/29 linux 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 调用linux的tts_中文TTS 的简单实现(基于linux)之 实现语音合成 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

合成語音歸根到底是根據(jù)漢字在字符集的定位來取語音庫中的數(shù)據(jù)

定位方法:

根據(jù)救字的兩個(gè)字節(jié)中的值.從高字節(jié)算出漢字的位wm.從低字節(jié)算出漢字的區(qū)qm,

(qm一176)*94+wm一160就是該況字在漢字集里的位置position,

而該漢字所對(duì)應(yīng)的語音數(shù)據(jù)的偏移量就是(position一1) 3200+46。

根據(jù)定位方法取得漢字在語音庫中的發(fā)音數(shù)據(jù)后,根據(jù)WAV格式合成語音文件。

定位和合成代碼如下:

#define MAXLEN? 32000

/*

參數(shù)str:為純漢字的字符串,且編碼格式為GBK

返回值:

-1:表示語音庫文件打開錯(cuò)誤

-2:表示合成語音文件 打開/生成錯(cuò)誤

其它:函數(shù)執(zhí)行成功

*/

int?? wav(char *str)

{

FILE * fpf,*fpt;?? //文件指針

int qm,wm;???? ?//漢字區(qū)、位碼

int re;?????????????? //函數(shù)返回值

long fileleng=0;?? //文件長度 后面修改WAV格式時(shí)有用

if((fpf=fopen("ddd.wav","rb+"))==NULL)??? //打開語音庫文件

return -1;

if((fpt=fopen("china.wav","wb+"))==NULL)? //打開或生成合成后的語音文件,用來播放的

return -2;

char head[46];??????????????????? ?? //WAV 文件頭

char buffer[MAXLEN];?????????? //發(fā)音數(shù)據(jù)BUFF

memset(buffer,0,MAXLEN);? //置0

fread(head,sizeof(head),1,fpf);???? //讀語音庫文件頭

fwrite(head,sizeof(head),1,fpt);??? //寫入合成語音文件

int l=strlen(str);

char *s=str;

for(int i=0;i<=l;i=i+2)

{

qm=(unsigned char)*(s+i);????? //取漢字的區(qū)碼

wm=(unsigned char)*(s+1+i);????? //取漢字的位碼

if (qm<176||qm>215)?? //判斷是否在漢字字符集中

continue;

if (wm<161||wm>254)? //判斷是否在漢字字符集中

continue;

int position =(qm-176)*94+wm-160;

int offset=(position-1)*MAXLEN+46;???? //定位

fseek(fpf,offset,0);

fread(buffer,sizeof(buffer),1,fpf);???? //取發(fā)音數(shù)據(jù)

fwrite(buffer,sizeof(buffer),1,fpt);?? ? //寫入合成文件

fileleng++;????????????????????????????????????????? //合成文件長度增加

}?? //end for

re =fileleng;

fileleng=fileleng*MAXLEN;

fseek(fpt,42,SEEK_SET);

fwrite(&fileleng,sizeof(long),1,fpt);??? //修改合成文件的WAV格式,主要是修改文件大小,具體請(qǐng)看WAV格式表

fileleng+=44;

fseek(fpt,4,SEEK_SET);

fwrite(&fileleng,sizeof(long),1,fpt);? //修改合成文件的WAV格式,主要是修改文件大小,具體請(qǐng)看WAV格式表

fclose(fpf);???? //關(guān)閉文件

fclose(fpt);

return re;

}

其它:

由函數(shù)WAV可以看出,我們接收用戶的輸入字符的編碼必須為GBK編碼,

所以如果系統(tǒng)使用的不是 GBK編碼的話,我們還應(yīng)當(dāng)進(jìn)行編碼轉(zhuǎn)換。

如果編碼正確的話,還得從把用戶的輸入中把中文字符給提取出來。

為此,我寫了小段代碼,用來過濾非中文字符的。

void trans(char *str)

{

int i = 0, j = 0;

while( str[i] != '' )

{

if ( str[i] < 0 )

{

str[j++] = str[i++];

str[j++] = str[i++];

}

else

i++;

}?? //end while

str[j] = '';

}

總結(jié)

以上是生活随笔為你收集整理的java 调用linux的tts_中文TTS 的简单实现(基于linux)之 实现语音合成的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。