精华内容
下载资源
问答
  • 微信小程序实现语音识别

    万次阅读 2019-02-15 12:14:12
    小程序实现语音识别功能,通过语音的方式代替手动输入查询。经过查询微信小程序api,发现微信并没有对外提供语音识别的api,所以要另外想办法。经过多发查找资料发现了思路。 解决思路: 微信小程序提供了录音的...

    小程序实现语音识别功能,通过语音的方式代替手动输入查询。经过查询微信小程序api,发现微信并没有对外提供语音识别的api,所以要另外想办法。经过多发查找资料发现了思路。

    解决思路:

    微信小程序提供了录音的功能,通过录音的方式,然后把录音文件传到服务器,后台服务器将语音转码,然后再调用第三方语音识别api,我这里使用的是百度的api,最后在将识别的文字返回给微信小程序。

    直接上代码:

    小程序端代码:

    startRecord: function() {

    if (this.recorderManager == null) {

    this.recorderManager = wx.getRecorderManager();

    this.options = {

    duration: 10000,

    sampleRate: 16000,

    numberOfChannels: 1,

    encodeBitRate: 64000,

    format: 'mp3',

    frameSize: 50

    }

    }

    this.recorderManager.start(this.options);

    this.recorderManager.onStop((res) => {

    console.log(res)

    wx.uploadFile({

    url: 'https://xxxx',//将录音文件传到后台服务器

    filePath: res.tempFilePath,

    method:'POST',

    name: 'file',

    header: {

    'content-type': 'multipart/form-data'

    },

    success: function(res) {

    console.log(res);

    },

    fail: function() {

    console.log("语音识别失败");

    }

    })

    });

    },

    stopRecord: function() {

    this.recorderManager.stop()

    }

     

    服务端代码:

    注意:需要使用mp3plugin.jar包,网上可以下载到。

        // 百度语音识别
        public static final String APP_ID = "xxx";
        public static final String API_KEY = "xxx";
        public static final String SECRET_KEY = "xxx";

        /**
         * @Description TODO
         * @return
         */
        @RequestMapping(value = "speechRecognition", method = RequestMethod.POST)
        @ResponseBody
        public Object speechReco(HttpServletRequest request) {
            MultipartFile file = ((MultipartHttpServletRequest) request).getFile("file");
            try {
                byte[] pcmBytes = mp3Convertpcm(file.getInputStream());
                org.json.JSONObject resultJson = speechBdApi(pcmBytes);
                System.out.println(resultJson.toString());
                if (null != resultJson && resultJson.getInt("err_no") == 0) {
                    return resultJson.getJSONArray("result").get(0).toString().split(",")[0];
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            return "";
        }

        /**
         * @Description MP3转换pcm
         * @param mp3Stream
         *            原始文件流
         * @return 转换后的二进制
         * @throws Exception
         */
        public byte[] mp3Convertpcm(InputStream mp3Stream) throws Exception {
            // 原MP3文件转AudioInputStream
            BufferedInputStream zipTest=new BufferedInputStream(mp3Stream);
            //重新包装一层,不然会报错。
            AudioInputStream mp3audioStream = AudioSystem.getAudioInputStream(zipTest);
            // 将AudioInputStream MP3文件 转换为PCM AudioInputStream
            AudioInputStream pcmaudioStream = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED,
                    mp3audioStream);
            byte[] pcmBytes = IOUtils.toByteArray(pcmaudioStream);
            pcmaudioStream.close();
            mp3audioStream.close();
            return pcmBytes;
        }

        /**
         * @Description 调用百度语音识别API
         * @param pcmBytes
         * @return
         */
        public static org.json.JSONObject speechBdApi(byte[] pcmBytes) {
            // 初始化一个AipSpeech
            AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);
            // 可选:设置网络连接参数
            client.setConnectionTimeoutInMillis(2000);
            client.setSocketTimeoutInMillis(60000);
            // 调用接口
            org.json.JSONObject res = client.asr(pcmBytes, "pcm", 16000, null);
            return res;
        }

     

    如果我的文章帮助到了大家,减少大家的弯路,愿意打赏的请扫下面的二维码。也可留言。

     

    展开全文
  • 主要介绍了小程序实现语音识别转文字功能,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • 微信小程序实现语音识别功能

    千次阅读 2020-10-27 18:33:06
    原标题:微信小程序实现语音识别功能使用小程序实现语音识别功能,由于语音识别可以直接使用各厂家的API接口,并且小程序为腾讯所有,因此考虑到可能的低延时,采用了腾讯提供的免费API接口,准确讲是腾讯语音的“一...

    原标题:微信小程序实现语音识别功能

    使用小程序实现语音识别功能,由于语音识别可以直接使用各厂家的API接口,并且小程序为腾讯所有,因此考虑到可能的低延时,采用了腾讯提供的免费API接口,准确讲是腾讯语音的“一句话识别”接口。网络整体框架是:小程序用户使用手机客户端录入语音,采集之后反馈到自己搭建的服务器,由服务器转发到腾讯语音识别后台,拿到识别文本后反馈到小程序前台,如下图:

    7d646ab113614ee1a12d6b1bf0974ff6.jpeg

    本次推送用来阐述微信客户端的代码实现:

    总述:首先要实现一个小程序的客户端代码需要考虑的如下问题点:

    一、JS文件实现.

    1、需要考虑小程序在实际上线之后只能使用https请求,且域名必须备案,因此需要提前准备已经备案的域名并在公众平台登记(此域名可以使用二级域名)。

    2、因为需要进行录音,因此需要重点考虑对于recordmanager的使用。

    3、由于录音文件需要上传服务器,因此要考虑uploadfile的使用。

    4、由于返回的识别文本很有可能存在个别字体识别出错的问题,为方便起见,提供对于返回的文本进行编辑的控件textarea(此控件腾讯不推荐直接操作value,但是在实际应用中没发现问题,暂时使用)。

    5、为了方便统计用户信息,需要采集用户的唯一识别码openid并索要session_key。

    6、参考一些成熟的程序,一般提供一个用户和开发者交流的通道,因此添加一个about界面,用于跳转之后用户可以输入一些对于程序的开发和意见提交给开发者。

    二、WXML文件布局

    7、由于recordmanager的API需要具备touchstart和touchstop的配合,为了界面更加形象美观,因此使用image控件来实现触摸绑定事件。

    8、如JS部分的第4条,还需要一个textarea来进行信息的展示以及提供给用户一个在线编辑的区域。

    三、WXSS样式

    9、样式部分主要考虑到实际使用,在界面的下方提供文本删除,文本一键拷贝,语音录入以及页面跳转接口。

    对于如上阿拉伯数字列举的9个知识点,如下一一提供代码展示,全部代码打包在最后(对于代码中标记为XXXXXXXX的部分涉及个人域名信息,请实际测试时更换)。

    1、程序中所有的https请求,代码如下:

    0fbe4b497e684ed396c3482bed1149bd.jpeg

    此处为index.js中得到用户的code之后通过https的get请求发送到服务器,用来获取到用户的唯一识别号。服务器得到code之后向腾讯后台获取用户的唯一openid并给出临时用的session_key。服务器将openid储存在本地,将session_key反馈给用户侧保存,用来作为用户的临时ID。

    f534fe2fc77a43f08fdc49ca496c9cba.jpeg

    此处为index.js中在使用recordmanager得到用户的一次录音文件之后要使用uploadfile提交到服务器。在uploadfile的返回数据中,得到的是一个字符串,需要使用JSON的parse方法将其转为JSON键值对,对于获取到的数据保存在word中,并实时更新textarea的信息呈现给用户。

    2478dc70d34b490fbf558762a1d66b07.jpeg

    此处为about.js中使用https的get请求提交用户的使用感受。由于用户侧本地保存了临时ID为session_key,因此为了判断是哪位用户的建议,需要将session_key和用户建议一并反馈到服务器。此处的success回调仅用来调试。

    2、Recordmanager的使用:

    由于此处腾讯的API使用的是一句话识别,最大的识别时长是60s,而对于用户而言,时长应该是不可见的,而且一次性录音时间过长,导致回传的时延更大,实际体验更加不好,因此考虑在代码层面解决此问题,牺牲的是识别成功率的一定程度降低。实际的实现方式是在用户侧每10s生成一个语音文件进行传输,设置一个布尔变量用来检测用户是否还在录音,如果还在录音的话将立即开启下一个录音文件。代码如下:

    dd109fb593424645afb87e19db58abe4.jpeg

    此段代码通过设定录音参数,当用户触摸了录音开始,即开启录音,并直接注册了录音结束的onstop回调函数,在回调函数中通过touchOrNot变量判断是否继续录音。一次录音结束之后立即调用如下的reconigz函数进行语音识别,主体部分是前文描述过得https请求,代码如下:

    2a00417e043b483287a9deac857849b6.jpeg

    另外需要对于touchOrNot变量进行维护的是下段代码:

    1e20dc836c82434b936a91c6ee6208e8.jpeg

    用户录音结束之后除了维护布尔变量之外,更重要的是要触发recordmanager的onstop回调函数。

    3、Uploadfile的使用:

    此函数本质上就是一个https调用,需要注意的就是name需要和服务器端进行对应,另外就是回传的数据是字符串,需要使用JSON方法转为键值对才能使用。

    4、Textarea的使用:

    小程序官方文档针对这个空间的第四点中写不建议直接对于用户的输入进行编辑,但是由于本次的数据本身就确定来自于服务器代码,因此就不按照这个要求来了。在index.js中定义一下textarea的数值,考虑到如下几个因素都会影响这个值,因此需要另外定义一个words变量来同步数据。

    1、每次语音识别之后需要将数据添加到textarea中,由于textarea作为js文件的data变量,不方便直接进行赋值,因此定义一个words变量来承接数据变化;

    2、由于已经将文本的数据作为一个变量,因此需要针对用户每次编辑的数据都要通过bindinput函数来更新words和textarea的value值。

    08253ee6604a4f20b7b75a2009b180d1.jpeg

    5、OpenId和session_key的使用:

    如前文所述,OpenId是用户唯一辨识ID,session_key是腾讯派发给开发者的用户针对这一小程序的临时ID,用户在打开小程序之后可以通过如下方法检查session_key是否过期,如果没有过期,那么小程序在核心代码层面会保证此次会话的session_key有效。直接将检查方法放到代码的方法中:

    7f54781690f048dcba6873058cf7c582.jpeg

    因此主要的考虑方向是如果用户没有使用过或者session_key过期了。根据小程序的说明,需要调用reLogin方法来获取到用户的code(有效期为单次5分钟),然后上传到后台服务器,后天服务器拿着这个code并着appid(小程序ID)等信息向腾讯获取到openid和session_key,服务器将这两个数据绑定之后存入到数据库,并将session_key回送给小程序保存在本地。代码如下:

    6fe530306ebd4f95b98c0698e04482d5.jpeg

    6、About界面的添加:

    由于程序终究是要上线的,因此总不能让程序像一个断了线的风筝,而且无法得到任何的市场反应的小程序终究也无法再进步。因此很有必要添加一个用户意见反馈的界面。此界面简单,如果前面看的差不多了,由于此界面主要是一个https请求,此界面可以直接看代码了。

    351d16b2b7074cc8bb89fc91103ae26f.jpeg

    由于需要区分提建议的人,因此需要同时从本地存储中拿到session_key并着意见一起提交到服务器。

    7、界面的录音方式实现:

    由于录音需要两个动作:启动和停止。因此可以直接使用小程序提供的控件方法bindtouchstart和bindtouchstop。可以使用button或者image控件绑定,由于图片的绑定显示效果更好,本次使用一个话筒图片来实现。

    126cbbd90ca94776a7444bdd207a10ac.jpeg

    布局文件中涉及一个textarea文本输入框用于显示和编辑,将value设置为变量。另外针对第三个图片绑定触摸开始和结束时间用来控制录音API的动作。最后为一个text用来跳转到建议页面。

    8、录音文件的删除和拷贝:

    在第7步布局文件中已经看到有删除和拷贝的事件绑定,其中删除事件直接将textarea的value和words置为空即可,拷贝事件使用小程序的粘贴板方法setClipboardData。具体代码如下:

    责任编辑:

    展开全文
  • 前不久写了个工具型微信小程序(Find周边),里面用到了语音识别技术。现将实现细节整理如下: 接口预览 通过阅读了解科大讯飞接口文档、小程序接口开发文档以及对后端ThinkPhp框架的学习,我整理了如下开发步骤: ...
  • 我已经写好了后台代码,只要配置三个参数就能够使用。...3.注意你的小程序里定义的后台接口地址要带上/smart_order,否则不起作用 而且你使用的uploadFile函数必须要带上name:"wx_record",否则不能...

    我已经写好了后台代码,只要配置三个参数就能够使用。

     

    1.先在百度语音接口里创建一个应用,然后把三个参数填后台代码里。

    2.把代码放在阿里云后台里运行,注意我文件里使用的是3006端口,你的阿里云要开启

    3.注意你的小程序里定义的后台接口地址要带上/smart_order,否则不起作用

    而且你使用的uploadFile函数必须要带上name:"wx_record",否则不能使用

     

    如何把后台文件部署到阿里云上请参考:http://note.youdao.com/noteshare?id=80bbf1cee0ec93dd0d6ee2e3b64e8c6f

    最终效果:

     

     

    代码地址:https://download.csdn.net/download/weixin_42292991/11148595

    展开全文
  • 最近为小程序增加语音识别转文字的功能,坑路不断,特此记录。 微信开发者工具 开发者工具上的录音文件与移动端格式不同,暂时只可在工具上进行播放调试,无法直接播放或者在客户端上播放 debug的时候发现,...

    最近为小程序增加语音识别转文字的功能,坑路不断,特此记录。

    微信开发者工具

    开发者工具上的录音文件与移动端格式不同,暂时只可在工具上进行播放调试,无法直接播放或者在客户端上播放

    debug的时候发现,工具上录音的路径是http://tmp/xxx.mp3,客户端上录音是wxfile://xxx.mp3。 忽悠呢,不是格式不同,是映射路径不同。
    其实做个兼容也不难,每次提示一行文字,很丑。

    采样率与编码码率限制

    每种采样率有对应的编码码率范围有效值,设置不合法的采样率或编码码率会导致录音失败。详细看这个
    https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/RecorderManager.start.html

    一开始没有留意,导致录音不成功。
    试过几次后,采用这样的配置,感觉录音识别率和体积之间比较好平衡:

    1
    2
    3
    
    sampleRate: 16000, //采样率
    numberOfChannels: 1, //录音通道数
    encodeBitRate: 96000, //编码码率
    

    单通道基本是必选的。因为asr只支持单通道。frameSize也是可以的,但是要考虑截断对识别的影响。暂时没有用上。

    录音优化

    因为可能误按,于是对小于500ms的录音直接忽略。
    另外,松开录音按键后,再延迟一点时间才真正stop录音。

    录音文件格式

    微信录音文件支持mp3和aac。这2种格式文件都比较小,aac文件体积更小。这对上传来说是件好事情,速度更快。
    但是对语音识别转文字就不友好了。因为百度、阿里云ASR、讯飞的语音转文字接口都不支持aac和mp3,通常要求是pcm或者wav格式。
    如果微信录音能提供wav格式,那么就不用服务器做格式转换了,但是wav格式体积是mp3、aac的5到10倍,至少短期是没戏了,这也是很多人吐槽的地方。

    服务器转换录音文件格式

    可以用java第三方库转换,也可以用Process调用ffmpeg转换。要注意的是,根据识别API的要求来做转换。比如阿里云asr的要求是:

    支持音频编码格式:pcm(无压缩的pcm文件或wav文件)、opus,16bit采样位数的单声道(mono);
    支持音频采样率:8000Hz、16000Hz;

    java ProcessBuilder要使用数组传参

    转换音视频,习惯用ffmpeg。安装完ffmpeg之后,用java新建进程调用。

    1
    
    Process = new ProcessBuilder("ffmpeg -i in.mp3 out.wav").start();
    

    一直提示CreateProcess error。 后来看文档才发现,要以数组的形式传入参数。

    1
    
    Process = new ProcessBuilder("ffmpeg", "-y", "-i", "in.mp3", "out.wav").start();
    

    这样就启动成功了。
    关于java启动进程,不是本文重点,以后再写篇文章总结。

    阿里云asr sdk使用问题

    这个问题困扰了一天时间,回想起来真是吐血。
    问题表现是微信录制的语音很多都识别不了。
    最初是直接把录音mp3文件转换为pcm文件,本地能播放,但是用阿里云asr sdk却识别不了。 一开始以为是文件编码问题。特意查了asr支持的文件格式,用ffprobe检查,potplayer看属性,都没有看出问题。
    甚至把启动ffmpeg进程转换也改了,用了java的库去做,还是不行。
    后来为了方便测试问题,用asr的restful接口测试录音文件,都能识别! 似乎是sdk的问题。于是打开官方文档例子对比。发现用的是sdk 2.x,老铁啊你复制粘贴过来的代码竟然少了!欲哭无泪。

    1
    2
    3
    4
    
    // TODO  重要提示:这里是用读取本地文件的形式模拟实时获取语音流并发送的,因为read很快,所以这里需要sleep
    // TODO  如果是真正的实时获取语音,则无需sleep, 如果是8k采样率语音,第二个参数改为8000
    int deltaSleep = getSleepDelta(len, sampleRate);
    Thread.sleep(deltaSleep);
    

    也少了对sampleRate的设置。

    阿里云asr token过期

    因为用的是免费版asr,没有给福报厂充值,因此token一天失效,导致联调的时候突然报错。
    最后实在受不了,写了个定时任务每小时更新token。
    这,就是beggar VIP?

    wx.uploadFile返回值

    封装了一个接口parseResponse,统一解析查询结果(文本、语音)。发现奇怪的问题:

    • 用文本查询的,可以正常解析结果
    • 用语音查询的,明明已经返回了结果,却解析不了!

    只能console.log()打印出来对比

    第一行是wx.request()发起文本查询。
    第二行是wx.uploadFile()上传语音文件后直接语音转文字,并且查询。

    wx.request返回值是json对象。
    wx.uploadFile返回值是“字符串”!
    wx.uploadFile返回值是“字符串”!
    wx.uploadFile返回值是“字符串”!
    重要的事情要说3遍。尽管Content-Type: "application/json; charset=utf8",但是微信根本不做转换!非常坑爹!

    解决:对wx.uploadFile返回值进行JSON.parse(res.data),得到json对象。

    更换appid和secret

    因为正式小程序项目账号一直拖着没有申请,所以这段时间用的是我个人的appid和secret进行开发。
    等正式账号准备好了,更新了小程序项目的appid,并且发出内部体验包。

    此时已经深夜1点半,头脑有点发懵。只更新了小程序appid,竟然忘了更新服务器的appid和secret。。。
    于是乎反复报错登录失败。
    过了一会才反映过来,更新服务器的appi的secret,但是还是用户。才想起忘了还有storage缓存没有清除?,里面放着自定义的session。这下真机体验没问题了。
    但是微信开发者工具又是登录失败。反复摸索后发现:更换小程序appid后,清除所有数据,关闭开发者工具,重新打开,这就正常了。应该是微信开发者工具的bug。

    结论:深夜不宜加班写bug?。

     

    https://ycwu314.github.io/p/miniapp-speech-to-text-experience/

    展开全文
  • 最近公司要求在小程序实现识别搜索歌曲的功能,然后对接的是讯飞的api,本来我一个做前端的,对接第三方的文档这些应该留给后端做才对的,前端就上传一个录音给后端让他去调接口返回数据给我就好了。可是当我对接完...
  • 最近需要在小程序实现语音识别,将需要用到的功能都总结下,供大家参考。语音识别用的是科大讯飞,文中给出了详细的实现方法介绍,需要的朋友们下面随着小编来一起学习学习吧
  • 百度语音api实现语音识别小程序,通过判断当前音量大小自动识别判断是否该结束录音,原理还是挺简单的,就是遇到一些小坑,自己学习了也分享给大家
  • 微信小程序语音识别

    2018-01-04 12:09:12
    微信小程序语音识别微信小程序语音识别微信小程序语音识别微信小程序语音识别微信小程序语音识别
  • 1、概述通过微信小程序wx.startRecord()和wx.stopRecord()接口录音并上传silk录音文件至服务器,通过ffmpeg将silk录音文件转成wav录音文件,再通过百度语音识别 REST API 获取语音识 ...       1、概述 通过微信...
  • silk v3录音转olami语音识别和语义处理的api服务(ubuntu16.04服务器上实现) 微信小程序语音识别服务搭建全过程解析 内附免费的供小程序语音识别的https服务
  • 之前在研究百度的实时语音识别,并应用到了微信小程序中,写篇文章分享一下。 先看看完成的效果吧 前置条件 申请百度实时语音识别key 百度AI接入指南 创建小程序 设置小程序录音参数 在index.js中输入 const...
  • 主要为大家详细介绍了小程序实现按下录音松开识别语音,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 30分钟实现小程序语音识别

    千次阅读 2018-11-24 09:38:23
    本文将从小程序相关代码到最后对接科大讯飞 api 过程,一步步介绍,半个小时,搭建完成小程序语音识别功能!不能再多了!当然,前提是最好掌握有一点点小程序、node.js 甚至是音频相关的知识。 架构先行 架...
  • 小程序语音识别-NodeJs版, nodejs实现服务端功能 语音实时识别功能
  • 百度语音api实现语音识别小程序,通过判断当前音量大小自动识别判断是否该结束录音,原理还是挺简单的,就是遇到一些小坑,自己学习了也分享给大家。里面有个小彩蛋,对它说‘关机’试试(*_*),(不会立刻关机的,...
  • 网上前篇一律的微信小程序语音识别博客,在小程序api更新之后让莘莘学子看的一头雾水,这里只叙述前端的工作内容,毕竟朕也只是初出茅庐。 先送上预览图: (此图片来源于网络,如有侵权,请联系删除! ) (此图片来源...
  • 小程序进行语音识别(JAVA MP3 转 PCM)

    千次阅读 热门讨论 2019-06-26 14:07:56
    公司最近有一个小程序项目需要使用语音识别功能,初步技术方案是:小程序录音-上传录音文件到后端服务器,后端服务器调用百度AI语音接口获取识别结果并返回给小程序。 中间遇到一个小问题:小程序的录音文件格式...
  • 在一些小程序的开发场景中经常会有语音转文字的需求,今天小编通过实际案例给大家分享微信小程序语音同步智能识别功能,需要的朋友可以参考下
  • app.json { ... "plugins": { ... "WechatSI": { "version": "0.3.3", ...-- 语音识别长按键 --> <view class="{{voiceBtn}}" bindtouchstart="touchStart" bindtouchend="touchEnd">
  • 公司要在微信小程序上面实现语音识别的功能,后端的踩坑功能就落到了我的头上了。本着好好学习,努力研究的精神,二话不说就接下了这个任务了。  我在公司的开发环境是在Window上面的,而生产环境是在Ubuntu上面的...
  • 小程序语音识别 (无需转码、无需后台)

    千次阅读 热门讨论 2018-11-01 20:45:26
    微信小程序目前录音仅能生成 mp3和acc两种格式,而百度语音识别,讯飞语音识别都不支持mp3和acc的; 最后发现腾讯云和阿里云支持mp3,反正用的是腾讯的小程序,将就着用腾讯的接口咯 不想解说了,直接说流程+代码+注释吧...
  • 根据微信的插件“同声传译”封装的语音识别组件,只需要把组件复制到你的项目中,然后按里面的使用方式.txt的步骤直接调用即可
  • LSTM实现语音识别

    千次阅读 热门讨论 2020-02-25 20:47:17
    序言:语音识别作为人工智能领域重要研究方向,近几年发展迅猛,其中...RNN与LSTM介绍RNNLSTM语音识别介绍声学特征提取声学特征转换成音素(声学模型)音素转文本(语言模型+解码)语音识别简单实现提取WAV文件中特征将...
  • 小程序 语音识别(一)

    千次阅读 2017-12-18 11:12:20
    现在人工智能非常火爆,很多朋友都想学,但是一般的...由于最近项目中需要实现小程序端的语音识别,所以写了一个例子,供需要的同学参考。下面贴下代码 小程序端代码: <!--index.wxml--> <view class...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,500
精华内容 16,600
关键字:

小程序实现语音识别