📄 shvoice.cpp
字号:
char wjm[30];
char jx[10];
int id;
int flag;
} ;
struct struct_jiegou *my;
hp = CreateNamedPipe ( PIPE_REV, PIPE_ACCESS_DUPLEX,
PIPE_WAIT | PIPE_READMODE_BYTE | PIPE_TYPE_MESSAGE,
4, 512, 512, 10000, NULL);
if ( hp == INVALID_HANDLE_VALUE ) {
DWORD ErrorCode;
ErrorCode = GetLastError();
printf ( "CreateNamedPipe return %d\n", ErrorCode );
exit ( 1 ) ;
}
printf ( "Create Named Pipe PIPE_SOURCE.\n" );
while ( 1 ) {
if ( !ConnectNamedPipe ( hp, NULL ) ) {
printf ( "ConnectNamedPipe err.\n" );
CloseHandle ( hp );
exit ( 1 );
}
ReadFile ( hp, buff, IN_BUFF_SIZE, &cbread, NULL );
DisconnectNamedPipe ( hp );
my=(struct struct_jiegou *)buff;
count=0;
while(1){
i=my->id%maxrow;
if ( ( sbsj[i].infor.r+1 )%SIZE_QUEUE != sbsj[i].infor.f ) {
memcpy ( sbsj[i].infor.infor[sbsj[i].infor.r], buff,cbread<IN_BUFF_SIZE?cbread:IN_BUFF_SIZE );
sbsj[i].infor.r = ( sbsj[i].infor.r+1 )%SIZE_QUEUE;
WaitForSingleObject ( sbsj[i].add_ev, INFINITE );
sbsj[i].id=my->id;
strcpy(sbsj[i].fldir,"d:\\Shvoice\\");
strcpy(sbsj[i].flname,my->wjm);
strcpy(sbsj[i].jx,my->jx);
strcat(sbsj[i].fldir,sbsj[i].jx);
if(!DirExist(sbsj[i].fldir))
if(!CreateDir(sbsj[i].fldir)){
printf("对不起,样本目录创建不成功!\n");
ReleaseMutex ( sbsj[i].add_ev );
break;
}
sbsj[i].flag=1;
ReleaseMutex ( sbsj[i].add_ev );
SetEvent ( sbsj[i].ev );
break;
}
else{
if(count==0)
printf ( "事件队列已满\n" );
else if(count>=5){
printf ( "事件队列已满\n" );
Sleep(50);
break;
}
count++;
Sleep(50);
}
}
}
}
void write_to_pipe ( char *name, void *buff, int length )
{
BOOL connected_flag;
DWORD ret;
ULONG cbwritten;
int timeout_counter = 0;
DWORD error;
connected_flag = FALSE;
while ( !connected_flag ) {
if ( WaitNamedPipe ( name, 100 ) == FALSE ) {
error = GetLastError ( );
if ( error == ERROR_PIPE_BUSY ) {
continue;
}
}
hp1 = CreateFile ( name, GENERIC_WRITE|GENERIC_READ, 0, NULL,
OPEN_EXISTING, 0, NULL );
if ( hp1 == INVALID_HANDLE_VALUE ) {
ret = GetLastError ( );
if ( ret != ERROR_PIPE_BUSY ) {
break;
}
}
else
connected_flag=TRUE;
}
if ( WriteFile ( hp1, buff, length , &cbwritten, NULL ) == FALSE ) {
CloseHandle ( hp1 );
}
CloseHandle ( hp1 );
}
void start_ch(void)
{
char s,str[10]="",str1[20]="",wstr[30]="",rstr[30]="";
while(1){
s=getch();
switch(s){
case 'h':
case 'H':
printf("......................\n");
printf(" 1: 按a关闭写日记......\n");
printf(" 2: 按b开放写日记...........\n");
printf(" 3: 按c屏幕输出日记..............\n");
printf(" 4: 按d将批量wav文件转样本文件........\n");
printf(" 5: 按e将单个wav文件转样本文件.............\n");
printf(" 6: 按f修改样本库配置文件.............. ........\n");
printf(" 7: 按s加载配置:增加样本和修改样本库要加载...........\n");
printf("......................\n");
break;
case 'a':
case 'A':
WRITE_FLAG=0;
break;
case 'b':
case 'B':
WRITE_FLAG=1;
break;
case 'c':
case 'C':
WRITE_FLAG=2;
break;
case 'd':
case 'D':
printf("说明:程序是匹次处理,输入wav文件所在目录,输入vec样本输出目录\n");
printf("请输入wav文件所在目录\n");
printf("wav所在目录(如c:)=");
gets(str);
if ( strlen(str) > 0 ) {
strncpy(wstr,str,sizeof(wstr)-1);
wstr[sizeof(wstr)-1] = '\0';
}
printf("vec样本输出目录(如d:)=");
gets(str);
if ( strlen(str) > 0 ) {
strncpy(rstr,str,sizeof(rstr)-1);
rstr[sizeof(rstr)-1] = '\0';
}
printf("wav目录=%s,vec目录=%s\n",wstr,rstr);
wav_vec(wstr,rstr,1);
break;
case 'e':
case 'E':
printf("说明:程序是单个处理,输入wav文件全名(目录+文件名),输入vec样本输出目录\n");
printf("请输入wav文件全名(目录+文件名)\n");
printf("wav文件名=");
gets(str);
if ( strlen(str) > 0 ) {
strncpy(wstr,str,sizeof(wstr)-1);
wstr[sizeof(wstr)-1] = '\0';
}
printf("vec样本输出目录(如d:)=");
gets(str);
if ( strlen(str) > 0 ) {
strncpy(rstr,str,sizeof(rstr)-1);
rstr[sizeof(rstr)-1] = '\0';
}
printf("wav文件=%s,vec目录=%s\n",wstr,rstr);
wav_vec(wstr,rstr,0);
break;
case 'f':
case 'F':
edit_config();
break;
case 's':
case 'S':
jzsj();
break;
default:
break;
}
}
}
/*
void InitSock ( void ) //socket 初始化
{
WSADATA WSAData;
if ( WSAStartup(MAKEWORD(1,1), &WSAData) ) {
printf ( "Start socket failure.\n" );
exit ( 1 );
}
}
/*
void callsocket(void)
{
SOCKADDR_IN server;
SOCKET sock;
char sce_dbsvr_ip[16];
short sce_dbsvr_port;
int sockerr;
strcpy ( sce_dbsvr_ip, "127.0.0.1" );
sce_dbsvr_port = 5555 + dbnum;
sock = socket ( AF_INET, SOCK_STREAM, 0 );
if ( sock == INVALID_SOCKET ) {
printf ( "Function returned error! " );
return FALSE;
}
server.sin_addr.s_addr = inet_addr ( sce_dbsvr_ip );
server.sin_family = AF_INET;
server.sin_port = htons ( sce_dbsvr_port );
if ( connect(sock,(PSOCKADDR)&server,sizeof(server)) < 0 ) {
sockerr = WSAGetLastError();
if ( sockerr == WSAECONNREFUSED ) {
closesocket( sock );
Sleep ( 50 );
goto start_db_opr;
}
printf ( "函数connect()返回%d\n", sockerr );
closesocket( sock );
return FALSE;
}
send ( sock, (char*)input, i_length, 0 );
recv ( sock, (char*)output, o_length, 0 );
send ( sock, "OK", 2, 0 );
closesocket ( sock );
return TRUE;
}
*/
void edit_config(void)
{
PROCESS_INFORMATION ProcInfo;
DWORD ExitCode;
STARTUPINFO startinfo;
char strname[100];
sprintf(strname,"notepad.exe d:\\Shvoice\\config.dat");
memset(&startinfo,0,sizeof(STARTUPINFO) );
if ( !CreateProcess(NULL,strname,NULL,NULL,TRUE,
0,NULL,NULL,&startinfo,&ProcInfo) ) {
printf("Error:---open d:||Shvoice||config.dat fail.code=%d\n",
GetLastError() );
Sleep(1000);
}
while(1) {
Sleep(1000);
if ( !GetExitCodeProcess(ProcInfo.hProcess,&ExitCode) ) {
printf("GetExitCodeProcess error.code=%d\n",GetLastError() );
break;
} else {
printf("Info: thanks a lot!\n");
break;
}
}
}
void wav_vec(char *wav,char*vec,int bz)
{
TStringArray wavList;
int fileCount;
if(bz!=0)
fileCount = SListWavFiles(wav, wavList);
else
fileCount = ListWavFiles(wav, wavList);
if(fileCount<=0){
printf("[%s]里没有wav文件\n", wav);
return;
}
DWORD dwFlag = GetFileAttributes(vec);
if ( dwFlag==0xFFFFFFFF ){
if(!CreateDir(vec)){
printf("对不起,样本目录创建不成功!\n");
return;
}
}
printf("please wait,Now start...\n");
const int bufSampleSize = 512*1024;
short *pFileBuf = new short[bufSampleSize]; //每次处理2M个16bit pcm样本,也就是4M byte数据。
for(int i=0; i<fileCount; i++){
char outFile[30];
sprintf(outFile, "%s\\%s.vec", vec, GetFileName(wavList[i].c_str()));
FILE* fout = fopen(outFile, "w+b"); //打开或创建向量文件
FILE *fp;
if(bz!=0)
fp = fopen(wavList[i].c_str(), "rb");
else
fp = fopen(wav, "rb");
fseek(fp, 0L, SEEK_END);
long size = ftell(fp);
fseek(fp, 0L, SEEK_SET); //跳过wav头
int old_clock = clock();
long segSize = fread(pFileBuf, sizeof(short), bufSampleSize, fp);
TSoundTag* pOut;
int outSize, tailSize;
short* pTail=NULL;
int last_result[17];
memset(last_result, 0, sizeof(last_result));
while(segSize>0){
int error = sudxCalcBuffer( pFileBuf, segSize, &pOut, &outSize, &pTail, &tailSize, last_result);
if(error>0)
fwrite(pOut, sizeof(TSoundTag), outSize, fout);
else{
printf("错误!\n");
return;
}
if(tailSize)
memcpy(pFileBuf, pTail, sizeof(short)*tailSize);
segSize = fread( &pFileBuf[tailSize], sizeof(short), bufSampleSize - tailSize, fp);
if(segSize)
segSize+=tailSize;
}
fclose(fout);
fclose(fp);
double speed = double(size)*double(CLOCKS_PER_SEC)/double(clock()-old_clock);
if(bz!=0)
printf("Processed file [%s], size %d, speed %d byte/sec\n", wavList[i].c_str(), size, int(speed));
else
printf("Processed file [%s], size %d, speed %d byte/sec\n", wav, size, int(speed));
}
delete pFileBuf;
printf("Info:wav to vec finishied!\n");
return;
}
void jzsj(void)
{
printf("请等待...........\n");
FILE *fp1=fopen("d:\\Shvoice\\config.dat","rb");
if(fp1==NULL){
printf("%s样本配置文件打开错误!\n","d:\\Shvoice\\config.dat");
return;
}
else{
char buffer[256],wjm1[30],wjm[30];
char jx1[10],jx2[10];
int j,jx,l=0,m=0;
while ( fgets(buffer,120,fp1) != NULL ) {
j=0;
strcpy(wjm1,"");
get_field(buffer,jx2,&j);
get_field(buffer,jx1,&j);
get_field(buffer,wjm1,&j);
sprintf(wjm,"d:\\Shvoice\\%s\\%s",jx1,wjm1);
jx=atoi(jx2);
config[l].flag=jx;
memset(config[l].jx,0,sizeof(config[l].jx));
strcpy(config[l].jx,jx1);
memset(config[l].wjm,0,sizeof(config[l].wjm));
strcpy(config[l].wjm,wjm);
max=l;
l++;
}
fclose(fp1);
}
fp1=fopen("d:\\Shvoice\\configjx.dat","rb");
if(fp1==NULL){
printf("%s样本配置文件打开错误!\n","d:\\Shvoice\\configjx.dat");
return;
}
else{
int l=0,j=0;
char buffer[256],wjm1[30],jx1[10],wjm[30];
while ( fgets(buffer,20,fp1) != NULL ) {
j=0;
strcpy(wjm1,"");
int length=clear_space(buffer,20);
buffer[length]='\0';
strcpy(jx1,buffer);
sprintf(wjm,"d:\\Shvoice\\%s",jx1);
memset(vecload[l].fldir,0,sizeof(vecload[l].fldir));
strcpy(vecload[l].fldir,wjm);
length=clear_space(vecload[l].fldir,30);
vecload[l].fldir[length]='\0';
vecload[l].sampleList.erase(vecload[l].sampleList.begin(),vecload[l].sampleList.end());
vecload[l].i_vec = ListVecFiles(vecload[l].fldir, vecload[l].sampleList);
if(vecload[l].i_vec<=0)
vecload[l].i_vec=0;
vecload[l].sampleSetList.erase(vecload[l].sampleSetList.begin(),vecload[l].sampleSetList.end());
vecload[l].vector_count = LoadVecFiles(vecload[l].sampleList, vecload[l].sampleSetList);
if(vecload[l].vector_count<=0)
vecload[l].vector_count=0;
maxr=l;
l++;
}
fclose(fp1);
}
printf("数据加载成功!\n");
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -