2019-07-31 09:55:17 thinktothings 阅读数 878
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5926 人正在学习 去看看 杨波

在线对比

https://aismartvip.com/voice/pk/billing/index

百度阿里语音识别对比

  百度 阿里

格式支持

pcm(不压缩)

wav(不压缩,pcm编码)

amr(压缩格式)

pcm(无压缩的pcm文件或wav文件)

 

Opus

mono

支持语言

中文,英文,粤语,四川话

中文,英文,湖北话,四川话

并发

普通版QPS:2,每秒请求2

       极速版QPS:50,每秒请求50

试用并发:2

商用并发:200

采样率

固定16k 采样率

8000Hz16000Hz

      计费方式          按次计费          按将计费,按时长计费
      时长限制  短语音60秒内,长语音实测超20分钟很容易自动中断,失败率很高 短语音60秒内,
      文件大小限制   录音文件512MB
     自动加标点符号 支持 支持
      时间戳 只有linux支持,超过20分钟时长,自动中断频率很高 支持,精确到每个字或单词的时间戳

 

 

 

 

 

 

 

 

 

 

 

 

 

百度极速版价格

月调用量(万次) 语音识别极速版(元/次)
0<调用次数<=600 0.0042
600<调用次数<=3000 0.0036
3000<调用次数<=6000 0.0029
6000<调用次数<=15000 0.0019
15000<调用次数 0.0014

百度普通版qps价格

QPS购买方式 单价(元)
1QPS/天 80
1QPS/月 1400

阿里调用方式

一句话识别,实时语音识别,录音文件识别

阿里计费方式和报价(预付费方式)

æ°é¢ä»è´¹æ¥ä»·

阿里计费方式和报价(后付费方式)

åä»è´¹æ¹å¼

阿里百度语音识别实测结果

百度阿里语音识别对比

bilibli视频评测: https://www.bilibili.com/video/av61302199

爱奇艺视频评测: https://www.iqiyi.com/v_19rrp089ss.html

统计

  百度 百度极速版 阿里
统计字个数 396 396 396
错误字个数 9 25 26
错误率 6.31% 6.56% 2.27%
       

说明:单一案例数据不能完全反映识别率,但在一定程度上可以反应识别率的高低,以及数据适用广度

详细记录

行号 开始时间 结束时间 时长(秒) 字幕   错误字数 字个数
1 0:00:01.500 0:00:03.930 2.43 (百度)    不爱刷牙的小狮子   0    
(百度极速版)    不爱刷牙的小狮子   0    
(阿里)    不爱刷牙的小狮子   0    
        (人工)    不爱刷牙的小狮子       8
                 
2 0:00:04.350 0:00:09.330 4.98 (百度)    小狮子不讲卫生,不爱刷牙,他的嘴巴越来越臭   0    
        (百度极速版)    小狮子不讲卫生,不爱刷牙,他的嘴巴越来越臭   0    
        (阿里)    小狮子不讲卫生,不爱刷牙,他的嘴巴越来越臭   0    
        (人工)    小狮子不讲卫生,不爱刷牙,他的嘴巴越来越臭       19
                 
3 0:00:09.420 0:00:12.000 2.58 (百度)    有一天,小狮子来找小熊玩   0    
(百度极速版)    有一天,小狮子来找小熊玩   0    
(阿里)    有一天,小狮子来找小熊玩   0    
        (人工)    有一天,小狮子来找小熊玩       11
                 
4 0:00:12.030 0:00:14.970 2.94 (百度)    刚开口说枭雄   4    
(百度极速版)    刚开口说枭雄   4    
(阿里)    他刚开口说,小熊,我   0    
        (人工)    他刚开口说,小熊,我       8
                 
5 0:00:15.540  0:00:19.170 3.63 (百度)    还没说完呢,只听小熊说了句什么吗?   1    
(百度极速版)    话还没说完呢,只听小熊说了句什么味儿   1    
(阿里)    包还没说完呢?只听小熊说了句什么味   1    
        (人工)    话还没说完呢?只听小熊说了句什么味       16
                 
6 0:00:19.380 0:00:21.840 2.46 (百度)    接着扑通一声倒在了地上   0    
(百度极速版)    接着扑通一声倒在了地上   0    
(阿里)    接着扑通一声倒在了地上   0    
        (人工)    接着扑通一声倒在了地上       11
                 
7 0:00:21.990 0:00:25.470 3.48 (百度)    小兔,我们小狮子看了小兔子过来   0    
(百度极速版)    小兔,我们小狮子看了小兔子过来   0    
(阿里)    小兔,我们小狮子看了小兔,走过来   0    
        (人工)    小兔,我们小狮子看了小兔,走过来       14
                 
8 0:00:25.560 0:00:27.780 2.22 (百度)    想好的想和她一起玩   2    
(百度极速版)    想好的想和她一起玩   2    
(阿里)    想,很想和他一起玩   1    
        (人工)    想,想和他一起玩       7
                 
9 0:00:27.840 0:00:31.560 3.72 (百度)    话还没说完呢,小兔头晕晕的说了句   0    
(百度极速版)    他话还没说完呢,小兔头晕晕的说了句   0    
(阿里)    他话还没说完呢?小兔头晕晕的,说了句   0    
        (人工)    他话还没说完呢?小兔头晕晕的,说了句       16
                 
10 0:00:31.710 0:00:35.310 3.6 (百度)    好臭,接着也不通一声倒在了地上   0    
(百度极速版)    好臭,接着也不通一声倒在了地上   0    
(阿里)    好臭,接着也扑通一声,倒在了地上   0    
        (人工)    好臭,接着也扑通一声,倒在了地上       14
                 
11 0:00:35.370 0:00:37.350 1.98 (百度)    小狮子呆呆的看着   0    
(百度极速版)    小狮子呆呆的看着   0    
(阿里)    小狮子呆呆地看着   0    
        (人工)    小狮子呆呆地看着       8
                 
12 0:00:37.410 0:00:38.250 0.84 (百度)    不久   0    
(百度极速版)    ERROR_3301_speech quality error._{"err_msg":"speech quality error.","sn":"789471505981564379425","err_no":3301}_app_id_16038894_qps_200_ACCOUNT_BILLING_1   1    
(阿里)    不久   0    
        (人工)    不久       2
                 
13 0:00:38.310 0:00:43.620 5.31 (百度)    小象甩着鼻子走过来,小狮子张开嘴巴对小象说   4    
(百度极速版)    小象甩着鼻子走过来,小狮子张开嘴巴对小象说   4    
(阿里)    小象甩着鼻子走过来,小狮子张开嘴巴对小象说,小夏,我们   1    
        (人工)    小象甩着鼻子走过来,小狮子张开嘴巴对小象说,小象,我们       24
                 
