利用百度语音API进行语音识别。

由于项目需要,这几天都在试图利用百度语音API进行语音识别。但是识别到的都是“啊,哦”什么的,我就哭了。

这里我只是分享一下这个过程,错误感觉出现在Post语音数据那一块,可能是转换问题吧。

API请求地址::http://vop.baidu.com/server_api

语音上传模式:显示发送:将语音数据直接放在 HTTP-BODY 中

其他参数:cuid:用户id,token:密钥 ,lan:语言等
要了解更多请查看官方文档:http://developer.baidu.com/wiki/index.php?title=docs/cplat/media/voice

实现的步骤:1、录音,将文件存储起来     2、获取token     3、Post数据并请求获取返回值

1、录音

String fileName = "test.wav";
private MediaCapture _mediaCaptureManager;
private StorageFile _recordStorageFile;
private async void record_Click(object sender, RoutedEventArgs e)//点击后开始录音
{
  try
  {
    //在临时文件夹Temp中创建文件,存在的话就替换掉
    _recordStorageFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
     //关键就是这俩句
    MediaEncodingProfile recordProfile = MediaEncodingProfile.CreateWav(AudioEncodingQuality.Auto);//录音-WAV格式
     await _mediaCaptureManager.StartRecordToStorageFileAsync(recordProfile, this._recordStorageFile);//将录音保存到创建的文件中
  }
  catch (Exception ex)
  {
    Debug.WriteLine(ex.Message.ToString());
  }
}
private async void stop_Click(object sender, RoutedEventArgs e)
{
  await _mediaCaptureManager.StopRecordAsync();//停止录音
}

2、获取token

private void GetToken()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id="
                + "申请的API_KEY" + "&client_secret=" + “申请的SECRET_KEY”);
            request.BeginGetResponse(ResponseTokenCall, request);
        }

        private void ResponseTokenCall(IAsyncResult result)
        {
            try
            {
                HttpWebRequest httpWebRequest = (HttpWebRequest)result.AsyncState;
                WebResponse webResponse = httpWebRequest.EndGetResponse(result);
                using (Stream stream = webResponse.GetResponseStream())
                using (StreamReader reader = new StreamReader(stream))
                {
                    string content = reader.ReadToEnd();
                    string ssss = content.Replace("\"", "").Replace("{", "").Replace("}", "").Replace("\n", "");
                    string[] indexs = ssss.Split(‘,‘);
                    foreach (string index in indexs)
                    {
                        string[] _indexs = index.Split(‘:‘);
                        if (_indexs[0] == "access_token")
                            token = _indexs[1];//获取到的token
                    }
                }
            }

            catch (Exception ex)
            {
                Debug.WriteLine("获取Token失败");
            }
        }

3、发送请求

