废话就不多说了,开始。。。

     最近在做一个文本转语音TTS(Text to Speech)的第三方软件封装,应用的是海内语音技术龙头安徽科大讯飞公司提供的离线引擎AiSound5.0,重要用于汽车导航用途。科大讯飞还提供了AiTalk用于语音识别,AiWrite用于手写识别服务等。另外还有针对6种平台的SDK和开辟示例。

    一、科大讯飞语音平台

科大讯飞目前有不少产品应用在移动终端上了,比如说用在手机上的讯飞语点,可方便语音拨打电话和发送短信,查气候、股票等信息。

在上面讯飞语音云这个网站可以找到科大讯飞针对6种平台的SDK,http://open.voicecloud.cn/download.php,包含Android、Iphone、Windows、Linux、Java、Flash这些平台的语音合成、语音识别和语音听写的开辟文档和SDK下载,不过应用之前须要请求AppID(每一个语音应用程序须要一个Appid来独一标识,您须要通过注册帐号来获得自己应用的Appid,未注册的语音应用将无法正常获取语音服务。),通过考核后就可以下载响应的开辟文档和SDK并用于自己的软件系统中了。

 二 、科大讯飞语音合成、识别-在线文档和应用程序示例网址

从这里可以查看在线的开辟文档http://open.voicecloud.cn/developer.php?column=aW50ZV9zZGs%3D

Android平台的开辟文档和应用程序示例:http://open.voicecloud.cn/developer.php?category=YW5kcm9pZA%3D%3D&column=ZG9jdW1lbnQ%3D&type=d2lkZ2V0#a38

Windows和Linux平台的开辟文档和程序示例:http://open.voicecloud.cn/developer.php?category=b3RoZXI%3D&column=ZG9jdW1lbnQ%3D&type=YXBp

   三、科大讯飞语音产品的移动应用

这里有一个科大讯飞的在线语音合成系统演示程序:ViViVoice 2.1在线演示系统

http://www.iflytek.com/TtsDemo/viviVoiceShow.aspx

1、讯飞语点的应用,官网下载网址如下:http://yudian.voicecloud.cn/yudian.htm,支持Android和Iphone两大平台。

2、讯飞输入法应用:http://ime.voicecloud.cn/index.html

3、讯飞语音输入法应用:http://kouxun.voicecloud.cn/index.html

4、开辟者社区:http://open.voicecloud.cn/index.php

   四、官网的Windows平台-语音合成和识别示例代码

网址如下:http://open.voicecloud.cn/developer.php?category=b3RoZXI%3D&column=c2FtcGxl&type=YXBp

以Windows下的开辟为例,给出了语音合成、语音识别和语音听写的编程示例。

1、语音合成开辟例程