14 0:00:43.620 0:00:44.520 0.9 (百度)    来玩   0    
(百度极速版)    来玩   0    
(阿里)    来玩   0    
        (人工)    来玩       2
                 
15 0:00:44.880 0:00:47.430 2.55 (百度)    好难闻的气味   0    
(百度极速版)    好难闻的气味   0    
(阿里)    好难闻的气味儿啊   0    
        (人工)    好难闻的气味儿啊       8
                 
16 0:00:47.880 0:00:49.860 1.98 (百度)    小向打了个大喷嚏   1    
(百度极速版)    小向打了个大喷嚏   1    
(阿里)    小象打了个大喷嚏   0    
        (人工)    小象打了个大喷嚏       8
                 
17 0:00:49.890 0:00:52.800 2.91 (百度)    接着也摇摇晃晃的倒在了地上   0    
(百度极速版)    接着也摇摇晃晃的倒在了地上   0    
(阿里)    接着也摇摇晃晃地倒在了地上   0    
        (人工)    接着也摇摇晃晃地倒在了地上       13
                 
18 0:00:53.130 0:00:57.330 4.2 (百度)    小狮子没有找到一个朋友玩儿,他闷闷不乐地回到家   0    
        (百度极速版)    小狮子没有找到一个朋友玩儿,他闷闷不乐地回到家   0    
        (阿里)    小狮子没有找到一个朋友玩,他闷闷不乐的回到家   0    
        (人工)    小狮子没有找到一个朋友玩,他闷闷不乐的回到家       21
                 
19 0:00:57.330 0:00:57.330 2.97 (百度)    这时,他看到出远门的爸爸回来了   0    
(百度极速版)    这时,他看到出远门的爸爸回来了   0    
(阿里)    这时,他看到出远门的爸爸回来了   0    
        (人工)    这时,他看到出远门的爸爸回来了       14
                 
20 0:01:00.330 0:01:03.030 2.7 (百度)    小狮子张嘴巴高高兴兴的哈   1    
(百度极速版)    小狮子张嘴巴高高兴兴的哈   1    
(阿里)    小狮子张嘴巴高高兴兴的喊   0    
        (人工)    小狮子张嘴巴高高兴兴的喊       12
                 
21 0:01:03.510 0:01:04.110 0.6 (百度)    ERROR_3301_speech quality error._{"err_msg":"speech quality error.","sn":"128211790751564379419","err_no":3301}_app_id_16038875_qps_100_ACCOUNT_FREE_100   1    
(百度极速版)    ERROR_3301_speech quality error._{"err_msg":"speech quality error.","sn":"640301391711564379425","err_no":3301}_app_id_16038894_qps_200_ACCOUNT_BILLING_1   1    
(阿里)    爸   0    
        (人工)           1
                 
22 0:01:04.319 0:01:09.630 5.311 (百度)    爸爸突然把鼻子捂住,向后退,他对小事的说天呐,多久没说   4    
(百度极速版)    爸爸突然把鼻子捂住,向后退,他对小事的说天呐,多久没说   4    
(阿里)    爸爸突然把鼻子捂住向后退,他对小狮子说天呐,你多久没摔   1    
        (人工)    爸爸突然把鼻子捂住向后退,他对小狮子说天呐,你多久没刷        
                 
23 0:01:09.630 0:01:14.940  5.31 (百度)    小狮子拿到脖子上的毛,不好意思地说好像   2    
(百度极速版)    小狮子拿到脖子上的毛,不好意思地说好像   2    
(阿里)    刷牙了,小狮子拿到脖子上的毛不好意思地说,好像   2    
        (人工)    刷牙了,小狮子挠挠脖子上的毛不好意思地说,好像   0   21
            0    
24 0:01:15.150 0:01:16.620 1.47 (百度)    好像两个星期   0    
(百度极速版)    好像两个星期   0    
(阿里)    好像两个星期   0    
        (人工)    好像两个星期   0   6
            0    
25 0:01:17.010 0:01:17.760 0.75 (百度)    爸爸   0    
(百度极速版)    爸爸   0    
(阿里)    爸爸   0    
        (人工)    爸爸   0   2
            0    
26 0:01:17.790 0:01:22.620 4.83 (百度)    急忙给小狮子找出牙刷和牙膏,让他仔细刷牙   0    
(百度极速版)    急忙给小狮子找出牙刷和牙膏,让他仔细刷牙   0    
(阿里)    急忙给小狮子找出牙刷和牙膏,让他仔细刷牙   0    
        (人工)    急忙给小狮子找出牙刷和牙膏,让他仔细刷牙       19
                 
27 0:01:22.680 0:01:23.580 0.9 (百度)    一会儿   1    
(百度极速版)    一会儿   1    
(阿里)    坐一会儿   1    
        (人工)    不一会儿       4
                 
28 0:01:23.610 0:01:27.540 3.93 (百度)    狮子把牙齿刷干净了,她的嘴巴一点都不抽了   2    
(百度极速版)    狮子把牙齿刷干净了,她的嘴巴一点都不抽了   2    
(阿里)    小狮子把牙齿刷干净了,他的嘴巴一点都不抽了   1    
        (人工)    小狮子把牙齿刷干净了,他的嘴巴一点都不臭了       20
                 
29 0:01:27.690 0:01:30.450 2.76 (百度)    狮子,把今天的经历说给爸爸听   1    
(百度极速版)    狮子,把今天的经历说给爸爸听   1    
(阿里)    小狮子把今天的经历说给爸爸听   0    
        (人工)    小狮子把今天的经历说给爸爸听       14
                 
30 0:01:30.570  0:01:31.290 0.72 (百度)    宝贝   0    
(百度极速版)    宝贝   0    
(阿里)    宝贝   0    
        (人工)    宝贝       2
                 
31 0:01:31.530 0:01:35.610 4.08 (百度)    以后你一定要早晚按时刷牙,不然嘴巴臭臭的   0    
(百度极速版)    以后你一定要早晚20刷牙,不然嘴巴臭臭的   0    
(阿里)    以后,你一定要早晚按时刷牙,不然,嘴巴臭臭的   0    
        (人工)    以后,你一定要早晚按时刷牙,不然,嘴巴臭臭的       19
                 
32 0:01:35.670 0:01:37.620 1.95 (百度)    都不爱和你玩儿啊!   0    
(百度极速版)    都不爱和你玩儿啊!   0    
(阿里)    小伙伴都不爱,可你玩啊   0    
        (人工)    小伙伴都不爱,和你玩啊       10
                 
33 0:01:37.800 0:01:39.300 1.5 (百度)    爸爸对小狮子说   0    
(百度极速版)    爸爸对小狮子说   0    
(阿里)    爸爸对小狮子说   0    
        (人工)    爸爸对小狮子说       7
                 