private async void Post()
        {
            string serverURL = "http://vop.baidu.com/server_api?";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serverURL + "lan=zh&cuid=" + cuid + "&token=" + token);//cuid = Guid.NewGuid().ToString();  官方推荐使用 mac 地址/手机 IMEI 等类似参数,只要唯一就好
            request.ContinueTimeout = 10000;//超时
            request.Method = "POST";//Post请求

            //post data
            request.BeginGetRequestStream(ResponseStreamCallbackPost, request);//Post数据
        }

        private async void ResponseStreamCallbackPost(IAsyncResult result)
        {
          StorageFile storageFile = await ApplicationData.Current.TemporaryFolder.GetFileAsync(fileName);//取出临时文件夹中保存的音频文件

            IBuffer buffer = await FileIO.ReadBufferAsync(storageFile);//读取文件至Ibuffer
          byte[] voice = WindowsRuntimeBufferExtensions.ToArray(buffer, 0, (int)buffer.Length);//将Ibuffer转换为byte[]
                     HttpWebRequest httpWebRequest = (HttpWebRequest)result.AsyncState;
            httpWebRequest.ContentType = "audio/wav;rate=8000";//参数设置
            using (Stream writeStream = httpWebRequest.EndGetRequestStream(result))
            {
                writeStream.Write(voice, 0, voice.Length);//写入
            }

            httpWebRequest.BeginGetResponse(ResponseCall, httpWebRequest);//发送请求
        }

        private void ResponseCall(IAsyncResult result)
        {
            try
            {
                HttpWebRequest httpWebRequest = (HttpWebRequest)result.AsyncState;
                WebResponse webResponse = httpWebRequest.EndGetResponse(result);
                using (Stream stream = webResponse.GetResponseStream())
                using (StreamReader reader = new StreamReader(stream))
                {
                    string content = reader.ReadToEnd();//返回的是utf-8编码
                    string a = Regex.Unescape(content);//进行转换
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine("识别失败");
            }
        }

token获取了一次,是说30天后会过期。
在处理过程中,遇到了一个问题。我让GetToken()和Post()先后进行处理,但是却发现token是在Post之后才得到的,这就导致了请求的URL里面不含token了。

所以还是要先获取了token之后再进行。

另外(HttpWebRequest)request无法给Content-length属性进行赋值。

时间: 2024-10-16 13:24:04

利用百度语音API进行语音识别。的相关文章

利用百度地图API,获取经纬度坐标

利用百度地图API,获取经纬度坐标 代码很简单,但在网上没找到现成的获取地图经纬度的页面. 就是想,给当前页面传递一个经纬度,自动定位到此经纬度.然后可以重新选择,选择完返回经纬度. 效果如下: 源代码下载:http://files.cnblogs.com/zjfree/select_map.rar 利用百度地图API,获取经纬度坐标,布布扣,bubuko.com

利用百度词典API和Volley网络库开发的android词典应用

 关于百度词典API的说明,地址在这里:百度词典API介绍 关于android网络库Volley的介绍说明,地址在这里:Android网络通信库Volley 首先我们看下大体的界面布局! 再帖张最终的效果图 看到效果图,应该知道布局很简单了对吧: 布局xml文件如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.a

利用百度地图API和群蚁算法,对TSP问题进行模拟与求解

前言 最近由于换了工作,期间也有反思和总结上家公司的得失,总觉得有什么事情当初可以完成或者完成得更好,其中TSP问题就是其中之一.当初在开发一个仓配系统的时候,有一个线路排程的需求,当时自己简单在纸上画了思路,发现求精确解算法复杂度是N!,所以去百度,发现了NPC问题的概念,但是一直以来都没有对这个问题好好研究过,最终只是选择了贪心算法这一求近似解的方案,正好这是我的第一篇博客,就拿这个“遗憾”开刀吧. 1.  利用百度地图API模拟TSP的各个城市点 1.1. 调用百度地图API解析经纬度 这

利用百度地图API获取当前位置信息

利用百度地图API可以做很多事情,个人感觉最核心也是最基础的就是定位功能了.这里分享一个制作的JS可以实现登录网页后定位: 1 <script type="text/javascript"> 2 var map; 3 var gpsPoint; 4 var baiduPoint; 5 var gpsAddress; 6 var baiduAddress; 7 var x; 8 var y; 9 function getLocation() { 10 //根据IP获取城市 1

HTML5 利用百度地图API获取当前位置

由于项目需要定位到城市,研究了地理定位,做了一些手记,和大家分享一下~ 项目的开发需求是获取到当前用户的位置,然后为用户提供一些服务. 此时可以采用两种定位方式,一种是用GPS的定位,然后将定位到的经纬度传递到百度地图的API接口当中.另一种方法是利用百度API接口,使用IP地址定位,然后使用IP地址获取到的经纬度,传递到百度地图API接口中. 自己尝试使用了这两种方式进行定位.相对来说,IP地址定位,偏差比较大.GPS定位虽然还可以,但是也不足够精确.产生比较大偏差的原因有可能是以下几点造成的

利用百度地图API,在浏览器中找到自己的位置

首先你得有个百度地图的秘钥,http://lbsyun.baidu.com/apiconsole/key 剩下的就是编码了 这里面会用到一个javascript里的一个函数,getMyLocation(),利用它我们就可以获得自己的经度纬度,然后再经过百度地图,将其显示出来. 上代码,首先是html文件中的代码,使用html5标准 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&q

PHP利用百度地图API进行IP定位和GPS定位

最近在做一个手机端的webapp地图应用,而核心内容当然是定位了,但是定位的话有几种方式,IP定位,GPS定位,基站定位(这个貌似webapp用不了), 那么剩下核心的gps定位和ip定位了,我们知道,html5有定位API,但是该API拿到的GPS数据是硬件坐标,无法直接显示在地图上. 后来上百度LBS云看到有地图IP定位API和GPS坐标转换API,地址:http://developer.baidu.com/map/ 百度地图API的调用需要申请KEY,这里就不具体介绍了,直接贴上本人写了两

利用百度翻译API,获取翻译结果

translate.py #!/usr/bin/python #-*- coding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding("utf8") import json #导入json模块 import urllib #导入urllib模块 from urllib2 import Request, urlopen, URLError, HTTPError #导入urllib2模块 def translate(input

利用百度地图API获取用户浏览器所在省市区

好久没用过h5新api地理定位--navigator.geolocation, 就在前几天,,, 发现,不能用了???(谷歌被墙了,陷入悲伤) 整个人都懵逼,项目需要定位啊,,,懵逼,,, 然后就写了三天,tm的写不出来,今天终于,,, 直接上代码咯. <!doctype html><html><head> <meta charset="utf-8"> <title>标题</title> <meta name