2020-02-08 22:03:22 mobaibier 阅读数 116
  • 阿里云智能语音交互技术实战

    1. 阿里云智能语音概述 2. 智能语音技术挑战 - 阿里集团内部技术的挑战 - 在公共云服务上遇到的挑战 3. 阿里云智能语音技术详解 - 语音识别 - 自然语音理解 4. 智能语音技术未来展望/应用

    3561 人正在学习 去看看 CSDN讲师

FreeSWITCH 语音识别 阿里云ASR2.0

随着阿里云语音识别接口升级到智能语音交互2.0版接口,特开发了一个freeswitch模块,通过在freeswitch中加载语音识别模块,将通话的话音实时对接到阿里云ASR服务器,并接收语音识别接口,最后把识别结果通过ESL输出。有问题欢迎交流。

编译:

请先下载阿里云ASR2.0版 sdk。然后再NlsSdkCpp2.0/demo目录下进行编译,否则会出现找不到库的情况。

安装

  mod_asr.so 复制到到 FreeSWITCH mod 目录。 cp mod_asr.so /usr/local/freeswitch/mod/。
  librealTimeUnity.so FreeSWITCH lib 目录,或者系统lib目录。cp librealTimeUnity.so /usr/local/freeswitch/lib/
  libopus.so FreeSWITCH lib 目录,或者系统lib目录。cp libopus.so.0 /usr/local/freeswitch/lib/
  /usr/local/freeswitch/conf/autoload_configs/modules.conf.xml 加入 <load module="mod_asr"/>

重启FreeSWITCH,或者fs_cli 里面执行 reload mod_asr

使用

申请阿里云的Access Key ID 和 Secret ,并根据您的需求如普通话识别或者粤语方言识别等来创建一个项目,然后获得项目AppKey,设置单声道或者双声道,配置静音间隔,识别服务器路径 等参数,将参数都申请并配置好即可通过这些参数加载mod_asr模块。

fs_cli 执行 originate user/1001 ‘start_asr:o7wh40soDVt146Bp IctccQ0wlpdVHjNLfwqFX4uQqqR1t LTAI4FhfQehv8tsiBRHUwoZ aleg 800 wss://nls-gateway.cn-shanghai.aliyuncs.com/ws/v1,park’ inline,分机接起来开始说话,就可以看到识别结果输出了。 输出结果的日志等级是 notify console loglevel 5
dialplan中使用 测试的时候如果不执行其他APP,park超时会自动挂断,可以加入修改park超时时间。

开发

fs_cli 测试方式 ,执行 /event custom asr 订阅事件。
识别结果会通过esl输出(需要订阅 custom asr 事件)(阿里云返回的原始json数据)例子如下:

Event-Subclass: asr
Event-Name: CUSTOM
Core-UUID: b3d2bbb5-3b51-404e-b3f1-f1756d16f611
FreeSWITCH-Hostname: izm5e4vks3kjsyngl2iz9iz
FreeSWITCH-Switchname: izm5e4vks3kjsyngl2iz9iz
FreeSWITCH-IPv4: 172.31.64.60
FreeSWITCH-IPv6: %3A%3A1
Event-Date-Local: 2020-02-03%2014%3A52%3A56
Event-Date-GMT: Mon,%2003%20Feb%202020%2006%3A52%3A56%20GMT
Event-Date-Timestamp: 1580712776404160
Event-Calling-File: mod_asr.cpp
Event-Calling-Function: onSentenceEnd
Event-Calling-Line-Number: 268
Event-Sequence: 1182
Result: %
ASR-Response: %7B%22header%22%3A%7B%22namespace%22%3A%22SpeechTranscriber%22,%22name%22%3A%22SentenceEnd%22,%22status%22%3A20000000,%22message_id%22%3A%222ab7f171487845e79dd126e63402bc27%22,%22task_id%22%3A%2275948cecf49c42ee851d8ac8a7098e96%22,%22status_text%22%3A%22Gateway%3ASUCCESS%3ASuccess.%22%7D,%22payload%22%3A%7B%22index%22%3A2,%22time%22%3A8000,%22begin_time%22%3A6370,%22result%22%3A%22%
Channel: sofia/internal/1001%40223.104.236.17%3A9762
UUID: a78d4423-f937-497c-a0f4-bef1295aaecd
Answered: true
ASRLeg: aleg

