科⼤讯飞语⾳合成(tts)windowssdk代码学习笔记
#include
1. stdlib.h
2. stdio.h
3. windows.h
4. conio.h
1. conio是Console Input/Output(控制台输⼊输出)的简写,其中定义了通过控制台进⾏数据输⼊和数据输出的函数,主要是
⼀些⽤户通过按键盘产⽣的对应操作,⽐如getch()函数等
2. 这是dos下,基于⽂本模式(⾮图形模式)的各种显⽰操作
如设置前景⾊,背景⾊等。在dos下,没有conio.h,你就只能写那种⿊底⽩字的程序。有了它,你就可以写五颜六⾊的程序。
如TurboC的界⾯就是蓝底黄字的,还有菜单等
5. errno.h:errno.h 是C语⾔C标准函式库⾥的标头档,定义了通过错误码来回报错误资讯的宏
6. qtts.h
7. msp_cmn.h
8. msp_errors.h
#ifdef
⼀般情况下,源程序中所有的⾏都参加编译。但是有时希望对其中⼀部分内容只在满⾜⼀定条件才进⾏编译,也就是对⼀部分内容指定编译的条件,这就是“条件编译”。有时,希望当满⾜某条件时对⼀组语句进⾏编译,⽽当条件不满⾜时则编译另⼀组语句
#ifdef _WIN64
#pragma comment(lib,"../../libs/msc_x64.lib")//x64
#else
#pragma comment(lib,"../../libs/msc.lib")//x86
#endif
_WIN64 是什么?
在 Win32 配置下,_WIN32 有定义,_WIN64 没有定义。在 x64 配置下,两者都有定义,因此,_WIN32 可以⽤来判断是否 Windows 系统(对于跨平台程序),⽽ _WIN64 ⽤来判断编译环境是 x86 还是 x64
常量\定义预定义选项Windows.h VC编译器
WIN32Win32√(minwindef.h)×
_WIN32××√
_WIN64××x64
#pragma comment
#pragma comment(lib,"…/…/libs/msc_x64.lib")
表⽰链接msc_x64.lib这个库。和在⼯程设置⾥写上链⼊msc_x64.lib的效果⼀样(两种⽅式等价,或说⼀个隐式⼀个显式调⽤),不过这种⽅法写的,程序别⼈在使⽤你的代码的时候就不⽤再设置⼯程settings了。告诉连接器连接的时候要msc_x64.lib,这样你就不⽤在linker的lib设置⾥指定这个lib了
typedef struct _wave_pcm_hdr
typedef struct _wave_pcm_hdr
{
char            riff[4];// = "RIFF"
int    size_8;// = FileSize - 8
char            wave[4];// = "WAVE"
char            fmt[4];// = "fmt "
int    fmt_size;// = 下⼀个结构体的⼤⼩ : 16
short int      format_tag;// = PCM : 1
short int      channels;// = 通道数 : 1
int    samples_per_sec;// = 采样率 : 8000 | 6000 | 11025 | 16000
int    avg_bytes_per_sec;// = 每秒字节数 : samples_per_sec * bits_per_sample / 8
short int      block_align;// = 每采样点字节数 : wBitsPerSample / 8
short int      bits_per_sample;// = 量化⽐特数: 8 | 16
char            data[4];// = "data";
int    data_size;// = 纯数据长度 : FileSize - 44
} wave_pcm_hdr;
⽤结构体定义输出的wav⾳频格式,这⾥可以更改为你需要的参数
主函数int main(int argc, char* argv[])
int        ret                  = MSP_SUCCESS;
const char* login_params        ="appid = , work_dir = .";//登录参数,appid与msc库绑定,请勿随意改动
ret变量⽤来接收函数的返回值,表⽰任务的完成状态,接收成功的返回代码或者错误的返回代码
login_params是登录参数,调⽤科⼤讯飞的在线语⾳合成API需要登录
const char* session_begin_params ="voice_name = xiaoyan, text_encoding = gb2312, sample_rate = 16000, speed = 40, volume = 50, pitch = 40, rdn = 2 ";
sdkconst char* filename            ="tts_sample.wav";//合成的语⾳⽂件名称
const char* text                ="";//合成⽂本
session_begin_params⽤来储存合成参数,包括以下⼏项
rdn: 合成⾳频数字发⾳⽅式
volume: 合成⾳频的⾳量
pitch: 合成⾳频的⾳调
speed: 合成⾳频对应的语速
voice_name: 合成发⾳⼈
sample_rate: 合成⾳频采样率
text_encoding: 合成⽂本编码格式
可选的发⾳⼈有如下⼏个:
ret =MSPLogin(NULL,NULL, login_params);//第⼀个参数是⽤户名,第⼆个参数是密码,第三个参数是登录参数,⽤户名和密码可在www.xfyun注册获取
if(MSP_SUCCESS != ret)
{
printf("MSPLogin failed, error code: %d.\n", ret);
goto exit ;//登录失败,退出登录
}
MSPLogin函数包含在头⽂件msp_cmn.h中,使⽤讯飞分配的登录参数进⾏登录,并返回代码给ret,若登录失败返回错误代码并退出
printf("\n>>>>>>>>>>>>>>>\n");
printf("## 语⾳合成(Text To Speech,TTS)技术能够⾃动将任意⽂字实时转换为连续的 ##\n");
printf("## ⾃然语⾳,是⼀种能够在任何时间、任何地点,向任何⼈提供语⾳信息服务的  ##\n");
printf("## ⾼效便捷⼿段,⾮常符合信息时代海量数据、动态更新和个性化查询的需求。  ##\n");
printf(">>>>>>>>>>>>>>>\n\n");
向屏幕上输出相关信息
ret =text_to_speech(text, filename, session_begin_params);
if(MSP_SUCCESS != ret)
{
printf("text_to_speech failed, error code: %d.\n", ret);
}
printf("合成完毕\n");
调⽤语⾳合成函数,传⼊的3个参数分别为要合成的⽂本,合成后wav⾳频⽂件的⽂件名,以及前⾯提到的合成参数,ret变量接收函数返回值,若失败则打印错误代码并退出
MSPLogout();
退出登录函数,包含在头⽂件msp_cmn.h中
语⾳合成函数int text_to_speech(const char* src_text, const char* des_path, const char* params)
int          ret          =-1;
FILE*        fp          =NULL;
const char*  sessionID    =NULL;
unsigned int audio_len    =0;
wave_pcm_hdr wav_hdr      = default_wav_hdr;
int          synth_status = MSP_TTS_FLAG_STILL_HAVE_DATA;
ret⽤来接收返回值
FILE fp⽂件指针⽤来创建⾳频⽂件
if(NULL== src_text ||NULL== des_path)
{
printf("params is error!\n");
return ret;
}
fp =fopen(des_path,"wb");
if(NULL== fp)
{
printf("open %s error.\n", des_path);
return ret;
}
若合成⽂本或者⾳频⽂件路径为空,则提⽰参数错误并退出创建并打开⾳频⽂件,若创建失败,则提⽰打开⽂件失败
/* 开始合成 */
sessionID =QTTSSessionBegin(params,&ret);
if(MSP_SUCCESS != ret)
{
printf("QTTSSessionBegin failed, error code: %d.\n", ret);
fclose(fp);
return ret;
}
ret =QTTSTextPut(sessionID, src_text,(unsigned int)strlen(src_text),NULL);
if(MSP_SUCCESS != ret)
{
printf("QTTSTextPut failed, error code: %d.\n",ret);
QTTSSessionEnd(sessionID,"TextPutError");
fclose(fp);
return ret;
}
printf("正在合成 ...\n");
fwrite(&wav_hdr,sizeof(wav_hdr),1, fp);//添加wav⾳频头,使⽤采样率为16000 while(1)
{
/* 获取合成⾳频 */
const void* data =QTTSAudioGet(sessionID,&audio_len,&synth_status,&ret); if(MSP_SUCCESS != ret)
break;
if(NULL!= data)
{
fwrite(data, audio_len,1, fp);
wav_hdr.data_size += audio_len;//计算data_size⼤⼩
}
if(MSP_TTS_FLAG_DATA_END == synth_status)
break;
printf(">");
Sleep(150);//防⽌频繁占⽤CPU
}
printf("\n");
if(MSP_SUCCESS != ret)
{
printf("QTTSAudioGet failed, error code: %d.\n",ret);
QTTSSessionEnd(sessionID,"AudioGetError");
fclose(fp);
return ret;
}
/* 修正wav⽂件头数据的⼤⼩ */
wav_hdr.size_8 += wav_hdr.data_size +(sizeof(wav_hdr)-8);
/* 将修正过的数据写回⽂件头部,⾳频⽂件为wav格式 */
fseek(fp,4,0);
fwrite(&wav_hdr.size_8,sizeof(wav_hdr.size_8),1, fp);//写⼊size_8的值
fseek(fp,40,0);//将⽂件指针偏移到存储data_size值的位置
fwrite(&wav_hdr.data_size,sizeof(wav_hdr.data_size),1, fp);//写⼊data_size的值fclose(fp);
fp =NULL;
/* 合成完毕 */
ret =QTTSSessionEnd(sessionID,"Normal");
if(MSP_SUCCESS != ret)
{
printf("QTTSSessionEnd failed, error code: %d.\n",ret);
}
return ret;
}
以上代码为具体的语⾳合成过程,暂时没有能⼒看懂qaq

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论