提问!!!请教!!!

准大三学生,最近在做一个小网站应用,一个智能小机器人,想法是:暂时部署在网页上,用户对其进行语音输入,调用百度语音SDK进行识别语音转化为中文,再在后台进行相应的回复。

目前进行到语音输入方面,百度SDK已经成功调用,但是这个得识别已录制得音频文件,也就是说得先把文件保存下来,才能对其进行识别,问题就卡在这里,通过CSDN来的代码,我不知道怎样将音频文件存到本地,请教各位大神!!!

HTML部分

<!DOCTYPE html>
<html xmlns='http://www.w3.org/1999/xhtml'>
<head><meta http-equiv='Content-Type' content='text/html; charset=utf-8' /><title></title>
</head>
<body><div><audio controls autoplay></audio><input onclick='startRecording()' type='button' value='录音' /><input onclick='stopRecording()' type='button' value='停止' /><input onclick='playRecording()' type='button' value='播放' /><input onclick='uploadAudio()' type='button' value='提交' /></div><script type='text/javascript' src='HZRecorder.js'></script><script>var recorder;var audio = document.querySelector('audio');function startRecording() {HZRecorder.get(function (rec) {recorder = rec;recorder.start();});}function stopRecording() {recorder.stop();}function playRecording() {recorder.play(audio);}function uploadAudio() {recorder.upload('Handler1.ashx', function (state, e) {switch (state) {case 'uploading'://var percentComplete = Math.round(e.loaded * 100 / e.total) + '%';break;case 'ok'://alert(e.target.responseText);alert('上传成功');break;case 'error':alert('上传失败');break;case 'cancel':alert('上传被取消');break;}});}</script></body>
</html>

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 || {};config.sampleBits = config.sampleBits || 16;      //采样数位 8, 16config.sampleRate = config.sampleRate || (16000);   //采样率(1/6 44100)var context = new AudioContext();var audioInput = context.createMediaStreamSource(stream);var recorder = context.createScriptProcessor(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);var buffer = new ArrayBuffer(44 + dataLength);var data = new DataView(buffer);var channelCount = 1;//单声道var offset = 0;var writeString = function (str) {for (var i = 0; i < str.length; i++) {data.setUint8(offset + i, str.charCodeAt(i));}}// 资源交换文件标识符 writeString('RIFF'); offset += 4;// 下个地址开始到文件尾总字节数,即文件大小-8 data.setUint32(offset, 36 + dataLength, true); offset += 4;// WAV文件标志writeString('WAVE'); offset += 4;// 波形格式标志 writeString('fmt '); offset += 4;// 过滤字节,一般为 0x10 = 16 data.setUint32(offset, 16, true); offset += 4;// 格式类别 (PCM形式采样数据) data.setUint16(offset, 1, true); offset += 2;// 通道数 data.setUint16(offset, channelCount, true); offset += 2;// 采样率,每秒样本数,表示每个通道的播放速度 data.setUint32(offset, sampleRate, true); offset += 4;// 波形数据传输率 (每秒平均字节数) 单声道×每秒数据位数×每样本数据位/8 data.setUint32(offset, channelCount * sampleRate * (sampleBits / 8), true); offset += 4;// 快数据调整数 采样一次占用字节数 单声道×每样本的数据位数/8 data.setUint16(offset, channelCount * (sampleBits / 8), true); offset += 2;// 每样本数据位数 data.setUint16(offset, sampleBits, true); offset += 2;// 数据标识符 writeString('data'); offset += 4;// 采样数据总数,即数据总大小-44 data.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)));data.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]));data.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);}}return new Blob([data], { type: 'audio/wav' });}};//开始录音this.start = function () {audioInput.connect(recorder);recorder.connect(context.destination);}//停止this.stop = function () {recorder.disconnect();}//获取音频文件this.getBlob = function () {this.stop();return audioData.encodeWAV();}//回放this.play = function (audio) {audio.src = window.URL.createObjectURL(this.getBlob());print(audio/wav);}//上传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('<a href="http://www.it165.net/edu/ewl/" target="_blank" class="keylink">浏览器</a>不支持硬件设备。');break;case 'MANDATORY_UNSATISFIED_ERROR':case 'MandatoryUnsatisfiedError':HZRecorder.throwError('无法发现指定的硬件设备。');break;default:HZRecorder.throwError('无法打开麦克风。异常信息:' + (error.code || error.name));break;}});} else {HZRecorder.throwErr('当前<a href="http://www.it165.net/edu/ewl/" target="_blank" class="keylink">浏览器</a>不支持录音功能。'); return;}}}window.HZRecorder = HZRecorder;})(window);

提问!!!请教大神啊相关推荐

  1. python 保存本地乱码_请教大神,如何解决保存后的文件的乱码问题

    马上注册,结交更多好友,享用更多功能^_^ 您需要 登录 才可以下载或查看,没有帐号?立即注册 x #!/usr/local/bin/python #-*-coding:utf-8-*- #Get m ...

  2. Android 开发问题请教----大神救我

    请教各位大神,给APP更换外壳,最后生成APK的时候出现了这种错误,目测是导入的文件缺失. 想问一下这种问题出现的真实原因和解决方法,如果能详细的话最好不过,粗略的也可以. 谢谢谢谢谢谢!!!! pa ...

  3. 怎么取消苹果手机自动续费_请教大神们…苹果ID如何取消爱奇艺的自动续费?...

    前年在买什么会员(忘了,不是京东就是淘宝)时候赠送了爱奇艺会员(放长线钓大鱼),去年到期后也没有注意久远的事情了,结果爱奇艺来了个自动续费.218大洋啊,心痛!关键是买了爱奇艺基本上没怎么看过,主要的 ...

  4. 【已解决】【Appium】请教大神,Appium配置正常,但是运行脚本异常停止,提示[UiAutomator] Moving to state 'stopped'

    转自:https://www.cnblogs.com/shihenghui/p/7543441.html PS:感谢原博主,帮了大忙了 [已解决] Appium默认的UiAutomator支持API ...

  5. android listview动态添加viewpager,请教大神,android如何在viewpager里添加listview,谢谢啦...

    满意答案 wenadkdxg2 2015.05.06 采纳率:55%    等级:9 已帮助:411人 先说ViewPager,ViewPager是google官方提供的一个兼容低版本android设 ...

  6. hppt post请求 请教大神解脱

    问题:我想用 tcp协议 发送post数据(请求如下)到服务器自己定义的简单接收接口中,发现无法传如数组 请教 POST /devices/23854678/datapoints HTTP/1.1 a ...

  7. linux7挂载ntfs分区,刚安装centos7,请教大神如何挂载ntfs的分区

    liangbenrang 于 2015-12-22 17:39:08发表: 2.关于AS服务器Redhat5.6 CPU性能低问题,建议做如下调整: 关于AS服务器Redhat5.6 CPU性能低问题 ...

  8. nodejs ld linux.so,请教大神,如何在独立虚拟主机上配置node.js开发环境?

    安装一下NodeJs就好啦. Windows系统很简单,直接下载运行安装包.linux复杂一点. 下面给出linux二进制文件安装方法. 首先到这里下载安装文件https://nodejs.org/z ...

  9. java在文本框中输出数据_请教大神,程序结果怎么打印到JTextArea()的文本域里

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.awt.*; import javax.swing.*; import java.awt.event.*; import java ...

最新文章

  1. WebPart(汇总)[转载]
  2. 关于photoswiper展示时图片自适应的问题
  3. Qt工作笔记-MySQL获取select表头(域)数据
  4. 【Java】从键盘中任意输入一个字符,判断该字符的类别
  5. SpringBoot之Listener注册到Spring容器中的多种方法
  6. MDM之Goodness分析报告
  7. 由数据库对sql的执行说JDBC的Statement和PreparedStatement
  8. 局域网怎么查看单位摄像头_一行代码,实现多平台文件查看传输!
  9. vue前端项目中excel文件下载
  10. Tomcat原理剖析及性能调优
  11. 反射中的SetValue和GetValue
  12. excel 置信区间 计算_正态分布置信区间Excel计算公式.ppt
  13. 凑数算法 c语言,算法题解 - 牛客编程巅峰赛S1第4场 - 黄金钻石组
  14. 64卦加密解密(娱乐用)
  15. MySQL连接速度太慢_mysql-连接速度非常慢(1秒)
  16. html中的author属性,meta标签name=“auther”属性写法和用法详解
  17. 迷宫生成与路径规划算法-Python3.8-附Github代码
  18. 华为路由器旁挂引流实验(使用流策略)
  19. MAC系统免驱显卡汇总
  20. 主流短视频SDK调研对比报告

热门文章

  1. 前药靶向穿孔素抑制剂脑实质可减轻氧化应激和神经炎症,提高细胞存活率
  2. iOS基于SceneKit的3D汽车改色
  3. 先进半导体材料与器件Chapter1
  4. 嵌入式里的中断解读以及中断服务函数
  5. java 秒转换日期_Java 将日期或秒数转换为日时分秒
  6. Authing 客户故事|仙工智能
  7. 基于改进的 IEEE24 节点电力系统和比利时 20 节点天然气系统通过电转气和燃气轮机耦合
  8. 《LeetCode》—— 摆动序列
  9. 微信公众号开发之(28)校园图书馆
  10. vue+element-ui中button点击后不恢复原样