ASR-Response:asr返回结果。
Channel:当前通道。主要使用这2个通道变量。

2019-07-31 09:55:17 thinktothings 阅读数 1293
  • 阿里云智能语音交互技术实战

    1. 阿里云智能语音概述 2. 智能语音技术挑战 - 阿里集团内部技术的挑战 - 在公共云服务上遇到的挑战 3. 阿里云智能语音技术详解 - 语音识别 - 自然语音理解 4. 智能语音技术未来展望/应用

    3561 人正在学习 去看看 CSDN讲师

在线对比

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-08-14 10:19:52 qq_35128576 阅读数 300
  • 阿里云智能语音交互技术实战

    1. 阿里云智能语音概述 2. 智能语音技术挑战 - 阿里集团内部技术的挑战 - 在公共云服务上遇到的挑战 3. 阿里云智能语音技术详解 - 语音识别 - 自然语音理解 4. 智能语音技术未来展望/应用

    3561 人正在学习 去看看 CSDN讲师

首次讲讲思路,如果说不定大佬们也可以自己完成  ,如果大佬们懒得弄那就直接

看这里看这里

上面我已经实现了语音的实时录入检测识别并且附带了录入和识别的子项目

1.)本地语音的实时录入、并检测是否有语音录入判断是否休眠

package com.wqc.sound;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.TargetDataLine;

public class EngineeCore {

    String filePath = "E:\\1jAVE\\ECLIPSE\\obj\\nls-example-recognizer\\src\\main\\resources\\voice_cache.wav";

    AudioFormat audioFormat;
    TargetDataLine targetDataLine;
    boolean flag = true;


private void stopRecognize() {
        flag = false;
        targetDataLine.stop();
        targetDataLine.close();
    }private AudioFormat getAudioFormat() {
        float sampleRate = 16000;
        // 8000,11025,16000,22050,44100
        int sampleSizeInBits = 16;
        // 8,16
        int channels = 1;
        // 1,2
        boolean signed = true;
        // true,false
        boolean bigEndian = false;
        // true,false
        return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, bigEndian);
    }// end getAudioFormat


    void startRecognize() {
        try {
            // 获得指定的音频格式
            audioFormat = getAudioFormat();
            DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, audioFormat);
            targetDataLine = (TargetDataLine) AudioSystem.getLine(dataLineInfo);

            // Create a thread to capture the microphone
            // data into an audio file and start the
            // thread running. It will run until the
            // Stop button is clicked. This method
            // will return after starting the thread.
            flag = true;
            new CaptureThread().start();
        } catch (Exception e) {
            e.printStackTrace();
        } // end catch
    }// end captureAudio method

    class CaptureThread extends Thread {
        public void run() {
            @SuppressWarnings("unused")
			AudioFileFormat.Type fileType = null;
            File audioFile = new File(filePath);
            boolean has= new File(filePath).exists();
            if(has) {
            	audioFile.delete();
            }
            fileType = AudioFileFormat.Type.WAVE;
            //声音录入的权值
            int weight = 2;
            //判断是否停止的计数
            int downSum = 0;

            ByteArrayInputStream bais = null;
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            AudioInputStream ais = null;
            try {
                targetDataLine.open(audioFormat);
                targetDataLine.start();
                byte[] fragment = new byte[1024];

                ais = new AudioInputStream(targetDataLine);
                while (flag) {

                    targetDataLine.read(fragment, 0, fragment.length);
                    //当数组末位大于weight时开始存储字节(有声音传入),一旦开始不再需要判断末位
                    if (Math.abs(fragment[fragment.length-1]) > weight || baos.size() > 0) {
                        baos.write(fragment);
                        System.out.println("守卫:"+fragment[0]+",末尾:"+fragment[fragment.length-1]+",lenght"+fragment.length);
                        //判断语音是否停止
                        if(Math.abs(fragment[fragment.length-1])<=weight){
                            downSum++;
                        }else{
                            System.out.println("重置奇数");
                            downSum=0;
                        }//计数超过20说明此段时间没有声音传入(值也可更改)
                        if(downSum>20){
                            System.out.println("停止录入");
                            break;
                        }

                    }
                }

                //取得录音输入流
                audioFormat = getAudioFormat();
                byte audioData[] = baos.toByteArray();
                bais = new ByteArrayInputStream(audioData);
                ais = new AudioInputStream(bais, audioFormat, audioData.length / audioFormat.getFrameSize());
                //定义最终保存的文件名
                System.out.println("开始生成语音文件");
                AudioSystem.write(ais, AudioFileFormat.Type.WAVE, audioFile);
                downSum = 0;
                stopRecognize();

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //关闭流

                try {
                    ais.close();
                    bais.close();
                    baos.reset();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }// end run
    }// end inner class CaptureThread
}

2.)接下来是阿里的语音识别的系统