#include <stdio.h>
#include <string.h>
#include "qtts.h"
#define END_SYNTH( reason ) \
{ \
ret = QTTSSessionEnd( session_id, #reason ); \
if( 0 != ret ) \
{ \
printf("QTTSSessionEnd failed, error code is %d", ret ); \
} \
\
ret = QTTSFini(); \
if( 0 != ret ) \
{ \
printf("QTTSFini failed, error code is %d", ret ); \
} \
}
int main()
{
const char* configs = NULL;
const char* session_id = NULL;
const char* synth_params = NULL;
const char* synth_text = NULL;
unsigned int text_len = 0;
const char* synth_speech = NULL;
unsigned int synth_speech_len = 0;
FILE* f_speech = NULL;
int synth_status = 0;
int ret = 0;
printf( "===================================================================\n"
" Mobile Speech Platform 2.0 Client SDK Demo for TTS \n"
"===================================================================\n" ); /* 初始化 */
configs = "server_url=dev.voicecloud.cn/index.htm, timeout=10000, coding_libs=speex.dll";
ret = QTTSInit( configs );
if( 0 != ret )
{
printf( "QTTSInit failed, error code is %d", ret );
return -1;
}
/* 开始一路会话,应用会话模式 */
synth_params = "ssm=1, auf=audio/L16;rate=16000, aue=speex-wb;7, ent=intp65";
session_id = QTTSSessionBegin( synth_params, &ret );
if( 0 != ret )
{
printf( "QTTSSessionBegin failed, error code is %d", ret );
return -1;
}
/* 写入合成文本 */
synth_text = "讯飞语音云为您提供了最新最好的语音技术休会,"
"我们在互联网上开放科大讯飞最新研发的各种语音技术,"
"包含世界领先的语音合成技术、语音识别技术、声纹识别技术等。";
text_len = strlen( synth_text );
ret = QTTSTextPut( session_id, synth_text, text_len, NULL );
if( 0 != ret )
{
printf( "QTTSTextPut failed, error code is %d", ret );
END_SYNTH( QTTSTextPut failed! );
return -1;
}
/* 获取合成音频 */
f_speech = fopen( "synth_speech.pcm", "wb" );
if( NULL == f_speech )
{
printf( "Can not open file \"synth_speech.pcm\"" );
END_SYNTH( open file );
return -1;
}
while( TTS_FLAG_DATA_END != synth_status )
{
synth_speech = QTTSAudioGet( session_id, &synth_speech_len, &synth_status, &ret );
if( 0 != ret )
{
printf( "QTTSAudioGet failed, error code is: %d", ret );
break;
}
printf( "QTTSAudioGet ok, speech length = %d\n", synth_speech_len );
if( NULL != synth_speech && 0 != synth_speech_len )
{
fwrite( synth_speech, 1, synth_speech_len, f_speech );
}
}
fclose( f_speech );
/* 结束会话,释放资源 */
ret = QTTSSessionEnd( session_id, "normal end" );
if( NULL == f_speech )
{
printf( "QTTSSessionEnd failed, error code is %d", ret );
}
session_id = NULL;
ret = QTTSFini();
if( 0 != ret )
{
printf( "QTTSFini failed, error code is %d", ret );
}
return 0;
}
 

2、语音识别开辟例程

    每日一道理
流逝的日子像一片片凋零的枯叶与花瓣,渐去渐远的是青春的纯情与浪漫。不记得曾有多少雨飘在胸前风响在耳畔,只知道沧桑早已漫进了我的心爬上了我的脸。当一个人与追求同行,便坎坷是伴,磨难也是伴。
#include <stdio.h>
#include <string.h>
#include <Windows.h>
#include "qisr.h"
#define END_RECOG( reason ) \
{ \ ret = QISRSessionEnd( session_id, #reason ); \
if( 0 != ret ) \
{ \ printf("QISRSessionEnd failed, error code is %d", ret ); \
} \
\
ret = QISRFini(); \
if( 0 != ret ) \
{ \
printf("QISRFini failed, error code is %d", ret ); \
} \
}
#define BLOCK_LEN 5 * 1024
int main()
{
const char* configs = NULL;
const char* session_id = NULL;
const char* recog_grammar = NULL;
const char* recog_params = NULL;
char recog_audio[ BLOCK_LEN ];
FILE* f_speech = NULL;
int audio_status = 0;
int ep_status = 0;
int rec_status = 0;
int rslt_status = 0;
const char* rec_result = NULL;
unsigned int audio_len = 0;
int ret = 0;
printf( "===================================================================\n"
" Mobile Speech Platform 2.0 Client SDK Demo for IAT \n"
"===================================================================\n" );
/* 初始化 */
configs = "server_url=dev.voicecloud.cn/index.htm, coding_libs=speex.dll, vad_enable=true";
ret = QISRInit( configs );
if( 0 != ret )
{
printf( "QISRInit failed, error code is %d\n", ret );
return -1;
}
/* 开始一路会话,应用会话模式,应用引擎内置的语法停止识别 */
recog_grammar = "builtin:grammar/../search/location.abnf?language=zh-cn";
recog_params = "ssm=1, aue=speex-wb;7, auf=audio/L16;rate=16000, “
”ent=map, vad_speech_tail=900";
session_id = QISRSessionBegin( recog_grammar, recog_params, &ret );
if( 0 != ret )
{
printf( "QISRSessionBegin failed, error code is %d\n", ret );
return -1;
}
/* 打开用来停止识别的语音文件,用户可以采取其他的获取音频的方式比如实时采集音频 */
f_speech = fopen( "sxk_16k.pcm", "rb" );
if( NULL == f_speech )
{
printf( "Can not open file \"sxk_16k.pcm\"\n" );
END_RECOG( open file );
return -1;
}
/* 发送音频数据,获取语音听写结果 */
while( ISR_AUDIO_SAMPLE_LAST != audio_status )
{
audio_len = fread( recog_audio, 1, BLOCK_LEN, f_speech );
audio_status = ( audio_len == BLOCK_LEN ) ?
ISR_AUDIO_SAMPLE_CONTINUE :ISR_AUDIO_SAMPLE_LAST;
ret = QISRAudioWrite( session_id, recog_audio, audio_len
, audio_status, &ep_status, &rslt_status );
if( 0 != ret )
{
printf( "QISRSessionBegin failed, error code is %d\n", ret );
rslt_status = ISR_REC_STATUS_SPEECH_COMPLETE;
break;
}
printf( "write audio data ok! len=%d, status=%d\n", audio_len, audio_status );
/* 已经有结果缓存在MSC中了,可以获取了 */
if( ISR_REC_STATUS_SUCCESS == rslt_status )
{
rec_result = QISRGetResult( session_id, &rslt_status, 5000, &ret );
if( 0 != ret )
{
printf( "QISRGetResult failed, error code is %d\n", ret );
rslt_status = ISR_REC_STATUS_SPEECH_COMPLETE;
break;
}
if( NULL != rec_result )
{ printf( "got a result: %s\n", rec_result );
}
/* 全部结果已经取完了 */
if( ISR_REC_STATUS_SPEECH_COMPLETE == rslt_status )
{
printf( "the result has been got completely!\n" );
break;
}
}
/* 检测到音频后端点,结束音频发送 */
if( ISR_EP_AFTER_SPEECH == ep_status )
{ printf( "end point of speech has been detected!\n" );
break;
}
Sleep( 160 );
}
fclose( f_speech );
/* 获取余下的识别结果 */
while( ISR_REC_STATUS_SPEECH_COMPLETE != rslt_status )
{
rec_result = QISRGetResult( session_id, &rslt_status, 5000, &ret );
if( 0 != ret )
{
printf( "QISRGetResult failed, error code is: %d\n", ret );
break;
}
if( NULL != rec_result )
{
printf( "got a result: %s\n", rec_result );
}
/* sleep一下很有必要,防止MSC端无缓存的识别结果时浪费CPU资源 */
Sleep( 200 );
}
/* 结束会话,释放资源 */
ret = QISRSessionEnd( session_id, "normal end" );
if( NULL == f_speech )
{
printf( "QISRSessionEnd failed, error code is %d\n", ret );
}
session_id = NULL;
ret = QISRFini();
if( 0 != ret )
{
printf( "QISRFini failed, error code is %d\n", ret );
}
return 0;
}

3、语音听写开辟例程

#include <stdio.h>
#include <string.h>
#include <Windows.h>
#include "qisr.h"
#define END_RECOG( reason ) \
{ \
ret = QISRSessionEnd( session_id, #reason ); \
if( 0 != ret ) \
{ \
printf("QISRSessionEnd failed, error code is %d", ret ); \
} \
\
ret = QISRFini(); \
if( 0 != ret ) \
{ \
printf("QISRFini failed, error code is %d", ret ); \
} \
}
#define BLOCK_LEN 5 * 1024
int main()
{
const char* configs = NULL;
const char* session_id = NULL;
const char* recog_params = NULL;
char recog_audio[ BLOCK_LEN ];
FILE* f_speech = NULL;
int audio_status = 0;
int ep_status = 0;
int rec_status = 0;
int rslt_status = 0;
const char* rec_result = NULL;
unsigned int audio_len = 0;
int ret = 0;
printf( "===================================================================\n"
" Mobile Speech Platform 2.0 Client SDK Demo for IAT \n"
"===================================================================\n" );
/* 初始化 */
configs = "server_url=dev.voicecloud.cn/index.htm, coding_libs=speex.dll, vad_enable=true";
ret = QISRInit( configs );
if( 0 != ret )
{
printf( "QISRInit failed, error code is %d\n", ret );
return -1;
}
/* 开始一路会话 */
recog_params = "ssm=1, sub=iat, aue=speex-wb;7, auf=audio/L16;rate=16000, “
“ent=sms16k, rst=plain, vad_speech_tail=1500";
session_id = QISRSessionBegin( NULL, recog_params, &ret );
if( 0 != ret )
{
printf( "QISRSessionBegin failed, error code is %d\n", ret );
return -1;
}
/* 打开用来停止识别的语音文件,用户可以采取其他的获取音频的方式比如实时采集音频 */
f_speech = fopen( "IAT_16KPCM_10s_0.pcm", "rb" );
if( NULL == f_speech )
{
printf( "Can not open file \"IAT_16KPCM_10s_0.pcm\"\n" );
END_RECOG( open file );
return -1;
}
/* 发送音频数据,获取语音听写结果 */
while( ISR_AUDIO_SAMPLE_LAST != audio_status )
{
audio_len = fread( recog_audio, 1, BLOCK_LEN, f_speech );
audio_status = ( audio_len == BLOCK_LEN ) ?
ISR_AUDIO_SAMPLE_CONTINUE :ISR_AUDIO_SAMPLE_LAST;
ret = QISRAudioWrite( session_id, recog_audio, audio_len, audio_status, &ep_status, &rslt_status );
if( 0 != ret )
{
printf( "QISRSessionBegin failed, error code is %d\n", ret );
rslt_status = ISR_REC_STATUS_SPEECH_COMPLETE;
break;
}
printf( "write audio data ok! len=%d, status=%d\n", audio_len, audio_status );
/* 已经有结果缓存在MSC中了,可以获取了 */
if( ISR_REC_STATUS_SUCCESS == rslt_status )
{ rec_result = QISRGetResult( session_id, &rslt_status, 5000, &ret );
if( 0 != ret )
{
printf( "QISRGetResult failed, error code is %d\n", ret );
rslt_status = ISR_REC_STATUS_SPEECH_COMPLETE;
break;
}
if( NULL != rec_result )
{
printf( "got a result: %s\n", rec_result );
}
/* 全部结果已经取完了 */
if( ISR_REC_STATUS_SPEECH_COMPLETE == rslt_status )
{
printf( "the result has been got completely!\n" );
break;
}
}
/* 检测到音频后端点,结束音频发送 */
if( ISR_EP_AFTER_SPEECH == ep_status )
{
printf( "end point of speech has been detected!\n" );
break;
}
Sleep( 160 );
}
fclose( f_speech );
/* 获取余下的识别结果 */
while( ISR_REC_STATUS_SPEECH_COMPLETE != rslt_status )
{
rec_result = QISRGetResult( session_id, &rslt_status, 5000, &ret );
if( 0 != ret )
{
printf( "QISRGetResult failed, error code is: %d\n", ret );
break;
}
if( NULL != rec_result )
{
printf( "got a result: %s\n", rec_result );
}
/* sleep一下很有必要,防止MSC端无缓存的识别结果时浪费CPU资源 */
Sleep( 200 );
}
/* 结束会话,释放资源 */
ret = QISRSessionEnd( session_id, "normal end" );
if( NULL == f_speech )
{
printf( "QISRSessionEnd failed, error code is %d\n", ret );
}
session_id = NULL;
ret = QISRFini();
if( 0 != ret )
{
printf( "QISRFini failed, error code is %d\n", ret );
}
return 0;
}

   五、Tizen(泰泽)提供的TTS和STT语音合成、语音识别接口

泰泽是三星和英特尔合作开辟的一款操作系统。

1、Tizen SDK官网:https://developer.tizen.org/downloads/tizen-sdk

2、Tizen项目:https://review.tizen.org/git/

3、tts-api:https://review.tizen.org/git/?p=framework/api/tts-api.git;a=summary

其对应的tts.h头文件api接口在线网址为:https://review.tizen.org/git/?p=framework/api/tts-api.git;a=blob;f=include/tts.h;h=636470d923555a30d164cc09ceff841b72187e20;hb=98aee0bab00a418af162a0314ef931f8fd620892

4、stt-api:https://review.tizen.org/git/?p=framework/api/stt-api.git;a=summary

文章结束给大家分享下程序员的一些笑话语录:

问路
有一个驾驶热气球的人发现他迷路了。他降低了飞行的高度,并认出了地面 上的一个人。他继续下降高度并对着那个人大叫,“打扰一下,你能告诉我我 在哪吗?”
下面那个人说:“是的。你在热气球里啊,盘旋在 30 英尺的空中”。
热气球上的人说:“你一定是在 IT 部门做技术工作”。
“没错”,地面上的人说到,“你是怎么知道的?”
“呵呵”,热气球上的人说,“你告诉我的每件事在技术上都是对的,但对都没 有用”。
地面上的人说,“你一定是管理层的人”。
“没错”,热气球上的人说,“可是你是怎么知道的?”
“呵呵”,地面上的那人说到,“你不知道你在哪里,你也不知道你要去哪,你 总希望我能帮你。你现在和我们刚见面时还在原来那个地方,但现在却是我 错了”。

---------------------------------
原创文章 By
语音和语音合成
---------------------------------

语音语音合成科大讯飞和Tizen-TTS语音合成引擎的更多相关文章

  1. android用讯飞实现TTS语音合成 实现中文版

    Android系统从1.6版本开始就支持TTS(Text-To-Speech),即语音合成.但是android系统默认的TTS引擎:Pic TTS不支持中文.所以我们得安装自己的TTS引擎和语音包. ...

  2. ROS语音交互——科大讯飞语音合成TTS(二)

    之前我用过科大讯飞的语音包,为了记录一下我重新使用一下 首先注册科大讯飞账号及应用,以后每个下载的在线使用SDK都是以此账户ID登录讯飞语音服务器. 下载科大讯飞在线合成包. $ unzip Linu ...

  3. 安卓TTS语音合成经验分享(科大讯飞语音+)集成

    应用场景:足浴软件,技师钟房安排调派和队列排序查看,语音播报提醒.老程序是使用双屏显卡,windows系统PC上运行一个无人值守桌面程序.如今安卓机顶盒(WIFI)和MINI电视棒通过HDMI接口和支 ...

  4. 解读 Android TTS 语音合成播报

    随着从事 Android 开发年限增加,负责的工作项目也从应用层开发逐步过渡到 Android Framework 层开发.虽然一开始就知道 Android 知识体系的庞大,但是当你逐渐从 Appli ...

  5. 在C#中使用科大讯飞Web API进行语音合成

    最近工作中需要用到讯飞语音合成接口,网上看了下基本都是Java,PHP,Python版本的,正好补上C# 版本,代码比较简单.  首先在讯飞开放平台上创建一个WebApi项目,取到APPID与APIK ...

  6. speechSynthesis,TTS语音合成。

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Android 通过调用系统,如接口 谷歌语音、百度语音、科大讯飞语音等语音识别方法对话框

    现在app在发展过程中会集成一些语音识别功能,不具有其自己的显影剂一般正在开发的语音识别引擎,所以在大多数情况下,它是选择一个成熟的语音识别引擎SDK集成到他们的app在. 平时,这种整合被分成两个, ...

  8. ROS(indigo) 语音工具 科大讯飞 百度 pocketsphinx julius rospeex 16.11.22更新 ROS中文语音

    ROS语音工具汇总,目前先给出链接,只用过一些简单的命令. 中文语音: 参考链接:使用科大讯飞库 1 http://www.ncnynl.com/archives/201611/1069.html 2 ...

  9. 科大讯飞和Tizen-TTS语音合成引擎

    最近在做一个文本转语音TTS(Text to Speech)的第三方软件封装,使用的是国内语音技术龙头安徽科大讯飞公司提供的离线引擎AiSound5.0,主要用于汽车导航用途.科大讯飞还提供 了AiT ...

随机推荐

  1. 数据泵expdp,impdp使用结

    EXPDP,IMPDP远程导出,导入数据库到本地 1.本地建立导出用户hr_exp并全然删除机hr的用户 C:\Users\Administrator>sqlplus / as sysdba S ...

  2. MySQL replace into 说明(insert into 增强版)

    MySQL replace into 说明(insert into 增强版) 在插入数据到一个表时,通常是这种情况:1. 先推断数据是否存在: 2. 假设不存在,则插入:3.假设存在,则更新. 在 S ...

  3. proguard android迷茫

    我们收拾它意味着蛊惑项目即将结束.上线.但是,当这个问题就更烦躁人,我也记录因混乱中遇到的问题 首先,我在装android4.0封装版本,有没有在这个文件查看器项目 假设有,请继续点击进入projec ...

  4. 网易ios 面试

    1 说说 你对  MRC和 ARC 的理解 2  对OC内存分析 有什么好的方法, 3 corePlot 4 pop 动画 5 cocoapods 6 GCD 7 瀑布流 及 uicollection ...

  5. 微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件

    原文:微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件 开篇介绍 大多数情况下我们的 SSIS 包都会配置在 SQL Agent ...

  6. 临时对象与NRV技术

    <More Effective C++>中讲到,在C++中真正的临时对象是看不见的,它们不出现在你的源代码中.建立一个没有命名的非堆(non-heap)对象会产生临时对象,这种未命名的对象 ...

  7. uva 10054 The Necklace(欧拉回路)

    The Necklace  My little sister had a beautiful necklace made of colorful beads. Two successive beads ...

  8. WebService支持多平台上传文件的实现

    WebService支持多平台上传文件的实现   要使用网站上传文件,在ASP.NET的范畴,我基本上能想到的有两类,一类是通过HTTP POST请求获得文件信息,另外一类是通过WebService或 ...

  9. 用NPOI实现导入导出csv、xls、xlsx数据功能

    用NPOI实现导入导出csv.xls.xlsx数据功能   直接上代码 首先定义一个接口   如果需要直接操作文件的话,就自己在封装一次 然后定义csv类的具体实现 这个需要引入命名空间LumenWo ...

  10. Jquery EasyUI中treegrid

    Jquery EasyUI中treegrid的中右键菜单和一般按钮同时绑定事件时的怪异事件 InChatter系统开源聊天模块前奏曲   最近在研究WCF,又因为工作中的项目需要,要为现有的系统增加一 ...