34 0:01:39.300 0:01:41.340 2.04 (百度)    狮子听了点了点头   1    
(百度极速版)    狮子听了点了点头   1    
(阿里)    小狮子听了点了点头   0    
        (人工)    小狮子听了点了点头       9
                 
35 0:01:41.550 0:01:46.860 5.31 (百度)    从那以后,小狮子每天都按时刷牙,小伙伴们再也不被他熏倒了   0    
  (百度极速版)    从那以后,小狮子每天都按时刷牙,小伙伴们再也不被他熏倒了   0    
  (阿里)    从那以后,小狮子每天都按时刷牙小伙伴们再也不被他熏到了   0    
        (人工)    从那以后,小狮子每天都按时刷牙小伙伴们再也不被他熏到了       26
                 
                 
    错误率            
总字数: 396              
百度错别字 25 6.31%            
百度极速版错别字 26 6.56%            
阿里 9 2.27%            

 

 

2019-06-30 17:06:07 weixin_38358881 阅读数 589
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5926 人正在学习 去看看 杨波

语音识别

LibriSpeech ASR corpus

LibriSpeech 数据集
共将近1000个小时的数据集。分为clean和other两类。具体见链接。

WER评价指标

WER means " word error rate"
对于语音识别的预测结果,需要对此结果进行替换删除、插入某些词使之和标注词序列完全相同。修改的总词数比上标注词序列的个数即为WER,此项指标越低越好。具体计算公式如下,其中替换误差加权为1,删除和插入的误差加权为0.5
在这里插入图片描述
WER的取值范围是最小是0,最大可以大于1。此外,类似的评价指标还有SER,CER,仅仅是粗细粒度不同,计算方式相同。

2016-01-02 20:47:58 lc_1581835288 阅读数 10214
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5926 人正在学习 去看看 杨波

一.走近讯飞(iFly)

语音技术实现了人机语音交互,使人与机器之间沟通变得像人与人沟通一样简单。语音技术主要包括语音合成和语音识别两项关键技术。让机器说话,用的是语音合成技术;让机器听懂人说话,用的是语音识别技术。此外,语音技术还包括语音编码、音色转换、口语评测、语音消噪和增强等技术,有着广阔应用空间。

  • 早期的语音识别技术让人啼笑皆非, 就连Siri刚出道时, 也是漏洞百出. 但是讯飞通过多年的不懈努力, 最近发展迅速, 这也是技术型项目前期技术积累的必然结果.
  • 百度也推出了自己的语音识别, 但是因为技术积累尚浅, 移植和测试体验尚不如讯飞 – 本条个人观点.

科大讯飞从开始的只做语音识别和语音合成, 到现在的广告+统计+广场+人脸识别+声纹识别+推送, 可以看出它的野心–打造综合性平台, 同时又不放弃专营业务(并且拥有难以记忆的英文缩写和logo).

从使用讯飞的SDK过程中, 还是能感觉到诚意的, 很多设计很人性化, 免费提供了诸多测试和使用接口, 让人好感倍增, 这也是为啥我为其做了这么多广告.

二.搭建环境

登录开发者平台
  • 注册用户并且登录
  • 创建新应用

    选择创建新应用:

    file-listfile-list

    这里可以比较随意填写, 但是注意平台别搞错.

    file-listfile-list
    应用创建好之后, 请记录下讯飞为该APP生成的Appid: 56678310 (每个人都不一样哦)

  • 为新应添加服务

    新创建的应用可以在”我的应用”中查看, 开始的时候, 这个应用没有使用任何SDK, 我们需要向讯飞注册一下我们的app都需要哪些服务.

    file-listfile-list

    点击”开通更多服务”, 选择语言听写和在线语音合成两个SDK, 第一个开发语义是自己添加上的.

    file-listfile-list

  • 下载相应SDK

    进入下载SDK界面, 您可以通过诸多位置进入到这里, 可能与截图不符, 但没有问题.

    file-listfile-list

    这里选择”组合服务SDK下载”, 勾选图中前两个.

    file-listfile-list

    选择平台

    file-listfile-list

    最后选择刚才创建的引用, 之后点击下载.

    file-listfile-list

  • 新建xcode(singleView)工程, 将下载好的文件夹中lib下的iflyMac导入(拖入)工程

  • 添加引用库
    file-listfile-list

三.代码+++++

  • 在storyBoard的viewController中拖入几个控件, 一个UILable用来显示语音翻译后的文字, 两个UIbutton用来触发”带界面的实时翻译”和”不带界面的实时翻译”. 并为他们拖出属性和响应方法.
    如图:
    file-listfile-list

  • appdelegate.m中, 添加如下代码(注册):
    AppDelegate.m 的 didFinishLaunchingWithOptions中:

    1
    2
    3
    4
    5
    6
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // 根据appid登录到讯飞的服务器, 过程需要身份验证 , 56678310
        NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",@"你的appid, 别用我的"];
        [IFlySpeechUtility createUtility:initString];
        return YES;
    }
    

下面是写好后的ViewController代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151

#import "ViewController.h"
#import <iflyMSC/iflyMSC.h>
// 这个头文件是做什么的呢?
#import "ISRDataHelper.h"
// 还有这个.
#import "IATConfig.h"


@interface ViewController ()<IFlyRecognizerViewDelegate, IFlySpeechRecognizerDelegate>
// 翻译好的Text会展示在这个label上.
@property (weak, nonatomic) IBOutlet UILabel *textView;

/*!
 *  语音识别控件
 *    录音时触摸控件结束录音,开始识别(相当于旧版的停止);触摸其他位置,取消录音,结束会话(取消)
 *  出错时触摸控件,重新开启会话(相当于旧版的再说一次);触摸其他位置,取消录音,结束会话(取消)
 *
 */
@property (nonatomic,strong)IFlyRecognizerView * iflyRecognizerView;

/*!
 *  语音识别类
 *   此类现在设计为单例,你在使用中只需要创建此对象,不能调用release/dealloc函数去释放此对象。所有关于语音识别的操作都在此类中。
 */
@property (nonatomic, strong)IFlySpeechRecognizer * iFlySpeechRecognizer;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 语音识别视图空间及配置.
    [self initRecognizerView];
    
    // 语音识别类的初始化及配置.
    [self initSpeechRecognizer];
}