package com.wqc.sound;

import java.io.File;
import java.io.InputStream;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;

import com.alibaba.nls.client.protocol.InputFormatEnum;
import com.alibaba.nls.client.protocol.NlsClient;
import com.alibaba.nls.client.protocol.SampleRateEnum;
import com.alibaba.nls.client.protocol.asr.SpeechRecognizer;
import com.alibaba.nls.client.protocol.asr.SpeechRecognizerListener;
import com.alibaba.nls.client.protocol.asr.SpeechRecognizerResponse;

/**
 * @author zhishen.ml
 * @date 2018-06-12
 */
public class SpeechRecognizerDemo {
    private String appKey;
    private String accessToken;
    NlsClient client;

    public SpeechRecognizerDemo(String appKey, String token) {
        this.appKey = appKey;
        this.accessToken = token;
        //创建NlsClient实例,应用全局创建一个即可,默认服务地址为阿里云线上服务地址
        client = new NlsClient(accessToken);
    }

    public SpeechRecognizerDemo(String appKey, String token, String url) {
        this.appKey = appKey;
        this.accessToken = token;
        //创建NlsClient实例,应用全局创建一个即可,用户指定服务地址
        client = new NlsClient(url, accessToken);
    }

    private static SpeechRecognizerListener getRecognizerListener() {
        SpeechRecognizerListener listener = new SpeechRecognizerListener() {
            //识别出中间结果.服务端识别出一个字或词时会返回此消息.仅当setEnableIntermediateResult(true)时,才会有此类消息返回
            @Override
            public void onRecognitionResultChanged(SpeechRecognizerResponse response) {
                //事件名称 RecognitionResultChanged
                System.out.println("name22222222: " + response.getName() +
                    //状态码 20000000 表示识别成功
                    ", status2222222: " + response.getStatus() +
                    //语音识别文本
                    ", result22222222: " + response.getRecognizedText());
            }

            //识别完毕
            @Override
            public void onRecognitionCompleted(SpeechRecognizerResponse response) {
                //事件名称 RecognitionCompleted
                System.out.println("name11111111: " + response.getName() +
                    //状态码 20000000 表示识别成功
                    ", status111111: " + response.getStatus() +
                    //语音识别文本
                    ", result1111111: " + response.getRecognizedText());
            }

            @Override
            public void onStarted(SpeechRecognizerResponse response) {
                System.out.println(
                    "task_id: " + response.getTaskId());
            }

            @Override
            public void onFail(SpeechRecognizerResponse response) {
                System.out.println(
                    "task_id: " + response.getTaskId() +
                        //状态码 20000000 表示识别成功
                        ", status: " + response.getStatus() +
                        //错误信息
                        ", status_text: " + response.getStatusText());

            }
        };
        return listener;
    }

    public void process(InputStream ins) {
        SpeechRecognizer recognizer = null;
        try {
            //创建实例,建立连接
            recognizer = new SpeechRecognizer(client, getRecognizerListener());
            recognizer.setAppKey(appKey);
            //设置音频编码格式
            recognizer.setFormat(InputFormatEnum.PCM);
            //设置音频采样率
            recognizer.setSampleRate(SampleRateEnum.SAMPLE_RATE_16K);
            //设置是否返回中间识别结果
            recognizer.setEnableIntermediateResult(true);

            //此方法将以上参数设置序列化为json发送给服务端,并等待服务端确认
            recognizer.start();
            //语音数据来自声音文件用此方法,控制发送速率;若语音来自实时录音,不需控制发送速率直接调用 recognizer.sent(ins)即可
            recognizer.send(ins, 3200, 100);
            //通知服务端语音数据发送完毕,等待服务端处理完成
            recognizer.stop();

        } catch (Exception e) {
            System.err.println(e.getMessage());
        } finally {
            //关闭连接
            if (null != recognizer) {
                recognizer.close();
            }
        }
    }

    public void shutdown() {
        client.shutdown();
    }

