首先看下服务器端,服务器端使用martini框架,仅建立一个简单的接收客户端post请求并保存客户端传过来的语音的后台服务:
原文地址:http://liuxp0827.blog.51cto.com/5013343/1412977
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
|
package
main
//http://liuxp0827.blog.51cto.com/5013343/1412977
import
(
"bufio"
"github.com/go-martini/martini"
"io/ioutil"
"log"
"net/http"
"os"
)
func main() {
m := martini.Classic()
m.Post(
"/wave"
, func(req *http.Request) {
file, _, err := req.FormFile(
"file"
)
if
err != nil {
log.Fatal(
"FormFile: "
, err.Error())
os.Exit(
2
)
}
defer func() {
if
err := file.Close(); err != nil {
log.Fatal(
"Close: "
, err.Error())
os.Exit(
2
)
}
}()
localFile, _ := os.Create(
"1.wav"
)
defer localFile.Close()
writer := bufio.NewWriter(localFile)
bytes, err := ioutil.ReadAll(file)
if
err != nil {
log.Fatal(
"ReadAll: "
, err.Error())
os.Exit(
2
)
}
writer.Write(bytes)
writer.Flush()
})
http.ListenAndServe(
":8080"
, m)
}
|
再来看下客户端的java代码,首先调用readWavform函数从本地读取语音文件到byte[],然后设置相应的POST头信息,最终发送数据:
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
|
import
java.io.ByteArrayOutputStream;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileNotFoundException;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.OutputStream;
import
java.net.HttpURLConnection;
import
java.net.URL;
import
java.util.HashMap;
import
java.util.Iterator;
import
java.util.Map;
//http://liuxp0827.blog.51cto.com/5013343/1412977
public
final
class
upload {
public
static
void
main(String[] args) {
Map<String, String> parameters =
new
HashMap<String, String>();
byte
[] data = readWavform(
"C:\\Users\\PONPON\\Desktop\\test.wav"
);
doUploadFile(
"http://localhost:8080/wave"
, parameters,
Constants.FILEPARAM,
"11.wav"
,
"multipart/form-data;"
,
data);
}
public
static
byte
[] readWavform(String filename) {
int
regLen =
0
;
byte
[] regbuffer =
null
;
try
{
FileInputStream inputsteam =
new
FileInputStream(
new
File(filename));
regLen = inputsteam.available();
regbuffer =
new
byte
[regLen];
if
((regLen = inputsteam.read(regbuffer,
0
, regLen)) <
0
) {
System.out.println(
"error when read pcm file."
);
}
}
catch
(FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch
(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return
regbuffer;
}
public
static
String doUploadFile(String reqUrl,
Map<String, String> parameters, String fileParamName,
String filename, String contentType,
byte
[] data) {
HttpURLConnection urlConn =
null
;
try
{
urlConn = sendFormdata(reqUrl, parameters, fileParamName, filename,
contentType, data);
String responseContent =
new
String(getBytes(urlConn));
return
responseContent.trim();
}
catch
(Exception e) {
throw
new
RuntimeException(e.getMessage(), e);
}
finally
{
if
(urlConn !=
null
) {
urlConn.disconnect();
}
}
}
private
static
HttpURLConnection sendFormdata(String reqUrl,
Map<String, String> parameters, String fileParamName,
String filename, String contentType,
byte
[] data) {
HttpURLConnection urlConn =
null
;
try
{
URL url =
new
URL(reqUrl);
urlConn = (HttpURLConnection) url.openConnection();
urlConn.setRequestMethod(
"POST"
);
urlConn.setConnectTimeout(
10000
);
// (单位:毫秒)jdk
urlConn.setReadTimeout(
10000
);
// (单位:毫秒)jdk 1.5换成这个,读操作超时
urlConn.setDoOutput(
true
);
urlConn.setRequestProperty(
"connection"
,
"keep-alive"
);
String boundary =
"-----------------------------114975832116442893661388290519"
;
// 分隔符
urlConn.setRequestProperty(
"Content-Type"
,
"multipart/form-data; boundary="
+ boundary);
boundary =
"--"
+ boundary;
StringBuffer params =
new
StringBuffer();
if
(parameters !=
null
) {
for
(Iterator<String> iter = parameters.keySet().iterator(); iter
.hasNext();) {
String name = iter.next();
String value = parameters.get(name);
params.append(boundary +
"\r\n"
);
params.append(
"Content-Disposition: form-data; name=\""
+ name +
"\"\r\n\r\n"
);
params.append(value);
params.append(
"\r\n"
);
}
}
StringBuilder sb =
new
StringBuilder();
sb.append(boundary);
sb.append(
"\r\n"
);
sb.append(
"Content-Disposition: form-data; name=\""
+ fileParamName
+
"\"; filename=\""
+ filename +
"\"\r\n"
);
sb.append(
"Content-Type: "
+ contentType +
"\r\n\r\n"
);
byte
[] fileDiv = sb.toString().getBytes(
"UTF-8"
);
byte
[] endData = (
"\r\n"
+ boundary +
"--\r\n"
).getBytes(
"UTF-8"
);
byte
[] ps = params.toString().getBytes(
"UTF-8"
);
OutputStream os = urlConn.getOutputStream();
os.write(ps);
os.write(fileDiv);
os.write(data);
os.write(endData);
os.flush();
os.close();
}
catch
(Exception e) {
throw
new
RuntimeException(e.getMessage(), e);
}
return
urlConn;
}
private
static
byte
[] getBytes(HttpURLConnection urlConn) {
try
{
InputStream in = urlConn.getInputStream();
ByteArrayOutputStream os =
new
ByteArrayOutputStream();
byte
[] buf =
new
byte
[
1024
];
for
(
int
i =
0
; (i = in.read(buf)) >
0
;)
os.write(buf,
0
, i);
in.close();
return
os.toByteArray();
}
catch
(Exception e) {
throw
new
RuntimeException(e.getMessage(), e);
}
}
}
|
这只是简单的功能实现,后面可以用martini拓展,写一个简单的web语音识别服务,用android录音后发送POST请求,把语音数据发送到服务器处理识别,再返回json格式的识别结果。
本文转自 ponpon_ 51CTO博客,原文链接:http://blog.51cto.com/liuxp0827/1412977,如需转载请自行联系原作者