2018-12-25 15:22:00 weixin_30709635 阅读数 25
  • VUE开发旅游攻略移动端,零基础到实战,短信验证码,...

    【课程介绍】 课程目标:从零基础到学会实战开发vue项目 适用人群:会基础HTML,CSS,JS 接口后台:python 课程特色:提供项目接口,用python开发,提供短信验证码接口,接口和文档永久有效,学生的项目上线后可直接访问,可当做面试作品和大学生毕业设计  【课程收益】 1.从零基础掌握vue开发 2.掌握vue组件思维 3.了解什么是前后端分离开发 4.学会请求数据 5.学会vue高级功能使用 6.做出一个完整的上线项目 7.课程可当做大学生毕业设计 8.课程可当做面试作品

    858 人正在学习 去看看 耿职

百度云语音识别接口使用:


百度云语音识别接口文档:https://cloud.baidu.com/doc/SPEECH/ASR-API.html#JSON.E6.96.B9.E5.BC.8F.E4.B8.8A.E4.BC.A0

一. 解析用户语音输入,转换为字符串

  • 捕获用户的语音输入
    • windows安装
    1. pip3 install PyAudio   #如果报错可以尝试2,3步骤 丶 如果用pip3下载安装报错可以在python第三方安装包下载地址搜索下载安装https://pypi.org/ 
    2. python -m pip install --upgrade pip
    3. pip install PyAudio
    • CentOS 7.4 下安装PyAudio 需要先安装 portaudio (采用的方法,可行)

      1、在安装pyaudio时,报错failed error: portaudio.h: 没有那个文件或目录

      2、pyaudio的运行需要依赖于portaudio这个库,应该先安装一个portaudio库

      3、portaudio安装步骤:

        a)下载portaudio库http://portaudio.com/download.html

        b)将下载的文件进行解压

        c)进入解压后的portaudio文件,依次执行命令:

          ./configure

          make

          make install

        d)进入~/.bashrc文件:vim ~/.bashrc

          在文件最后一行加入  export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

          然后执行命令source ~/.bashrc

      4、到此portaudio库安装成功

      5、安装pyaudio库,pip3 install pyaudio (wget https://files.pythonhosted.org/packages/ab/42/b4f04721c5c5bfc196ce156b3c768998ef8c0ae3654ed29ea5020c749a6b/PyAudio-0.2.11.tar.gz)

       成功后显示版本为0.2.11

二,音频数据给到百度云

  • 音频数据的格式规则  
    • format:格式  wav
    • rate:采样率  16000
    • channel:声道  1单声道
    • cuid:用户ID  MAC地址,只要保证唯一
    • token:身份识别  在百度云接口平台注册后,才能拿到
    • dev_pid:  1536英文,1537中文
    • len:数据的长度 原始的  len(data) ->
    • speech:数据对象  
        1,base64 编码
        2,经常用于网络中的音频图像二进制的数据传输
        3,base64.b64encode(data)
  • **JSON**格式POST上传本地音频流数据
  • header:Content-Type:application/json
    • 标识,
    • GET:直接获取服务器上的数据
    • POST:客户端先向服务端提交数据,服务端在返回,POST一定会向服务器提交数据
  • RESTFUL:资源定义成了连接(url 同一资源,这个要了解一下)
    • 连接,www.baidu.com
    • POST提交数据,
    • WEB服务 HTTP协议
    • RESTFUL:ip/?shutdown   #关机命令

 

  • http://vop.baidu.com/server_api        #百度云api接口地址,我们的语音信息提交到这个接口就行了

 

三,捕获百度云返回的结果

  • JSON的返回    #无论什么方式上传都会以JSON格式返回结果
    • json.loads() 解析json数据变为Python中数据对象 字典
    • j'son.dumps() dict -> dict
  • result   #音频返回的结果在result字段中
四,接口使用:
  • PyAudio:对象,实例化一个设备
  • pa.open(format=存储位深 int 16位, channels=声道,rate=采样率,input=True,frame_per_buffer=1024)
五,注册登录百度云管理中心创建任务         ### https://console.bce.baidu.com/ai/?_=1545815700081#/ai/speech/app/create
 六,代码编写如下:
import time
from pyaudio import PyAudio,paInt16
from urllib.request import urlopen,Request    #专门处理http协议的模块
import json
import base64
def play_audio(data): #播放音频
	pa = PyAudio() #设备实例化
	equip = pa.open(
		format=paInt16,
		channels=1, #单声道
		rate=16000,
		output=True,
	) #打开设备,并且支持输出
	equip.write(data) #设备的write函数,写入音频数据
	equip.stop_stream() #关闭写入
	equip.close()
	pa.terminate() #关闭设备实例
def record_audio():  #输入音频
	pa = PyAudio() #设备实例化
	equip = pa.open(
		format=paInt16,
		channels=1,
		rate=16000,
		input=True,
		frames_per_buffer=1024,
	) #打开设备,并且支持输入
	data = [] #存储未来的语音输入
		#一截一截的语音数据  [b'1',b'2',]
	times = 0 #用来控制用户输入语音长度的
	start = time.time()
	while times < 50: #3S
		data.append(equip.read(1024)) #读取设备中此时的语音数据
		times += 1
	end = time.time()
	print('[TALK] %.2f' % (end - start)) #%.2f 保留2位小数点有效位数字
	data = b''.join(data) #完整的音频流数据
	equip.close()
	pa.terminate() #关闭设备实例
	return data
def baidu_token():
	API_Key = 'oAcBP47GDDpj6XIHWmcSkeRi'
	Secret_Key = 'ba2EKROswCy6KXzLdTpnGqPnPhHSFHU7'
	grant_type = 'client_credentials'
	url = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=%s&client_id=%s&client_secret=%s'
	response = json.loads(urlopen(url % (grant_type,API_Key,Secret_Key)).read().decode())
	access_token = response['access_token']
	return access_token
def baidu_fenxi(data):
	url = 'http://vop.baidu.com/server_api'
	data_len = len(data)
	audio_data = base64.b64encode(data).decode() 
	access_token = baidu_token()
	post_data = json.dumps({
	    "format":"wav",
	    "rate":16000,
        "dev_pid":1536,
        "channel":1,
        "token":access_token,
        "cuid":"00-50-56-C0-00-08",
        "len":data_len,
        "speech":audio_data,
    }).encode() #变为json的二进制
	headers = {'Content-Type':'application/json'}
	req = Request(url=url,headers=headers,data=post_data)
	result = json.loads(urlopen(req).read().decode()).get('result')
	if result:
		return result[0]
	else:
		return None
def main():
	data = record_audio()
	res = baidu_fenxi(data)
	print(res)
if __name__ == '__main__':
	#程序入口
	main()
运行结果:
E:\python学习资料\上课代码编写\代码练习py>python e:/python学习资料/上课代码编写/代码练习py/百度云.py
[TALK] 3.21
你好  
 
 
 
 

转载于:https://www.cnblogs.com/zhangan/p/10174167.html

2019-08-20 22:57:48 zhangyuandilove 阅读数 319
  • VUE开发旅游攻略移动端,零基础到实战,短信验证码,...

    【课程介绍】 课程目标:从零基础到学会实战开发vue项目 适用人群:会基础HTML,CSS,JS 接口后台:python 课程特色:提供项目接口,用python开发,提供短信验证码接口,接口和文档永久有效,学生的项目上线后可直接访问,可当做面试作品和大学生毕业设计  【课程收益】 1.从零基础掌握vue开发 2.掌握vue组件思维 3.了解什么是前后端分离开发 4.学会请求数据 5.学会vue高级功能使用 6.做出一个完整的上线项目 7.课程可当做大学生毕业设计 8.课程可当做面试作品

    858 人正在学习 去看看 耿职

百度语音权限token获取地址:https://openapi.baidu.com/oauth/2.0/token

百度语音识别接口地址:http://vop.baidu.com/server_api

按照官方Api指导,第一步获取token,采用post请求方式,js代码如下:

var token;
function getToken() {
	$.post("https://openapi.baidu.com/oauth/2.0/token", {
		grant_type: 'client_credentials',
		client_id: '个人应用的clientid',//需要替换
		client_secret: '对应应用的加密串'//需要替换
	}, function(result) {
		token = result.access_token;
	}, "json")
}

token获取后,先放一边,我们进行页面语音的录制并播放。

var mediaRecorder;
	var voiceMsg = $("#voice-rec");//按钮,按住说话,放开进行语音识别
		voiceMsg.on('touchstart', function(ev) {
			$(this).html('松开 结束');
			$(this).addClass("activeBtn");
			$('#voiceInputLoading').show();
			setTimeout(function() {
				mediaRecorder.stop();
			}, 10000)
			mediaRecorder.record({
				samplerate: "16000",
				format: "amr",
				filename: "_doc/audio/"
			}, function(e) {
				plus.io.resolveLocalFileSystemURL(e, function(entry) {
					entry.file(function(file) {
						let reader = null;
						let size = file.size;
						reader = new plus.io.FileReader();
						reader.onload = function(e) {};
						reader.readAsDataURL(file);
						reader.onloadend = function(e) {
							var urlStr = e.target.result;
                            //注意以下字符截取,关键部分
							urlArr = urlStr.split(",")[1];
							//调用百度API进行语音识别
							getVoice2Text(urlArr, size, function(msg) {
								console.log(msg);
							});
						}
					})
				});
			}, function(e) {
				alert("Audio record failed: " + e.message);
			});
		});
		voiceMsg.on('touchend', function(ev) {
			$(this).html('按下 说话');
			$(this).removeClass("activeBtn");
			$('#voiceInputLoading').hide();
			mediaRecorder.stop();
		});

以上代码中getVoice2Text这个方法就是调用百度语音识别Api

function getVoice2Text(base64, urlSize,callback) {
	$.ajax({
		type: "post",
		url: "http://vop.baidu.com/server_api",
		async: true,
		contentType: "application/json",
		processData: false,
		data: JSON.stringify({
			"format": "amr", 
			"rate": 16000, 
			"dev_pid": 1536, 
			"channel": 1, 
			"cuid": "862245234377502,862989243244150", //设备的唯一id
			"speech": base64, 
			"len": urlSize, 
			"token": token//第一步获取到的token
		}),
		success: function(data) {
			console.log(data.result[0]);
			callback(data.result[0]);
		}
	});

}

这里需要注意一下的地方就是以下两点:

1:音频采用的是plus.audio提供的api;

2:音频文件转换采用的是plus.io提供的api

感兴趣的朋友可以参考:http://www.html5plus.org/doc/zh_cn/webview.html

2019-02-27 10:24:37 zz_hh_uu_ 阅读数 1228
  • VUE开发旅游攻略移动端,零基础到实战,短信验证码,...

    【课程介绍】 课程目标:从零基础到学会实战开发vue项目 适用人群:会基础HTML,CSS,JS 接口后台:python 课程特色:提供项目接口,用python开发,提供短信验证码接口,接口和文档永久有效,学生的项目上线后可直接访问,可当做面试作品和大学生毕业设计  【课程收益】 1.从零基础掌握vue开发 2.掌握vue组件思维 3.了解什么是前后端分离开发 4.学会请求数据 5.学会vue高级功能使用 6.做出一个完整的上线项目 7.课程可当做大学生毕业设计 8.课程可当做面试作品

    858 人正在学习 去看看 耿职
  1. 首先在腾讯ai开放平台注册,依次找到技术引擎->语音识别,选择语音识别一栏,在技术文档里左侧的新手指南下载python版本的SDK.同时在免费试用的接入能力中,创建应用,并得到app_key和app_id,修改test_aai_wxasrs.py
#-*- coding: UTF-8 -*-
import sys
import os
import optparse
import time
import apiutil
import base64
import json
import hashlib
import time
import glob
import codecs

app_key = ''#填入申请的app_key
app_id = '‘#填入申请的app_id

if __name__ == '__main__':
    wav_files = glob.glob(u'''./tools/TX_aiplat/audio/*.wav''')
    count = 1
    for wav_file in wav_files:
        if not os.path.exists(wav_file[:-3] + "trn"):
            seq = 0
            for_mat = 2
            rate = 16000
            bits = 16
            cont_res = 1                
            file_path = wav_file
            f = open(file_path, 'r')
            md5obj = hashlib.md5()  
            md5obj.update(f.read())  
            hash = md5obj.hexdigest()  
            speech_id = str(hash).upper() 
            f.close()
            f = open(file_path, 'rb')
            file_size = os.path.getsize(file_path)
            try:
                    chunk = f.read()
                    if not chunk:
                        pass
                        #break
                    else:
                        chunk_size = len(chunk)
                        if (seq + chunk_size) == file_size:
                            end = 1
                        else:
                            end = 0
                    ai_obj = apiutil.AiPlat(app_id, app_key)
                    print '----------------------SEND REQ----------------------'
                    rsp = ai_obj.getAaiWxAsrs(chunk, speech_id, end, for_mat, rate, bits, seq, chunk_size, cont_res)
                    seq += chunk_size
                    print rsp
                    if rsp['ret'] == 0:
                        results = json.dumps(rsp, encoding="UTF-8", ensure_ascii=False, sort_keys=False, indent=4)
                        results =  json.loads(results)
                        if results['data']['speech_text'] != u'':
                            print wav_file
                            trn_file = wav_file[:-3] + "trn"
                            with codecs.open(trn_file,'w','utf-8') as wp:
                                wp.write(results['data']['speech_text'])
                                count = count + 1
                            print u'''处理第%d个音频:%s''' %(count,wav_file)
                            print '----------------------API SUCC----------------------'
                            #time.sleep(1)
                        else:
                            os.remove(wav_file)
                    else:
                        print json.dumps(rsp, encoding="UTF-8", ensure_ascii=False, sort_keys=False, indent=4)
                        print '----------------------API FAIL----------------------'
            except:
                f.close()
                continue
2018-08-22 17:24:55 yuanlulu 阅读数 8886
  • VUE开发旅游攻略移动端,零基础到实战,短信验证码,...

    【课程介绍】 课程目标:从零基础到学会实战开发vue项目 适用人群:会基础HTML,CSS,JS 接口后台:python 课程特色:提供项目接口,用python开发,提供短信验证码接口,接口和文档永久有效,学生的项目上线后可直接访问,可当做面试作品和大学生毕业设计  【课程收益】 1.从零基础掌握vue开发 2.掌握vue组件思维 3.了解什么是前后端分离开发 4.学会请求数据 5.学会vue高级功能使用 6.做出一个完整的上线项目 7.课程可当做大学生毕业设计 8.课程可当做面试作品

    858 人正在学习 去看看 耿职

概述

目前市场上有很多家的语音识别接口可用,简单测试都不要钱。国内的BAT和科大讯飞,国外的微软和谷歌都提供了中文的语音识别接口,既有sdk又有webAPI。我的测试都是在python3环境下进行的。

最终选择百度和科大讯飞的接口。主要是考虑中文识别应该国内厂商做的更好。

免费试用阶段,科大讯飞每天限定500次调用。百度则只限制每秒20次,总次数没限制。

试用下来的感觉就是,科大讯飞的接口更快,断句什么的也更好。但是试用次数少是个问题,只能评估玩玩。

科大讯飞语音识别webAPI

使用之前需要先去https://xfyun.cn注册并创建应用。获得APPID和APPkey.

官方的webAPI接口文档在:https://doc.xfyun.cn/rest_api/%E8%AF%AD%E9%9F%B3%E5%90%AC%E5%86%99.html

代码是官网上的,但是那是个python2上的,我改成python3版本了(python3对于参数的编码格式更严格)。

注意:将脚本中 AUDIO_PATH, API_KEY, APPID, 换成相应的音频路径,讯飞开放平台提供的 apiKey,讯飞开放平台应用的 appid 即可。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib.request
import time
import urllib
import json
import hashlib
import base64
from urllib import parse

def main():
    f = open("AUDIO_PATH", 'rb')
    file_content = f.read()
    base64_audio = base64.b64encode(file_content)
    body = parse.urlencode({'audio': base64_audio})

    url = 'http://api.xfyun.cn/v1/service/v1/iat'
    api_key = 'API_KEY'
    param = {"engine_type":"sms16k","aue":"raw"}

    x_appid = 'APPID'
    json_str = json.dumps(param).replace(' ', '')
    print('json_str:{}'.format(json_str))
    x_param = base64.b64encode(bytes(json_str, 'ascii'))
    x_time = int(int(round(time.time() * 1000)) / 1000)
    x_checksum_str = api_key + str( x_time ) + str(x_param)[2:-1]
    print('x_checksum_str:[{}]'.format(x_checksum_str))
    x_checksum = hashlib.md5(x_checksum_str.encode(encoding='ascii')).hexdigest()
    print('x_checksum:{}'.format(x_checksum))
    x_header = {'X-Appid': x_appid,
                'X-CurTime': x_time,
                'X-Param': x_param,
                'X-CheckSum': x_checksum}

    start_time = time.time()
    req = urllib.request.Request(url, bytes(body, 'ascii'), x_header)
    result = urllib.request.urlopen(req)
    result = result.read()
    print( "used time: {}s".format( round( time.time() - start_time, 2 ) ) )
    print('result:'+str(result.decode(encoding='UTF8')))
    return

if __name__ == '__main__':
    main() 

我的一个测试输出:

json_str:{"engine_type":"sms16k","aue":"raw"}

used time: 0.82s
result:{"code":"0","data":"特别是跨省区电网超计划用电,不仅损害自己,也损害别人,损害电网,损害国家。","desc":"success","sid":"zat006392f7@ch6b010ed8627f3d3700"}

一个注意点

如果没有把ip放到白名单中,就会返回以下错误信息,错误码是10105

al access|illegal client_ip:xxxxx

在‘控制台->我的应用’里把信息里的IP加上就行。

百度语音识别webAPI

需要先在百度云上注册:https://cloud.baidu.com/

然后在管理控制台上创建一个语音识别应用,你会得到AppId\AppKey\SecretKey等信息,这些需要在调用接口的时候用到。

百度的python接口用起来比较简单,先pip install baidu-aip即可。
具体文档参考:https://cloud.baidu.com/doc/SPEECH/ASR-Online-Python-SDK.html#.E9.85.8D.E7.BD.AEAipSpeech

参考官方例子,我的代码如下(注意替换自己的APP_ID、API_KEY、SECRET_KEY):

from aip import AipSpeech
import time

APP_ID = 'APP_ID'
API_KEY = 'API_KEY'
SECRET_KEY = 'SECRET_KEY'

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

# 识别本地文件
start_time = time.time()
ret = client.asr(get_file_content('./aideo_files/A2_58.wav'), 'pcm', 16000, {
    'dev_pid': 1537,
})
used_time = time.time() - start_time

print( "used time: {}s".format( round( time.time() - start_time, 2 ) ) )
print('ret:{}'.format(ret))

我测试的输出结果为:

used time: 8.18s
ret:{'corpus_no': '6592465378279780417', 'err_msg': 'success.', 'err_no': 0, 'result':
['特别是跨省区电网超计划用电,不仅损害自己也损害别人损害电网损害国家,'], 'sn': '148955205071534927957'}

时间上比科大讯飞长了好几倍,断句也不是很好。胜在试用次数基本不限。

小结

比较 优点 缺点
百度 试用次数多 速度慢,断句不太好
科大讯飞 速度快,断句好 试用次数有限

今天测试比较简单,等后面大规模测试了再来补充。

2016-12-16 22:16:31 qq_36846705 阅读数 1155
  • VUE开发旅游攻略移动端,零基础到实战,短信验证码,...

    【课程介绍】 课程目标:从零基础到学会实战开发vue项目 适用人群:会基础HTML,CSS,JS 接口后台:python 课程特色:提供项目接口,用python开发,提供短信验证码接口,接口和文档永久有效,学生的项目上线后可直接访问,可当做面试作品和大学生毕业设计  【课程收益】 1.从零基础掌握vue开发 2.掌握vue组件思维 3.了解什么是前后端分离开发 4.学会请求数据 5.学会vue高级功能使用 6.做出一个完整的上线项目 7.课程可当做大学生毕业设计 8.课程可当做面试作品

    858 人正在学习 去看看 耿职

准备工作

1.首先要在科大讯飞开放平台(http://www.xfyun.cn/)上注册;
2.右上角进入控制台,按照说明创建一个应用,该应用名就叫HITOSLabTest(与android studio的项目名一致),创建成功后会有一个AppID,记下来,编程的时候要用到;
3.点击HITOSLabTest后面的“开通服务”按钮,开通服务—>语音听写,进入语音听写—>下载当前应用对应的SDK;
4.下载Android版的SDK,将SDK包中libs目录所有文件复制到Android工程的libs目录中,把SDK包中assets目录下的iflytek文件夹复制到工程的assets目录下,如下图所示。
包
5.一般libs下还缺少一个gson的jar文件,需要自行下载;

代码实现

1.activity_main.xml,app界面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/listen_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开始说话" />

    <TextView
        android:id="@+id/task_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:text="日程安排:" />

    <EditText
        android:id="@+id/content_et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:drawable/editbox_dropdown_light_frame"
        android:cursorVisible="true"
        android:enabled="true"
        android:gravity="top"
        android:visibility="visible" />

</LinearLayout>

界面

2.MainActivity

package com.example.administrator.hitoslabtest;

import java.lang.reflect.Type;
import java.util.List;

//import com.example.speechrecognition.DictationResult;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.iflytek.cloud.RecognizerListener;
import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechRecognizer;
import com.iflytek.cloud.SpeechUtility;
import com.iflytek.cloud.ui.RecognizerDialog;
import com.iflytek.cloud.ui.RecognizerDialogListener;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {
    private static String APPID = "584a6981";

    private Button listenBtn;
    private EditText contentEt;

    // 听写结果字符串(多个Json的列表字符串)
    private String dictationResultStr = "[";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listenBtn = (Button) findViewById(R.id.listen_btn);
        contentEt = (EditText) findViewById(R.id.content_et);

        listenBtn.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.listen_btn:

                dictationResultStr = "[";
                // 语音配置对象初始化
                SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID
                        + "=" + APPID);

                // 1.创建SpeechRecognizer对象,第2个参数:本地听写时传InitListener
                SpeechRecognizer mIat = SpeechRecognizer.createRecognizer(
                        MainActivity.this, null);
                // 交互动画
                RecognizerDialog iatDialog = new RecognizerDialog(
                        MainActivity.this, null);
                // 2.设置听写参数,详见《科大讯飞MSC API手册(Android)》SpeechConstant类
                mIat.setParameter(SpeechConstant.DOMAIN, "iat"); // domain:域名
                mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
                mIat.setParameter(SpeechConstant.ACCENT, "mandarin"); // mandarin:普通话

                //3.开始听写
                iatDialog.setListener(new RecognizerDialogListener() {

                    @Override
                    public void onResult(RecognizerResult results, boolean isLast) {
                        // TODO 自动生成的方法存根
                        // Log.d("Result", results.getResultString());
                        // contentTv.setText(results.getResultString());
                        if (!isLast) {
                            dictationResultStr += results.getResultString() + ",";
                        } else {
                            dictationResultStr += results.getResultString() + "]";
                        }
                        if (isLast) {
                            // 解析Json列表字符串
                            Gson gson = new Gson();
                            List<DictationResult> dictationResultList = gson
                                    .fromJson(dictationResultStr,
                                            new TypeToken<List<DictationResult>>() {
                                            }.getType());
                            String finalResult = "";
                            for (int i = 0; i < dictationResultList.size() - 1; i++) {
                                finalResult += dictationResultList.get(i)
                                        .toString();
                            }
                            contentEt.setText(finalResult);

                            //获取焦点
                            contentEt.requestFocus();

                            //将光标定位到文字最后,以便修改
                            contentEt.setSelection(finalResult.length());

                            Log.d("From reall phone", finalResult);
                        }
                    }

                    @Override
                    public void onError(SpeechError error) {
                        // TODO 自动生成的方法存根
                        error.getPlainDescription(true);
                    }
                });

                // 开始听写
                iatDialog.show();

                break;
            default:
                break;
        }
    }
}