    public static void main(String[] args) throws Exception {
        String appKey = null;
        String token = null;
        String url = null;
        SpeechRecognizerDemo demo = null;
       // while (true) {
//        		EngineeCore engineeCore = new EngineeCore();
//
//        		engineeCore.startRecognize();
        		String filePath = "E:\\1jAVE\\ECLIPSE\\obj\\nls-example-recognizer\\src\\main\\resources\\nls-sample-16k.wav";
  	            File audioFile = new File(filePath);
               //boolean has= new File(filePath).exists();
        		//if (has) {
        			 if (args.length == 2) {
     	                appKey = args[0];
     	                token = args[1];
     	                //default url is wss://nls-gateway.cn-shanghai.aliyuncs.com/ws/v1
     	                demo = new SpeechRecognizerDemo(appKey, token);
     	            } else if (args.length == 3) {
     	                appKey = args[0];
     	                token = args[1];
     	                url = args[2];
     	                demo = new SpeechRecognizerDemo(appKey, token, url);
     	            } else {
     	                System.err.println("SpeechRecognizerDemo need params(url is optional): " +
     	                    "<app-key> <token> [<url>]");
     	                System.exit(-1);
     	            }
     	           
        			 AudioInputStream ins=AudioSystem.getAudioInputStream(audioFile);
     	           // InputStream ins = SpeechRecognizerDemo.class.getResourceAsStream("/voice_cache.wav");
     	            if (null == ins) {
     	                System.err.println("open the audio file failed!");
     	                System.exit(-1);
     	            }
     	            demo.process(ins);
     	            demo.shutdown();
				}
	           
			
		//}
       
   // }

}

上面两个子项目是以独立文件保存和读取的形式来实现的

接下来是pom文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
            <groupId>org.springframework.boot</groupId>
   			 <artifactId>spring-boot-starter-parent</artifactId>
    		<version>1.5.10.RELEASE</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
  <groupId>com.wqc</groupId>
  <artifactId>aliAI-sound-spring</artifactId>
  <version>1.5.10.RELEASE</version>
  <properties>
  	<java.version>1.8</java.version>
  	</properties>
   <dependencies>
        <dependency>
            <groupId>com.alibaba.nls</groupId>
            <artifactId>nls-sdk-recognizer</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.0.13</version>
        </dependency>
        <!-- 语音读书 -->
        <dependency>
		  <groupId>com.hynnet</groupId>
		  <artifactId>jacob</artifactId>
		  <version>1.18</version>
		</dependency>
		<!-- 读取xml -->
		<dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.1-beta-11</version>
                <exclusions>
                <exclusion>
                    <groupId>xerces</groupId>
                    <artifactId>xercesImpl</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>

        <dependency>
            <groupId>com.ibm.icu</groupId>
            <artifactId>icu4j</artifactId>
            <version>3.8</version>
        </dependency>

        <dependency>
            <groupId>xerces</groupId>
            <artifactId>xmlParserAPIs</artifactId>
            <version>2.6.2</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
           <plugin>
		      <groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-jar-plugin</artifactId>
			<version>2.3.1</version>
			<configuration>
				<archive>
					<manifest>
						<addClasspath>true</addClasspath>
					</manifest>
					<manifestEntries>
						<Premain-Class>
							com.xzq.test.PreAgent
						</Premain-Class>
					</manifestEntries>
				</archive>
			</configuration>
		
		     </plugin>
        </plugins>
    </build>
</project>

 

2018-01-20 16:18:16 iyaosan 阅读数 18695
  • 阿里云智能语音交互技术实战

    1. 阿里云智能语音概述 2. 智能语音技术挑战 - 阿里集团内部技术的挑战 - 在公共云服务上遇到的挑战 3. 阿里云智能语音技术详解 - 语音识别 - 自然语音理解 4. 智能语音技术未来展望/应用

    3561 人正在学习 去看看 CSDN讲师

FreeSWITCH 语音识别 ASR 模块

