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

     最近在做一个文本转语音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. mongodb group包(最具体的、最受欢迎、最容易理解的解释)

    和数据库一样group经常常使用于统计.MongoDB的group还有非常多限制,如:返回结果集不能超过16M, group操作不会处理超过10000个唯一键.好像还不能利用索引[不非常确定]. Gr ...

  2. webkit内核下的mouseup后mousemove自动触发问题及解决方法

    如题,就以chrome为代表举例说明遇到mousemove的问题. 为body分别绑定onmousedown.onmousemove.onmouseup,并为触发时打印至控制台.代码如下(同学不要忘记 ...

  3. PHP jpgraph的一点小提示(附安装方法)

    PHP中的GD库本身是一套很强大的绘图库了,绘制的图像基本可以满足日常要求,但强大规强大,还是不够方便哈,因为强大方便的基于PHP的GD库的jpgraph也就诞生啦! PHP默认是不启用GD库的,因为 ...

  4. 腾讯QQ音乐网页版 音频初始化模块解压混淆js源码

    define("js/view/playerBar.js",function(t,e,o){ var i = t("js/lib/zepto.js"), a = ...

  5. The operator == is undefined for the argument type(s) int, null

    package cn.edu.shu.web.test; public class TestInteger { public static void main(String[] args) { /** ...

  6. leetcode第八题--String to Integer (atoi)

    Problem: Implement atoi to convert a string to an integer. Hint: Carefully consider all possible inp ...

  7. wpf的datagrid和winform的datagridview刷新

    DataGrid的数据源的加载需要大量IO操作,不可能等数据全部读取之后才显示到UI上.由于对WPF数据绑定不很熟悉,对ObserveCollection等内容没有太多时间去研究,只能用一些取巧的办法 ...

  8. MVC4中使用Ninject

    MVC4中使用Ninject 1.NuGet获取Ninject.dll .NET技术交流群 199281001 .欢迎加入. 2.全局注册  Global.asax.cs  RegisterNinje ...

  9. TodoList开发笔记 – Part Ⅲ

    本节开始对TodoList项目的客户端进行开发 一.初步了解JQuery 其实我在学校时有接触过一段时间的Web开发,虽然代码量不多也不复杂,但也已经感受到了各浏览器对Web各项标准的恶意,Web界对 ...

  10. 使用POI导出excel

    引言:对于excel的导出,首先是将数据写到WorkBook中,然后将book以流的形式写出即可,看代码: public void exportResultInfo(String fileName,S ...