首先看下服务器端,服务器端使用martini框架,仅建立一个简单的接收客户端post请求并保存客户端传过来的语音的后台服务:
原文地址:http://liuxp0827.blog.51cto.com/5013343/1412977
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头信息,最终发送数据:
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格式的识别结果。