最近很多人都对FreeSWITCH和ASR对接比较感谢兴趣,我之前已经做了一个商业模块(商业模块请点击这里http://www.dingdingtong.cn/smartivr/),考虑到大部分人,只是研究一下,并不准确购买商业模块,特意做一个开源项目给大家提供一个参考。

第一个版本实现 阿里云ASR和FreeSWITCH的直接对接,把识别结果通过ESL输出。

想了开发进度,和本项目的技术交流欢迎加QQ群:340129771

2017-12-10 第一版本代码提交

  • 安装

    • 如果你觉得自己编译太麻烦,可以直接下载我编译好的,放在bin 目录里面。路径请根据自己情况修改。注意只支持x64系统
    • mod_asr.so 复制到到 FreeSWITCH mod 目录。 cp mod_asr.so /usr/local/freeswitch/mod/,如果是fs1.2,请用fs1.2_mod_asr.so的那个。
    • librealTimeUnity.so FreeSWITCH lib 目录,或者系统lib目录。cp librealTimeUnity.so /usr/local/freeswitch/lib/
    • libopus.so FreeSWITCH lib 目录,或者系统lib目录。cp libopus.so.0 /usr/local/freeswitch/lib/
    • config-realtime.txt 复制到 /etc/目录。cp config-realtime.txt /etc/
    • /usr/local/freeswitch/conf/autoload_configs/modules.conf.xml 加入 <load module="mod_asr"/>
    • 重启FreeSWITCH,或者fs_cli 里面执行 reload mod_asr
    • 注意默认只支持单声道8000hz的编码,opus或者g722编码不支持。
  • 编译

  • 使用

    • 申请阿里云的Access Key ID 和 Secret ,请参考 https://help.aliyun.com/document_detail/30437.html?spm=5176.doc35312.6.539.7eNuaN,如果你还没有,可以先使用我已经申请的id(LTAIRLpr2pJFjQbY)和key(oxrJhiBZB5zLX7LKYqETC8PC8ulwh0)测试。
    • fs_cli 执行 originate user/1001 ‘start_asr:id secret,park’ inline,如 bgapi originate user/1001 'start_asr:LTAIRLpr2pJFjQbY oxrJhiBZB5zLX7LKYqETC8PC8ulwh0,park' inline,分机接起来开始说话,就可以看到识别结果输出了。 输出结果的日志等级是 notify console loglevel 5
    • dialplan中使用 测试的时候如果不执行其他APP,park超时会自动挂断,可以加入<action application="set" data="park_timeout=60"/>修改park超时时间。

      <extension name="asr">
          <condition field="destination_number" expression="^(888)$">
              <action application="answer"/>
              <action application="start_asr" data="LTAIRLpr2pJFjQbY oxrJhiBZB5zLX7LKYqETC8PC8ulwh0"/>
              <action application="park"/>
          </condition>
      </extension> 
      
  • 开发

    • fs_cli 测试方式 ,执行 /event custom asr 订阅事件。
    • 识别结果会通过esl输出(需要订阅 custom asr 事件)(阿里云返回的原始json数据)例子如下:

      RECV EVENT
      Event-Subclass: asr
      Event-Name: CUSTOM
      Core-UUID: 48a08a69-7858-407a-be69-679150d34193
      FreeSWITCH-Hostname: MiWiFi-R3D-srv
      FreeSWITCH-Switchname: MiWiFi-R3D-srv
      FreeSWITCH-IPv4: 192.168.31.164
      FreeSWITCH-IPv6: ::1
      Event-Date-Local: 2017-12-10 11:30:32
      Event-Date-GMT: Sun, 10 Dec 2017 03:30:32 GMT
      Event-Date-Timestamp: 1512876632835590
      Event-Calling-File: mod_asr.cpp
      Event-Calling-Function: OnResultDataRecved
      Event-Calling-Line-Number: 55
      Event-Sequence: 914
      ASR-Response: {"finish":0,"request_id":"ee87d7fd5e304bdaa9343d9262f34125","result":{"sentence_id":2,"begin_time":4200,"end_time":6525,"status_code":0,"text":"美国拜拜"},"status_code":200,"version":"2.0"}
      Channel: sofia/external/linphone@192.168.31.210
      

      ASR-Response:asr返回结果。
      Channel:当前通道。主要使用这2个通道变量。

    • 如果你需要用户说完一整句话,再一次性返回结果。请把config-realtime.txt文件ResponseMode:streaming修改为ResponseMode:normal
    • 如果你觉得自己开发太麻烦了,可以联系QQ:1280791187 或者微信:cdevelop,获取商业服务和支持。
2018-10-30 23:54:36 baisedeqingting 阅读数 578
  • 阿里云智能语音交互技术实战

    1. 阿里云智能语音概述 2. 智能语音技术挑战 - 阿里集团内部技术的挑战 - 在公共云服务上遇到的挑战 3. 阿里云智能语音技术详解 - 语音识别 - 自然语音理解 4. 智能语音技术未来展望/应用

    3561 人正在学习 去看看 CSDN讲师

实例代码先行 AutomaticSpeechRecognition

一、申请语音识别API(可忽略,代码中有我自己的)

阿里智能语音识别网页申请自己的AccessKey,secret。

二、用Android Studio创建项目

可以从git clone下载用下我的

git clone https://github.com/zzuwenjie/AutomaticSpeechRecognition

1、在build.gradle(module:app)文件的android中添加

    sourceSets {
        main {
            jniLibs.srcDirs = ["libs"]
        }
    }

2、将在阿里云智能语音识别上下载的android sdk解压

将下图中的包复制到自己项目的app/libs文件夹中

3、修改代码

3.1 在manifest.xml文件夹中添加所需权限,记得申请下这些权限。(实例代码中有)

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

在主进程(UI)申请下权限

        ActivityCompat.requestPermissions(this, new String[]{
                Manifest.permission.RECORD_AUDIO,
                Manifest.permission.INTERNET,
                Manifest.permission.ACCESS_NETWORK_STATE,
        }, 1);

3.2 添加语音识别类 AutoSpeechRecognizer .可自命名

/**
 * Created by wjsay on 2018/10/30
 * Describe: 阿里云,一句话识别。
 * 其中id、secret是我自己实名认证申请的。请换成自己的
 */

public class AutoSpeechRecognizer {
    private static final String TAG = "AutoSpeechRecognizer";

    private static final String appKey = "nls-service";
    private static final String id = "LTAILtpaW9KOS53M";
    private static final String secret = "iL8LEpKJAGjCsA93sGgc0TD005yovA";

    private boolean recognizing;
    private NlsClient mNlsClient;
    private NlsRequest mNlsRequest;

    /**
     * 实例化语音识别
     *
     * @param listener      异步语音服务结果的回调类,回调参数:
     *                      NlsClient.ErrorCode.SUCCESS:
     *                      NlsClient.ErrorCode.RECOGNIZE_ERROR:
     *                      NlsClient.ErrorCode.RECORDING_ERROR:
     *                      NlsClient.ErrorCode.NOTHING:
     * @param stageListener 语音服务引擎状态变更回调接口,服务状态的改变
     *                      音量大小的回调、语音文件的生成通过本接口获取。
     */
    public AutoSpeechRecognizer(Context context, NlsListener listener, StageListener stageListener) {
        NlsClient.openLog(true);
        NlsClient.configure(context.getApplicationContext());

        mNlsRequest = new NlsRequest(new NlsRequestProto(context));
        mNlsRequest.setApp_key(appKey);
        mNlsRequest.setAsr_sc("opu");

        //实例化NlsClient
        mNlsClient = NlsClient.newInstance(context, listener, stageListener, mNlsRequest);
        mNlsClient.setMaxRecordTime(60000);         //设置最长语音
        mNlsClient.setMaxStallTime(1000);           //设置最短语音
        mNlsClient.setMinRecordTime(500);           //设置最大录音中断时间
        mNlsClient.setRecordAutoStop(false);        //设置VAD
        mNlsClient.setMinVoiceValueInterval(100);   //设置音量回调时长
    }

    /**
     * 开始识别
     */
    public void startRecognize() {
        recognizing = true;
        mNlsRequest.authorize(id, secret);
        if (!mNlsClient.start()){
            Log.e(TAG, "startRecognize: can not start recognize");
        }
    }

    /**
     * 停止识别
     */
    public void stopRecognize() {
        if (recognizing)
            mNlsClient.stop();
        recognizing = false;
    }

    /**
     *
     * @return 是否正在录音识别的布尔值
     */
    public boolean isRecognizing() {
        return recognizing;
    }
}

3.3 使用样例

点击按钮开始语音识别,再次点击识别结束。并发量不大于10.。

AutoSpeechRecognize的实例有几个方法需要注意,

isRecognizing 判断是否在识别   stopRecognize 停止识别,处理结果   startRecognize开始识别

实例代码比较简洁,容易化为适合自己使用的,嘿嘿。

————————————————————————————————————————————————————

感谢我室友BoldEric的帮助

——by wjsay 2018-10-30 23:53:41

语音识别方案

阅读数 1190

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