// !!!:语音识别视图空间及配置--方法.
-(void)initRecognizerView{
    _iflyRecognizerView = [[IFlyRecognizerView alloc] initWithCenter:self.view.center];
    _iflyRecognizerView.delegate = self;
    [_iflyRecognizerView setParameter: @"iat" forKey: [IFlySpeechConstant IFLY_DOMAIN]];
    //asr_audio_path保存录音文件名,如不再需要,设置value为nil表示取消,默认目录是documents
    [_iflyRecognizerView setParameter:@"asrview.pcm " forKey:[IFlySpeechConstant ASR_AUDIO_PATH]];
}
// !!!:语音识别类的初始化及配置--方法.
-(void)initSpeechRecognizer{
    //单例模式,无UI的实例
    if (_iFlySpeechRecognizer == nil) {
        _iFlySpeechRecognizer = [IFlySpeechRecognizer sharedInstance];
        
        [_iFlySpeechRecognizer setParameter:@"" forKey:[IFlySpeechConstant PARAMS]];
        
        //设置听写模式
        [_iFlySpeechRecognizer setParameter:@"iat" forKey:[IFlySpeechConstant IFLY_DOMAIN]];
    }
    _iFlySpeechRecognizer.delegate = self;
    
    if (_iFlySpeechRecognizer != nil) {
        IATConfig *instance = [IATConfig sharedInstance];
        
        //设置最长录音时间
        [_iFlySpeechRecognizer setParameter:instance.speechTimeout forKey:[IFlySpeechConstant SPEECH_TIMEOUT]];
        //设置后端点
        [_iFlySpeechRecognizer setParameter:instance.vadEos forKey:[IFlySpeechConstant VAD_EOS]];
        //设置前端点
        [_iFlySpeechRecognizer setParameter:instance.vadBos forKey:[IFlySpeechConstant VAD_BOS]];
        //网络等待时间
        [_iFlySpeechRecognizer setParameter:@"20000" forKey:[IFlySpeechConstant NET_TIMEOUT]];
        
        //设置采样率,推荐使用16K
        [_iFlySpeechRecognizer setParameter:instance.sampleRate forKey:[IFlySpeechConstant SAMPLE_RATE]];
        
        if ([instance.language isEqualToString:[IATConfig chinese]]) {
            //设置语言
            [_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]];
            //设置方言
            [_iFlySpeechRecognizer setParameter:instance.accent forKey:[IFlySpeechConstant ACCENT]];
        }else if ([instance.language isEqualToString:[IATConfig english]]) {
            [_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]];
        }
        //设置是否返回标点符号
        [_iFlySpeechRecognizer setParameter:instance.dot forKey:[IFlySpeechConstant ASR_PTT]];
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

// !!!: push界面的识别,点击事件
- (IBAction)voiceToText:(id)sender {
    [self.iflyRecognizerView start];
}

// !!!: 触发语音识别类的点击事件
- (IBAction)voiceToTextWithoutUI:(id)sender {
    self.textView.text = @"";
    // 这个需要手动停止翻译.
    [_iFlySpeechRecognizer cancel];
    
    //设置音频来源为麦克风
    [_iFlySpeechRecognizer setParameter:IFLY_AUDIO_SOURCE_MIC forKey:@"audio_source"];
    
    //设置听写结果格式为json
    [_iFlySpeechRecognizer setParameter:@"json" forKey:[IFlySpeechConstant RESULT_TYPE]];
    
    //保存录音文件,保存在sdk工作路径中,如未设置工作路径,则默认保存在library/cache下
    [_iFlySpeechRecognizer setParameter:@"asr.pcm" forKey:[IFlySpeechConstant ASR_AUDIO_PATH]];
    
    [_iFlySpeechRecognizer setDelegate:self];
    
    [_iFlySpeechRecognizer startListening];
}

// !!!:实现代理方法
// !!!:注意有没有s, 语音识别的结果回调(带界面的那个)
-(void)onResult:(NSArray *)resultArray isLast:(BOOL)isLast
{
    NSMutableString *result = [[NSMutableString alloc] init];
    NSDictionary *dic = [resultArray objectAtIndex:0];
    for (NSString *key in dic) {
        [result appendFormat:@"%@",key];
    }
    
    // 注意: 语音识别回调返回结果是一个json格式字符串, 解析起来比较麻烦, 但是我们只需要其中的字符串部分, 这个过程讯飞也觉得麻烦, 就推出了一个工具类, 能将这个josn解析最终字符串返回. 这也是前面导入ISRDataHelper.h的作用.
    NSString * resu = [ISRDataHelper stringFromJson:result];
    self.textView.text = [NSString stringWithFormat:@"%@%@",self.textView.text,resu];
}
// !!!:解析失败代理方法
-(void)onError:(IFlySpeechError *)error
{
    NSLog(@"解析失败了");
}

// !!!:语音识别类的回调方法(不带界面的那个)
- (void) onResults:(NSArray *) results isLast:(BOOL)isLast{
    NSMutableString *result = [[NSMutableString alloc] init];
    NSDictionary *dic = [results objectAtIndex:0];
    for (NSString *key in dic) {
        [result appendFormat:@"%@",key];
    }
    NSString * resu = [ISRDataHelper stringFromJson:result];
    self.textView.text = [NSString stringWithFormat:@"%@%@", self.textView.text, resu];
}

@end

在上面的代码中, 使用了两个类:

1
2
#import "ISRDataHelper.h"
#import "IATConfig.h"

他们的功能已经在注释中说明, 那么这两个类的源文件怎办呢… 让我想想…
算了, 最后我把这个工程传到git上吧. 你们从哪里扒下来就好了.

四.语音合成

其实iOS自带语音合成, 我们不必使用讯飞也可以达到这样的效果, 下面的代码能让你的APP读出这些文字.
Appdelegate.m中, 添加一个延展, 并且 didFinishLaunchingWithOptions 中添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@interface AppDelegate ()
@property(nonatomic,strong)AVSpeechSynthesizer * speechSynthesizer; // 合成器
@property(nonatomic,strong)AVSpeechUtterance * speechUtterance; // 合成器所说的内容
@end

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    self.speechSynthesizer = [[AVSpeechSynthesizer alloc] init];
    
    self.speechUtterance = [[AVSpeechUtterance alloc] initWithString:@"啪啪啪"];
    
    [self.speechSynthesizer  speakUtterance:self.speechUtterance];
    
    return YES;
}

运行之后, app能读出”啪啪啪”. 女性发音效果更好.


  • 使用讯飞实现啪啪啪的功能
    我们直接在上面的工程里添加吧.
    首先在sb中的viewcontroller里, 再拖一个textfiled, 我们让讯飞朗读textfiled中的内容.
    file-listfile-list

viewController.m, 这个将三个功能写到了同一个controller中.比较臃肿, 你们自己捋顺一下, 封装成类, 供以后使用.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#import "ViewController.h"
#import <iflyMSC/iflyMSC.h>
#import "ISRDataHelper.h"
#import "IATConfig.h"

#import "PcmPlayerDelegate.h"
#import "PcmPlayer.h"
#import "TTSConfig.h"

typedef NS_OPTIONS(NSInteger, SynthesizeType) {
    NomalType           = 5,//普通合成
    UriType             = 6, //uri合成
};

