前端JS:

(function (window) {//兼容window.URL = window.URL || window.webkitURL;navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;var HZRecorder = function (stream, config) {config = config || {};//将对音频参数的采样率和采样精度直接写死为16config.sampleBits = config.sampleBits || 16;      //采样数位 8或16config.sampleRate = config.sampleRate || (16000);   //采样率var context = new (window.webkitAudioContext || window.AudioContext)();//console.log(context);var audioInput = context.createMediaStreamSource(stream);var createScript = context.createScriptProcessor || context.createJavaScriptNode;var recorder = createScript.apply(context, [4096, 1, 1]);var audioData = {size: 0          //录音文件长度, buffer: []     //录音缓存, inputSampleRate: context.sampleRate    //输入采样率, inputSampleBits: 16       //输入采样数位 8, 16, outputSampleRate: config.sampleRate    //输出采样率, oututSampleBits: config.sampleBits       //输出采样数位 8, 16, input: function (data) { this.buffer.push(new Float32Array(data)); this.size += data.length; }, compress: function () { //合并压缩 //合并 var data = new Float32Array(this.size); var offset = 0; for (var i = 0; i < this.buffer.length; i++) { data.set(this.buffer[i], offset); offset += this.buffer[i].length; } //压缩 var compression = parseInt(this.inputSampleRate / this.outputSampleRate); var length = data.length / compression; var result = new Float32Array(length); var index = 0, j = 0; while (index < length) { result[index] = data[j]; j += compression; index++; } return result; } , encodeWAV: function () { var sampleRate = Math.min(this.inputSampleRate, this.outputSampleRate); var sampleBits = Math.min(this.inputSampleBits, this.oututSampleBits); var bytes = this.compress(); var dataLength = bytes.length * (sampleBits / 8); //alert("dataLength"+dataLength) var buffer = new ArrayBuffer(44 + dataLength); var view = new DataView(buffer); var channelCount = 1;//单声道 var offset = 0; var writeString = function (str) { for (var i = 0; i < str.length; i++) { view.setUint8(offset + i, str.charCodeAt(i)); } } // 资源交换文件标识符 writeString('RIFF'); offset += 4; // 下个地址开始到文件尾总字节数,即文件大小-8 view.setUint32(offset, 36 + dataLength, true); offset += 4; // WAV文件标志 writeString('WAVE'); offset += 4; // 波形格式标志 writeString('fmt '); offset += 4; // 过滤字节,一般为 0x10 = 16 view.setUint32(offset, 16, true); offset += 4; // 格式类别 (PCM形式采样数据) view.setUint16(offset, 1, true); offset += 2; // 通道数 view.setUint16(offset, channelCount, true); offset += 2; // 采样率,每秒样本数,表示每个通道的播放速度 view.setUint32(offset, sampleRate, true); offset += 4; // 波形数据传输率 (每秒平均字节数) 单声道×每秒数据位数×每样本数据位/8 view.setUint32(offset, channelCount * sampleRate * (sampleBits / 8), true); offset += 4; // 快数据调整数 采样一次占用字节数 单声道×每样本的数据位数/8 view.setUint16(offset, channelCount * (sampleBits / 8), true); offset += 2; // 每样本数据位数 view.setUint16(offset, sampleBits, true); offset += 2; // 数据标识符 writeString('data'); offset += 4; // 采样数据总数,即数据总大小-44 view.setUint32(offset, dataLength, true); offset += 4; // 写入采样数据 if (sampleBits === 8) { for (var i = 0; i < bytes.length; i++, offset++) { var s = Math.max(-1, Math.min(1, bytes[i])); var val = s < 0 ? s * 0x8000 : s * 0x7FFF; val = parseInt(255 / (65535 / (val + 32768))); view.setInt8(offset, val, true); } } else { for (var i = 0; i < bytes.length; i++, offset += 2) { var s = Math.max(-1, Math.min(1, bytes[i])); view.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true); } } return new Blob([view], { type: 'audio/wav' }); } }; //开始录音 this.start = function () { audioInput.connect(recorder); recorder.connect(context.destination); //alert(1111); //alert(audioData.inputSampleRate); } //停止 this.stop = function () { recorder.disconnect(); } //获取音频文件 this.getBlob = function () { this.stop(); return audioData.encodeWAV(); } //回放 this.play = function (audio) { audio.src = window.URL.createObjectURL(this.getBlob()); } //上传 this.upload = function (url, callback) { var fd = new FormData(); fd.append("audioData", this.getBlob()); var xhr = new XMLHttpRequest(); if (callback) { xhr.upload.addEventListener("progress", function (e) { callback('uploading', e); }, false); xhr.addEventListener("load", function (e) { callback('ok', e); }, false); xhr.addEventListener("error", function (e) { callback('error', e); }, false); xhr.addEventListener("abort", function (e) { callback('cancel', e); }, false); } xhr.open("POST", url); xhr.send(fd); } //音频采集 recorder.onaudioprocess = function (e) { audioData.input(e.inputBuffer.getChannelData(0)); //record(e.inputBuffer.getChannelData(0)); } }; //抛出异常 HZRecorder.throwError = function (message) { alert(message); throw new function () { this.toString = function () { return message; } } } //是否支持录音 HZRecorder.canRecording = (navigator.getUserMedia != null); //获取录音机 HZRecorder.get = function (callback, config) { if (callback) { if (navigator.getUserMedia) { navigator.getUserMedia( { audio: true } //只启用音频 , function (stream) { var rec = new HZRecorder(stream, config); callback(rec); } , function (error) { switch (error.code || error.name) { case 'PERMISSION_DENIED': case 'PermissionDeniedError': HZRecorder.throwError('用户拒绝提供信息。'); break; case 'NOT_SUPPORTED_ERROR': case 'NotSupportedError': HZRecorder.throwError('浏览器不支持硬件设备。'); break; case 'MANDATORY_UNSATISFIED_ERROR': case 'MandatoryUnsatisfiedError': HZRecorder.throwError('无法发现指定的硬件设备。'); break; default: HZRecorder.throwError('无法打开麦克风。异常信息:' + (error.code || error.name)); break; } }); } else { HZRecorder.throwErr('当前浏览器不支持录音功能。'); return; } } } window.HZRecorder = HZRecorder; })(window);

html端:

<head><script src="js/HZRecorder.js"></script>
</head>
<button type="button" class="btn btn-primary" onclick="recognizeStart()">开始录制</button>
<button type="button" class="btn btn-primary btn-start-recognize" onclick="recognizeUpload()">开始识别</button><script>function recognizeStart () {that.$scope.start = false;HZRecorder.get(function (rec) {recorder = rec;recorder.start();});}function recognizeUpload () {recorder.stop();recorder.upload("http://192.168.1.156:8088/api/upload/listenFile", function (state, e) {switch (state) {case 'uploading':break;case 'ok':console.log("上传成功");// 打印后端传回的识别结果console.log(e.target.responseText);break;case 'error':alert("上传失败");break;case 'cancel':alert("上传被取消");break;}});}
</script>

科大讯飞语音听写-前端JS相关推荐

  1. android集成科大讯飞语音听写和语音合成

    android集成科大讯飞语音听写和语音合成 集成科大讯飞语音听写和语音合成,语音听写只是语音识别下面的一部分,别弄混淆了,由于科大讯飞暂未开放gradle引包方式,所以目前集成还是手动引包.我的流程 ...

  2. 接入科大讯飞语音听写,增加语音动画,类似京东语音搜索功能

    前言:小白第一次接入科大讯飞语音听写,接入还是比较简单的,先看效果图无UI界面 Demo地址拿去 效果图有两部分,一是接入科大讯飞语音听写功能,可以实现将语音转换成文字. 二是看到的语音音量动画效果, ...

  3. 集成科大讯飞语音听写功能

    一.准备工作 1.创建应用,并获取appId: 2.下载科大讯飞语音听写功能的jar包和so包(http://www.xfyun.cn/sdk/dispatcher): 3.将jar包添加到libs中 ...

  4. Android 科大讯飞 语音听写

    这几天在搞一个语音识别的项目 用到i的是科大讯飞的语音服务,第一次搞语音识别,在这里记录一下,也希望对大家有用.废话不多说进入正题 一.要用到科大讯飞的语音识别功能,肯定是要他的开发者平台申请账号,创 ...

  5. 科大讯飞语音听写app闪退

    运用科大讯飞的SDK写了一个语音听写的app,然后遇到了一个问题,弄过了好几天,终于解决了,运用Android Studio写的,问题如下: 解决方法: 在你用AS创建的项目中libs文件夹下,新建一 ...

  6. 909422229_科大讯飞语音听写Java web API接口

    技术交流群:958923746,有学习视频,文档等. 1. 接口说明 语音听写接口可将语音(≤60秒)转换成对应的文字信息.本接口适用于将音频一次性发送至云端,块式传输. 2. 接口地址 POST h ...

  7. python实现调用科大讯飞语音听写(将音频识别成文字输出)

    一.大致流程 1)申请科大讯飞账号(https://passport.xfyun.cn/register) 2)创建应用(应用平台选择WebAPI) 3)查看开发文档 4)根据开发文档和示例代码进行调 ...

  8. Android 集成科大讯飞语音听写功能

    在科大讯飞官方下载SDK 把相对应的jar的包和so文件引入项目中 还有对应的文件夹拷贝到项目中即可 废话不多少 直接上代码多用户聊天功能(听写) 主页面布局文件 <?xml version=& ...

  9. 科大讯飞语音听写 - Android

    因为工作需要,接入到语音转文字,公司选定使用科大讯飞的技术,所以开始了解,在此先把Demo跑起来,并记录下遇到过的坑. 进入讯飞开放平台 右上角注册并登录 进入控制台并创建应用 下载SDK 提示:每个 ...

最新文章

  1. Redis第二集:Linux下安装Redis和测试,包含命令代码和问题处理办法,超详细版
  2. RStudio快捷键
  3. Depth-first Search深度优先搜索专题6
  4. php怎么构造一个验证码,PHP封装一个生成验证码的函数
  5. Citrix为什么要兼容第三方服务器虚拟化平台
  6. 如何在IOS平台上使用js直接调用OC方法
  7. 2021-06-28
  8. 网站服务器mine类型设置,windows服务器如何配置MIME类型
  9. 大数据主要应用于哪些行业,应用价值是什么?
  10. 翁恺c语言程序设计入门期末,程序设计入门-C语言 翁恺.doc
  11. CMCT-FA修饰阿霉素纳米脂质体/ADR-HAS-MS单抗Hab18偶联阿霉素人血清白蛋白微球的制备方法
  12. 组网方案设计,运用Mesh组网实现无缝漫游!
  13. oppor15android10怎么降级,OPPOR15系统降级教程
  14. 订单查询系统c语言作业,C语言设计订单管理系统答题.doc
  15. MFC 画笔功能实现
  16. 美国AI初创企业CounterFlow AI获270万美元种子融资
  17. C语言字符串头文件string.h中的strlen,strcat,strcpy,strncpy,strcmp,strlwr,strupr函数
  18. Unity对接应用宝SDK(YSDK)
  19. 微信小程序开发之——调查问卷-编写表单页面(2.2.2)
  20. 计算机能换显卡吗,笔记本能换显卡么 笔记本电脑能否换显卡【详解】

热门文章

  1. 《系统工程手册》中提及的Expert Choice软件
  2. 无法打开文件“libboost_thread-vc120-mt-gd-1_58.lib的解决办法
  3. 软件测试计划书项目背景,软件测试项目计划书.doc
  4. windows下安装php相关
  5. 日用百货批发行业进销存规范实施要点
  6. 2018护网杯第一场 web easy tornado LTshop超详细解答
  7. 一分钟搞懂SMTP/POP/IMAP邮件服务
  8. 维吉尼亚密码原理图解
  9. Google发布Chrome 6
  10. Python案例1—人民币与美元的汇率兑换V_4.0