3.com.example.administrator.hitoslabtest.DictationResult文件

package com.example.administrator.hitoslabtest;
import java.util.List;

/**
 * 解析语音听写返回结果Json格式字符串的模板类(多重嵌套Json)
 *
 * 语音识别结果Json数据格式(单条数据):
 * {"sn":1,"ls":true,"bg":0,"ed":0,"ws":[{"bg":0,"cw":[{"w":"今天","sc":0}]},
 * {"bg":0,"cw":{"w":"的","sc":0}]},{"bg":0,"cw":[{"w":"天气","sc":0}]},
 * {"bg":0,"cw":[{"w":"怎么样","sc":0}]},{"bg":0,"cw":[{"w":"。","sc":0}]}]}
 */
public class DictationResult {
    private String sn;
    private String ls;
    private String bg;
    private String ed;

    private List<Words> ws;

    public static class Words {
        private String bg;
        private List<Cw> cw;

        public static class Cw {
            private String w;
            private String sc;

            public String getW() {
                return w;
            }

            public void setW(String w) {
                this.w = w;
            }

            public String getSc() {
                return sc;
            }

            public void setSc(String sc) {
                this.sc = sc;
            }

            @Override
            public String toString() {
                return w;
            }
        }

        public String getBg() {
            return bg;
        }