@interface ViewController ()<IFlyRecognizerViewDelegate, IFlySpeechRecognizerDelegate, IFlySpeechRecognizerDelegate>
// 翻译好的Text会展示在这个label上.
@property (weak, nonatomic) IBOutlet UILabel *textView;
// 朗读这里的内容.
@property (weak, nonatomic) IBOutlet UITextField *VoiceText;

/*!
 *  语音识别控件
 *    录音时触摸控件结束录音,开始识别(相当于旧版的停止);触摸其他位置,取消录音,结束会话(取消)
 *  出错时触摸控件,重新开启会话(相当于旧版的再说一次);触摸其他位置,取消录音,结束会话(取消)
 *
 */
@property (nonatomic,strong)IFlyRecognizerView * iflyRecognizerView;

/*!
 *  语音识别类
 *   此类现在设计为单例,你在使用中只需要创建此对象,不能调用release/dealloc函数去释放此对象。所有关于语音识别的操作都在此类中。
 */
@property (nonatomic, strong)IFlySpeechRecognizer * iFlySpeechRecognizer;


@property (nonatomic, strong) IFlySpeechSynthesizer * iFlySpeechSynthesizer;//语音合成对象
@property (nonatomic, strong) PcmPlayer *audioPlayer;//用于播放音频的
@property (nonatomic, assign) SynthesizeType synType;//是何种合成方式
@property (nonatomic, assign) BOOL hasError;//将解析过程中是否出现错误
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 语音识别视图空间及配置.
    [self initRecognizerView];
    
    // 语音识别类的初始化及配置.
    [self initSpeechRecognizer];
 
    // 初始化语音合成
    [self initMakeVoice];
}
// !!!:语音识别视图空间及配置--方法.
-(void)initRecognizerView{
    _iflyRecognizerView = [[IFlyRecognizerView alloc] initWithCenter:self.view.center];
    _iflyRecognizerView.delegate = self;
    [_iflyRecognizerView setParameter: @"iat" forKey: [IFlySpeechConstant IFLY_DOMAIN]];
    //asr_audio_path保存录音文件名,如不再需要,设置value为nil表示取消,默认目录是documents
    [_iflyRecognizerView setParameter:@"asrview.pcm " forKey:[IFlySpeechConstant ASR_AUDIO_PATH]];
}
// !!!:语音识别类的初始化及配置--方法.
-(void)initSpeechRecognizer{
    //单例模式,无UI的实例
    if (_iFlySpeechRecognizer == nil) {
        _iFlySpeechRecognizer = [IFlySpeechRecognizer sharedInstance];
        
        [_iFlySpeechRecognizer setParameter:@"" forKey:[IFlySpeechConstant PARAMS]];
        
        //设置听写模式
        [_iFlySpeechRecognizer setParameter:@"iat" forKey:[IFlySpeechConstant IFLY_DOMAIN]];
    }
    _iFlySpeechRecognizer.delegate = self;
    
    if (_iFlySpeechRecognizer != nil) {
        IATConfig *instance = [IATConfig sharedInstance];
        
        //设置最长录音时间
        [_iFlySpeechRecognizer setParameter:instance.speechTimeout forKey:[IFlySpeechConstant SPEECH_TIMEOUT]];
        //设置后端点
        [_iFlySpeechRecognizer setParameter:instance.vadEos forKey:[IFlySpeechConstant VAD_EOS]];
        //设置前端点
        [_iFlySpeechRecognizer setParameter:instance.vadBos forKey:[IFlySpeechConstant VAD_BOS]];
        //网络等待时间
        [_iFlySpeechRecognizer setParameter:@"20000" forKey:[IFlySpeechConstant NET_TIMEOUT]];
        
        //设置采样率,推荐使用16K
        [_iFlySpeechRecognizer setParameter:instance.sampleRate forKey:[IFlySpeechConstant SAMPLE_RATE]];
        
        if ([instance.language isEqualToString:[IATConfig chinese]]) {
            //设置语言
            [_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]];
            //设置方言
            [_iFlySpeechRecognizer setParameter:instance.accent forKey:[IFlySpeechConstant ACCENT]];
        }else if ([instance.language isEqualToString:[IATConfig english]]) {
            [_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]];
        }
        //设置是否返回标点符号
        [_iFlySpeechRecognizer setParameter:instance.dot forKey:[IFlySpeechConstant ASR_PTT]];
    }
}

