《语音识别原理与应用》洪青阳 第15章 工程应用实践————语音云平台

语音云平台

《语音识别原理与技术》洪青阳 工业应用实践 书、PPT 15.2

语音云平台可通过RESTful的方式给开发者提供一个通用的HTTP接口。

如图所示,系统通过HTTP的协议来进行调用。客户端采用HTTP Post,发Post请求到服务器,然后获取服务器的响应,根据响应的代码,判断操作是否成功。客户端负责语音的采集,并将采集后的语音上传到服务端,由服务端进行语音识别,并将结果返回到客户端。

部署不是一个识别引擎,so就够了,底层还要有一个服务程序,服务程序来调用识别引擎,服务程序再和外围客户端去交互。

image-20230130180710118

HTTP协议服务一般通过高级语言,如go、Python或Java等语言实现,接收HTTP多路并发请求,使用多线程技术调用引擎进行识别,并用JSON格式返回识别结果。

HTTP接口协议包括如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
传送字节流
必选字段:
userid: 用户名称,可使用用户手机号码
token: 系统分配

file: 文件标识
语音缓冲(可以合并传,也可分段传,但不能有间隔符):
buffer1(录音缓冲区)+
buffer2(录音缓冲区)+
buffer3(录音缓冲区)+
...
bufferN(录音缓冲区)
识别成功服务器返回:
{"result":"语音识别识别内容文本","errCode":"0","wavurl":"xxx.wav"}
wavurl是识别结果文本对应的语音文件url地址.默认是空""
识别结果是utf-8 编码。

识别失败服务器返回:
类似下面这个:{"result":"","errCode":"-1","AsrRetCode":"5"}
识别失败,会返回errCode!=0
说明:file内容字节流长度不能小于4000Byte

以下是客户端采用C代码实现CURL调用的例子。上传一句话的buffer,然后返回识别结果。

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
#include <windows.h> 
#include <stdio.h>
#include <time.h>
#include <stdio.h>
#include <fentl.h>
#include <io.h>
#include <sys/timeb.h>
#include <string>
#include <process.h>
#include "curl/curl.h"
#include"curl/easy.h"

static size_t asrwritefunc(void *ptr, size_t size, size_t nmemb, int *index)
{
int count=0;
char result[2048];
size_t result len = size * nmemb;
result[0]=0;
if(result_len>=2000) result_len=2000;
if(result_len>0)
{
memcpy(result, ptr, result_len);
result[result_len]='\0';
printf("result=%s",result);
}
else
printf("result_len=%d", result_len);
return result_len;
}

int test_asr(int index,char *audiodata,int content_len)
{
static int boot;
static char userid[64], token[28];
static char ycasr_ur1[128];
char tmp[1024];
if((use_asr&16) == 0) return -1;
if(boot==0)
{
boot=1;
GetPrivateProfileString("SET","URL","http://127.0.0.1:3998/dotcasr",ycasr_url,28,config);
GetPrivateProfileString("SET","USERID","13600000001",userid,32,config);
GetPrivateProfileString("SET","TOKEN","xxxx13600000001",token,64, config);
}

time_t now=time(NULL);
char host[MAX_BUFFER_SIZE];
memset(host, 0, sizeof(host));
_snprintf(host, sizeof(host), "%s", ycasr_url);
printf("host:%s",host);
CURL *curl;
CURLcode res;
struct curl_httppost *post=NULL;
struct curl_httppost *last=NULL;
curl_formadd(&post, &last, CURLFORM_COPYNAME, "userid", CURLFORM_COPYCONTENTS, userid, CURLFORM_END);
curl formadd(&post, &last, CURLFORM_COPYNAME, "token", CURLFORM_COPYCONTENTS, token, CURLFORM_END);

curl_formadd(&post, &last, CURLFORM_COPYNAME, "file",
CURLFORM BUFFER,"upload.wav",
CURLFORM BUFFERPTR, audiodata,
CURLFORM BUFFERLENGTH, content_len,
CURLFORM_END);

curl = curl_easy_init();
cur1_easy_setopt(curl, CURLOPT_URL, host);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30);
curl easy setopt(curl, CURLOPT_HTTPPOST, post);
curl easy_setopt(curl, CURLOPT_WRITEFUNCTION, asrwritefunc);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &index);
res = curl_easy_perform(curl);
if(res != CURLE OK)
{
printf("perform curl error:8d.\n", res);
//return -l;
}
curl_easy_cleanup(curl);
return 0;
}

int main()
{
char buffer[256000];
int c=0;
int res=-1,size=0,index=1:

FILE* fp1=fopen("test.wav","r+b");
if(fp1=NULL)
{
printf("open test.wav fail!");
return -1;
}
else
{
fseek(fp1,100,SEEK_SET);//跳过wav 头
while(!feof(fp1))
{
sizemfread(buffer+c,1,8000,fp1);
if(size<0) break;
c=c+size:
if(c>=240000) break; //最大 240K
}
fclose(fp1);
}
if(c>8000) res=test_asr(index,buffer,c);
}

语音云平台在服务器上运行,一般有强大的计算能力,因此可在其上使用复杂的声学模型和较大的语言模型,以支持各种场景的“任意说”识别,并通过 HTTP接口支持各种客户端调用。除了公有云,语音云平台也应支持私有云部署,以避免数据泄密。

语音云平台—流识别

语音云平台还可通过流的方式进行语音识别,

如语音云平台的客户端一次可送200ms左右的片段,服务端接收后进行拼接,累计到1s 时长时即可开始识别。这个识别过程也是部分解码,只是令牌传播过程可以显示中间结果。等句子传送结束后,再进行 Lattice 回溯解码,得到最后识别结果。

image-20230130182109183

流识别结果跟整句识别略微有差别,但影响不大,能够保证实用性能。流识别方式可以边说边识别,大大缩短时延,有效提升响应速度。

现在工业界部署的云平台,普遍采用流识别方式。