        public void setBg(String bg) {
            this.bg = bg;
        }

        public List<Cw> getCw() {
            return cw;
        }

        public void setCw(List<Cw> cw) {
            this.cw = cw;
        }

        @Override
        public String toString() {
            String result = "";
            for (Cw cwTmp : cw) {
                result += cwTmp.toString();
            }
            return result;
        }
    }

    public String getSn() {
        return sn;
    }

    public void setSn(String sn) {
        this.sn = sn;
    }

    public String getLs() {
        return ls;
    }

    public void setLs(String ls) {
        this.ls = ls;
    }

    public String getBg() {
        return bg;
    }

    public void setBg(String bg) {
        this.bg = bg;
    }

    public String getEd() {
        return ed;
    }

    public void setEd(String ed) {
        this.ed = ed;
    }

    public List<Words> getWs() {
        return ws;
    }

    public void setWs(List<Words> ws) {
        this.ws = ws;
    }

    @Override
    public String toString() {
        String result = "";
        for (Words wsTmp : ws) {
            result += wsTmp.toString();
        }
        return result;
    }

4.AndroidManifest.xml中申请权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.administrator.hitoslabtest">
    <!-- 连接网络权限,用于执行云端语音能力 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <!-- 获取手机录音机使用权限,听写、识别、语义理解需要用到此权限  -->
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <!--读取网络信息状态 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <!--获取当前wifi状态 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <!--允许程序改变网络连接状态 -->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <!--读取手机信息权限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <!--读取联系人权限,上传联系人需要用到此权限 -->
    <uses-permission android:name="android.permission.READ_CONTACTS"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

5.添加jnilibs

添加
修改Gradle Scripts 中的build.gradle(Module:app)文件,如上图
具体修改:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.1"
    defaultConfig {
        applicationId "com.example.administrator.hitoslabtest"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.0.1'
    testCompile 'junit:junit:4.12'
}
没有更多推荐了,返回首页