// !!!:语音合成的初始化
-(void)initMakeVoice{
    TTSConfig *instance = [TTSConfig sharedInstance];
    if (instance == nil) {
        return;
    }
    
    //合成服务单例
    if (_iFlySpeechSynthesizer == nil) {
        _iFlySpeechSynthesizer = [IFlySpeechSynthesizer sharedInstance];
    }
    
    _iFlySpeechSynthesizer.delegate = self;
    
    //设置语速1-100
    [_iFlySpeechSynthesizer setParameter:instance.speed forKey:[IFlySpeechConstant SPEED]];
    
    //设置音量1-100
    [_iFlySpeechSynthesizer setParameter:instance.volume forKey:[IFlySpeechConstant VOLUME]];
    
    //设置音调1-100
    [_iFlySpeechSynthesizer setParameter:instance.pitch forKey:[IFlySpeechConstant PITCH]];
    
    //设置采样率
    [_iFlySpeechSynthesizer setParameter:instance.sampleRate forKey:[IFlySpeechConstant SAMPLE_RATE]];
    
    //设置发音人
    [_iFlySpeechSynthesizer setParameter:instance.vcnName forKey:[IFlySpeechConstant VOICE_NAME]];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

// !!!: push界面的识别,点击事件
- (IBAction)voiceToText:(id)sender {
    [self.iflyRecognizerView start];
}
// !!!: 触发语音识别类的点击事件
- (IBAction)voiceToTextWithoutUI:(id)sender {
    self.textView.text = @"";
    [_iFlySpeechRecognizer cancel];
    
    //设置音频来源为麦克风
    [_iFlySpeechRecognizer setParameter:IFLY_AUDIO_SOURCE_MIC forKey:@"audio_source"];
    
    //设置听写结果格式为json
    [_iFlySpeechRecognizer setParameter:@"json" forKey:[IFlySpeechConstant RESULT_TYPE]];
    
    //保存录音文件,保存在sdk工作路径中,如未设置工作路径,则默认保存在library/cache下
    [_iFlySpeechRecognizer setParameter:@"asr.pcm" forKey:[IFlySpeechConstant ASR_AUDIO_PATH]];
    
    [_iFlySpeechRecognizer setDelegate:self];
    
    [_iFlySpeechRecognizer startListening];
}
- (IBAction)speechAction:(id)sender {
    if ([self.VoiceText.text isEqualToString:@""]) {
        return;
    }
    
    if (_audioPlayer != nil && _audioPlayer.isPlaying == YES) {
        [_audioPlayer stop];
    }
    
    _synType = NomalType;
    
    self.hasError = NO;
    [NSThread sleepForTimeInterval:0.05];
    _iFlySpeechSynthesizer.delegate = self;
    [_iFlySpeechSynthesizer startSpeaking:self.VoiceText.text];
}

// !!!:实现代理方法
// !!!:注意有没有s, 语音识别的结果回调
-(void)onResult:(NSArray *)resultArray isLast:(BOOL)isLast
{
    NSMutableString *result = [[NSMutableString alloc] init];
    NSDictionary *dic = [resultArray objectAtIndex:0];
    for (NSString *key in dic) {
        [result appendFormat:@"%@",key];
    }
    
    // 注意: 语音识别回调返回结果是一个json格式字符串, 解析起来比较麻烦, 但是我们只需要其中的字符串部分, 这个过程讯飞也觉得麻烦, 就推出了一个工具类, 能将这个josn解析最终字符串返回. 这也是前面导入ISRDataHelper.h的作用.
    NSString * resu = [ISRDataHelper stringFromJson:result];
    self.textView.text = [NSString stringWithFormat:@"%@%@",self.textView.text,resu];
}
// !!!:解析失败代理方法
-(void)onError:(IFlySpeechError *)error
{
    NSLog(@"解析失败了");
}

// !!!:语音识别类的回调方法
//语音合成回调函数
- (void) onResults:(NSArray *) results isLast:(BOOL)isLast{
    NSMutableString *result = [[NSMutableString alloc] init];
    NSDictionary *dic = [results objectAtIndex:0];
    for (NSString *key in dic) {
        [result appendFormat:@"%@",key];
    }
    NSString * resu = [ISRDataHelper stringFromJson:result];
    self.textView.text = [NSString stringWithFormat:@"%@%@", self.textView.text, resu];
}
@end
2018-11-12 15:33:01 qq_23057733 阅读数 3384
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5926 人正在学习 去看看 杨波
会议室实拍图

大家好,现在已经到了2018年的年底了,作为一个语音识别行业内的工作者,我想写一篇文章,来给大家测试一下,目前市面上各大"语音识别"引擎的实际识别效果,本文仅作为交流学习使用.

一、识别引擎

1、捷通华声(支持中文、英文、粤语)

2、云知声(支持中文)

3、百度(支持中文、英文、粤语)

4、科大讯飞(支持中文、英文、粤语、等十四种方言以上)

5、阿里云(支持中文)

6、有道云(支持中文以及英语)

二、测试项目

声音内容涉及:时间、地区、常用语、人名、金额、新闻稿内容

1.近距离录音测试(首先我们会准备一段对着手机以及录音笔说话的清晰录音,测试以上6款识别引擎识别的效果)

2.远距离录音测试(我们会准备二段录音,分别距离为1米和3米,采用录音笔以及手机进行录音,并测试声音识别情况,对比各家识别引擎的错误率)

3.新闻稿发音人声音测试(采用标准发音,慢速测试每个识别引擎的识别情况,对比正确率)

三、测试参数

为了保证测试的公平性,所有测试录音,统一转换为

采样率 :16000 

编码:16bit 位深的单声道。

手机:Galaxys9+

录音笔:新科V-19

语音识别软件:录音啦

录音环境:室内会议室(无杂音)

语言类型:中文普通话

四、测试过程

一米距离录音

 

3米距离录音

一、手机录音”近距离[演讲稿]:

北京时间11月12日,2018-2019赛季短道速滑世界杯第二站在美国盐湖城继续进行,在男子500米比赛中武大靖以39秒505的成绩夺冠,并打破自己在平昌冬奥会上创造的39秒584的世界纪录。继上周两次登顶后,武大靖在500米项目上实现三连冠,成为该项目上当之无愧的霸主。

二、“手机录音”识别引擎近距离[演讲稿]识别结果

三、“手机录音”1米远距离录音原文:

关于王总的商业报告书我看了,大家打开第九页,文章中提到了“语音识别”行业的发展趋势正在迅速发展,我希望大家能够牢牢把握机会,争取在2018年的年底,把11月份,12月份的资料。详细的数据整理出来

四、“手机录音”识别引擎1米远录音识别结果

五、“手机录音”3米远距离录音原文:

2003年12月24日开工建设,2008年3月完工,总造价22.67亿元。作为国家标志性建筑,2008年奥运会主体育场,国家体育场结构特点十分显著。体育场为特级体育建筑,大型体育场馆。主体结构设计使用年限100年,耐火等级为一级,抗震设防烈度8度,地下工程防水等级1级。

 

六、“手机录音”识别引擎3米远录音识别结果

七、录音笔”近距离原文:

今天是2018年11月12日,我们在广东省广州市番禺区市桥街,小明将给大家介绍一下周杰伦演唱的歌曲,如“黑色毛衣”“七里香”等歌曲,都充满了年轻人的回忆。

 

八、录音笔”近距离识别结果:

九、录音笔”3米距离[演讲稿]

2003年12月24日开工建设,2008年3月完工,总造价22.67亿元。作为国家标志性建筑,2008年奥运会主体育场,国家体育场结构特点十分显著。体育场为特级体育建筑,大型体育场馆。主体结构设计使用年限100年,耐火等级为一级,抗震设防烈度8度,地下工程防水等级1级。

十、录音笔”3米距离识别结果:

十一、得出对比图以及结论

评分规则:

1.最佳得:3分

2.推荐得:2分

3.效果不理想得:1 分

总结:

1.在近距离的"手机"和"录音笔"录音中,各大识别引擎识别出来的文字效果都不错,会存在部分错别字,对于数字类的识别,推荐选用“云知声”,文字显示的比较直观,对于人名,歌曲名,捷通华声、云知声、科大讯飞、阿里云、有道云的识别效果都非常不错

2.录音距离超过或者等于3米的,首选“云知声”识别引擎,丢字率比较低,识别的完整性较高

3.对比“手机”和“录音笔”由于手机属于近距离录音设备,在对比三米录音距离下,除了“云知声”其他的识别引擎文字丢失率比较严重。

4.对于近距离的录音,每个识别引擎出来的文字相差不大

5.请注意!本次测试仅限与学习交流,实际不同录音识别效果会有差异

感谢您的阅读,如果有什么疑问或建议,欢迎在评论区评论……

2009-01-16 09:40:00 zhaofeng987 阅读数 2613
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5926 人正在学习 去看看 杨波

 

语音技术涉及到语音编码、语音合成、语音识别、语音技术应用等多个技术领域。本文讨论的不是语音编码的标准问题,而是对语音合成与识别领域的技术标准做一个研究与探讨。

语音技术涉及到语音编码、语音合成、语音识别、语音技术应用等多个技术领域。目前,关于语音编码,国际标准化组织ISO和国际电信联盟ITU上已经制订了一系列的技术标准,分别应用在有线通信、移动通信、数字音响等领域。但是,关于语音合成与识别技术的标准还没有一个统一的规范,ISO和ITU在这些领域也没有颁布技术标准和规范。虽然有些标准化组织、研究机构和大公司提出了各自的技术规范草案,但是没有得到广泛的承认和支持。国际上,许多跨国公司,如IBM、Microsoft、AT&T、Naunce、Sun System等对语音技术的研究已经持续了多年,对制定语音技术领域的标准非常关心并积极参与,希望能把各自公司的研究成果纳入到技术规范和标准中去,以期在激烈的竞争中处于技术的制高点。现在,与互联网有关的语音技术应用领域,相关的国际语音标准发展迅速,形成了VoiceXML和SALT两大语音标准阵营,并各自都获得了广泛的支持。但是,对语音合成与识别的核心技术,如系统框架、接口规范等还没有统一的标准。本文不讨论语音编码的标准问题,而是对语音合成与识别领域的技术标准做一个初步的探讨。

语音技术标准的三个层面

虽然目前国际上还没有统一的、得到广泛承认和支持的语音合成与识别领域的技术标准,但是,这方面的研究工作发展迅速,近几年推出了许多研究成果,特别是W3C组织积极推动并发布了多个语音技术应用方面的规范或标准。例如, W3C发布了Voice Browser(语音浏览器)标准的草案。在这个标准中,Voice Browser标准(草案)定义了几种支持语音输入和输出的链接语言。这些链接语言使语音设备可以跨越各种硬件和软件平台,特别是设计了关于对话、语音识别语法、语音合成、自然语言语义和搜集可重复使用的对话组件的链接语言。这些链接语言和组件就构成了未来语音界面框架。现在,这个标准组中的参加成员有AT&T、Cisco、Hitachi、HP、IBM、Intel、 Lucent、Microsoft、Motorola、Nokia、Nortel、Sun和Unisys等公司。由于语音识别与合成技术还处在迅速发展阶段,制订出一套合适的技术标准很不容易。关于语音技术(除了语音编码)有关标准的制定工作主要集中在三个层面。

语音技术应用: 在这个层面上,主要规定在应用开发中如何使用语音合成与识别技术,即应用程序与语音合成/识别引擎之间的通信协议/语言,许多跨国公司积极参加了这个层面的规范与标准的起草、制订工作,例如,如IBM、AT&T、Naunce、Microsoft、Sun System等,推动并且形成了VoiceXML和SALT两大语音标准阵营。从开发者的角度看,这些标准都是面向应用系统开发用的。万维网联盟W3C主持了VoiceXML的起草和制定工作,并从2000年开始陆续发布了VoiceXML的多个版本,其中包括了语音识别语法规范和语音合成标记语言等。这些标准不仅使应用程序可以移植,而且还能够使语法相关联。VoiceXML 2.0是一种标记语言,用于建立话音界面,相当于带语音功能的HTML。现在已经有数百个大的厂商开发了基于VoiceXML的应用程序。SALT表示语音应用标记语言,它是在现有的标记语言,如在HTML、XHTML的基础上,增加了对语音和多媒体功能的支持而形成的。对语音应用,它主要关注的是如何通过电话得到语音服务。2002年,SALT联盟论坛发布了SALT技术规范的草案,并且把它提交给了W3C,希望能成为技术标准。参加和支持SALT技术规范的大公司包括: Cisco Systems Inc., Comverse Inc., Intel Corp., Microsoft Corp., Philips Speech Processing 以及 SpeechWorks International Inc.等。

语音识别/合成系统性能评测标准: 美国国家技术与标准研究所(NIST)主持了这个方面的工作。从20世纪90年代中期开始,NIST就开始组织语音识别/合成系统的性能评测工作。由于语音识别/合成系统的实现技术各种各样,对它们的评测实际上是相当困难的。20世纪90年代初期的时候,语音识别/合成系统大量推出,但往往出现下面的情况: 某个系统在推出时,声称该系统有很高的性能,但实际应用的时候其性能与宣传的差别很大。因此,NIST认为应制定出一套评价语音识别/合成系统的技术标准,让所有的语音识别/合成系统在这套评测标准下进行评估,以得到客观的性能评价指标。在该领域,NIST陆续制定了评价语音识别/合成系统的词错误率WER的计算规范,语言模型的复杂度的计算规范,训练和测试语料的选取,系统响应时间标准,合成语音自然度的评价规范,测试程序的规范等。近年来,NIST又制定了针对其它语种(如,汉语,日语等)的评价标准。NIST的评价标准迅速得到了语音识别/合成领域开发者的支持,越来越多的大公司积极参加NIST组织的评测活动,同时也推动了语音识别/合成技术的发展。国内的“863”智能人机接口专家组也开展了类似的工作,陆续制定了针对汉语语音识别与合成系统性能的评价规范。

语音识别/合成引擎及其开发接口: 在这个层面上还没有一个技术标准或规范被广泛承认和采纳。ISO、ITU、NIST、W3C等标准化组织都没有在该方面推出技术标准或规范。实际上,这方面的工作涉及到许多语音识别/合成系统的具体实现问题,而系统的实现方法千变万化,难以用一个统一的规范和标准来规范。虽然没有语音识别/合成引擎及其开发接口的统一的标准和规范,但一些开发厂商和研究机构还是制定了各自的规范,在各自的语音系统中得到了实现,并随着语音识别/合成系统的推出而发布。

IBM在其推出的语音识别与合成引擎ViaVoice中规定了开发接口,提供了几百个开发接口函数。Microsoft推出了基于它的语音识别与合成引擎开发语音应用的接口Speech SDK, 在其中也提供了类似的开发接口函数。但是,IBM和Microsoft的语音识别与合成引擎的实现细节没有公开,也没有提供这方面的技术规范。另外,美国的CMU大学、英国剑桥大学电子工程系的HTK开发组都发布了开放式的语音识别与合成引擎的源码以及相应的开发工具,它们的语音识别与合成引擎的实现方法纷纷被众多的开发者所借鉴,从而形成了业界很有影响的开发规范,但是,这些规范也不是标准。目前,有许多语音识别与合成引擎,但是没有提供实现的技术规范,因此,这些系统的实现和提供的接口只是遵守各自特殊的规定,没有规范化并得到广泛的应用。

中文语音技术标准现状

制订中文语音技术的有关标准,对促进中文语音技术应用、推动中文语音产业发展、增强民族软件核心竞争力均具有非常重要的意义。国家信息产业部、“863”专家组、国家技术监督局和国家信息标准化委员会分别于2001年、2002年、2003年召开了三届语音标准研讨会,并于2003年11月由信息产业部科技司正式下文成立了“中文语音交互技术标准工作组”。

“中文语音交互技术标准工作组”是由国内产、学、研、用等企事业单位以及大专院校等自愿联合组织、经信息产业部科技司批准成立的、组织开展中文语音交互领域技术标准制定和研究活动的非营利性技术工作组织。该工作组的主要工作任务是研究并制定与中文语音交互技术有关的数据交换格式、系统架构与接口、系统分类与评测及数据库格式与标注等方面的标准。目前,语音合成和语音识别通用标准已正式立项为国家标准,报批稿已经完成,多个产业相关的应用技术标准也正在制定之中。

国家“863”智能人机接口专家组在20世纪90年代中后期邀请国内的一些研究机构和大学制订了针对汉语语音识别与合成系统的评价规范,该评价规范应用到了历届对“863”支持的汉语语音识别与合成系统的评价过程中。如果从语音识别与合成技术标准的三个层面考察,国内在该领域的研究工作主要集中在系统性能的评价规范的制订上,至今还没有正式实施的国家标准。但是,随着国内的语音应用开发地迅速发展,没有一个统一的技术规范或标准会造成许多开发重复,资源浪费。

例如,如果语音识别与合成引擎支持媒体资源控制协议(MRCP), 语音应用开发者采用MRCP,IVR和语音识别与合成引擎开发厂商之间的专有用的连接器就不需要了。再如,随着语音技术和应用市场需求增大的同时,面临着复杂系统互联的问题。在系统的互联接口、内容交换数据格式等方面没有一个大家共同遵循的标准,其开发难度、维护难度和运营难度是非常巨大的; 没有一个大家共同遵循的标准,语音合成/识别引擎与电话设备、后台数据库、地理信息、无线定位等其他组成部分完成通信也是非常困难的,这些都成了阻碍语音应用大规模发展的绊脚石。因此,制订和研究汉语语音技术领域的标准已迫在眉睫。

技术标准的主要内容

为了适应网上语音浏览、语音信息检索、交互式语音应用的发展需求,语音识别与合成技术的标准制订工作的重点目前应该集中语音技术应用层面和语音识别/合成引擎及其开发接口上。这样的一个标准或规范必须是有代表性的,通用的,被广泛接受和采用的; 显然,制定一个这样的标准不能闭门造车,要有标准的使用机构或潜在的使用机构参与,还必须与国际上已有的类似的标准接轨,与国际上的标准化机构,如ISO、W3C、ITU等密切合作。值得注意的是,语音识别/合成的实现算法千差万别,该领域的标准或规范只能提供一个实现框架,没有必要对具体的实现算法和技术细节进行约束。另外,语音技术标准还应该与具体应用无关,与语音识别/合成引擎无关等。

如上所述,语音技术标准(除了语音编码)的制订工作主要集中在三个不同的层面上。这三个层面标准的内容分别是:

语音技术应用: 一般基于语音的应用都有如下图所示的架构(已简化)。

 

在这个层面上,语音技术标准的主要内容是: 规定语音输入、语音输出、识别结果、返回结果的格式和属性。语音输入和语音输出属于用户与语音信号处理引擎之间的交互过程,所以,这部分也包括语音用户界面的内容; 识别结果是语音信号处理引擎输出的结果,也是识别结果执行引擎的输入,识别的结果一般是文本或命令,如何将识别结果格式化是该层面的主要任务; 返回结果是识别结果执行引擎的输出,也是语音信号处理引擎的输入,经语音信号处理引擎处理后,以语音的方式返回给用户。为此,需要规定语音输出的参数格式,如韵律特征、重音特征和停顿等。制订这方面的标准内容还应该考虑汉语语言和语音结构的特殊性。现在已经发布的技术标准或规范主要是VoiceXML和SALT,它们都属于描述和规定语音技术应用的层面,都是基于标记语言的格式。

语音识别/合成系统性能评测标准: 在这个层面上,语音技术标准的主要内容是: 评价语音识别引擎的性能指标,主要包括: 词汇量大小、识别方式、词错误率WER、语言模型复杂度、响应时间、训练和测试语料等; 评价语音合成引擎的性能指标,主要包括: 词汇量、自然度、清晰度、测试语料等。虽然我们可以借鉴NIST在这方面的经验和标准,但是针对汉语语音识别/合成系统性能评测标准,我们不能照搬,必须考虑汉语的特点。

语音识别/合成引擎及其开发接口: 在这个层面上,语音技术标准的主要内容是: 规定语音识别引擎的输入/输出的格式,如输入语音的方式(已有的语音数据的输入/Mic语音输入)、语音数据的格式、语音特征向量的格式、控制参数的语义格式、输出是文本串的格式、拼音串的格式、音素串的格式等,提供给用户开发接口的函数名、入口/出口参数、功能描述等; 但是,语音识别引擎的实现细节不应该包含在此部分的标准内,如引擎应该包含哪些模块,使用什么样的语音特征向量,如何计算语音特征向量,如何建立模板,如何匹配计算等,都不应该加以约束,而允许开发者采用适当的算法实现。关于规定语音合成引擎,需要规定的是: 输入的格式,如纯文本/拼音、带有控制串的文本/拼音、控制串的语义格式描述、输出的格式、提供给用户开发接口的函数名、入口/出口参数、功能描述等; 但是,语音合成引擎的实现细节不应该包含在此部分的标准内,如引擎应该包含哪些模块,如何进行输入文本的分析,如何分词,采用什么样的合成基元和算法等,都不应该加以约束。关于这部分标准的内容,IBM和Microsoft语音识别/合成引擎开发文档提供了详细的开发接口函数的信息,而且功能基本相同,可以为制订语音识别/合成引擎开发接口提供参考。语音识别引擎开发工具包HTK详细描述了如何开发一个新的语音识别引擎,对制订该部分标准的内容也具有参考意义。

链接:推动技术标准制订

语音技术在网络浏览器和其他领域的的需求越来越迫切,制订语音技术标准或规范的条件工作已经基本就绪,但针对各个具体语种的工作还很多。万维网联盟W3C在制定语音技术标准或规范方面做了大量工作,从2000年开始,先后发布了一系列用于语音识别、语音合成的标记语言规范; 为了制订一种通用标准,并被广泛采用,W3C邀请了国际上的大公司,如Sun、 IBM、Intel、微软等参加工作组。除了语音识别/合成标记语言,工作组还在开发语义翻译和呼叫控制扩展标记语言两种语音标准。这些标准都是W3C语音接口框架的重要部分,目的是为网络建立语音应用软件。

据报道,W3C计划提出针对普通话的语音技术标准,并计划加入日语、韩语等亚洲语种。到目前为止,W3C推出的语音技术标准中最成功的是VoiceXML 2.0,支持VoiceXML 2.0的Web浏览器可以解释VoiceXML 2.0脚本并向用户呈现语音信息,同时还能接受用户的语音请求,其功能相当于语音浏览器,大大促进了语音技术在网络中的应用。

(计算机世界报 2006年06月12日 第22期 B20、B21)

没有更多推荐了,返回首页