uniapp调用百度语音实现录音转文字功能

经历三天时间各种遇到困难 之后终于实现了这个功能,参照网上了许多文章 才找到一个能正常实现的方法,网上能找到的例子都不起作用,相信很多人困惑在这,为了避免别人出现这种情况,我分享我的代码,绝对可用,包括 uniapp前端使用了recorderManager和java端调用百度语音转文字,我相信很多人都很需要我写的东西,我只试验了安卓手机,html5 + 里面

plus.speech这个方式就不要用了,不好用,调用百度的语音识别时在百度的管理控制台会看到dev_id这个参数没传的错误也没找到添加这个参数的地方,所以在hbuildx里面当前项目的app模块配置这个地方不需要选

1.非常重要的一个步骤 manifest.json里面添加android.permission.RECORD_AUDIO这个权限,无论是想真机调试,由其是使用了自定义基座一定要在线打个包,让基座包含这个权限然后在手机系统 里面应用管理当前这个app的权限管理里面必须要看到有录音权限这一项

2.为了能够在使用recorderManager在进入要使用录音功能的页面会询问是否允许录音这样的权限,必须要使用recorderManager之前要调用一次硬件权限申请。这个在插件市场里面有一个https://ext.dcloud.net.cn/plugin?id=594 这个地址 App权限判断和提示这样的js,用于判断或申请某个硬件权限使用的是native.js的功能。这个插件引入项目之后会在当前项目目录的js_sdk这样一个文件夹。在里面会出现wa-permission文件 夹下面会有一个permission.js,

3.相关代码

uniapp端代码 

  <view class="popup-content" >
                    <view>{{msg}}</view>
                    <view>你在说{{voicetext}}</view>
                    <button class="uni-btn"  type="warn" @touchstart="startvoice" @touchend="endvoice">按说语话松开停止</button>
                    <button class="uni-btn"  type="warn" @tap="playvoice" >播放录音</button>
    </view>
<script>
import permision from "@/js_sdk/wa-permission/permission.js"
    const recorderManager = uni.getRecorderManager();
    const innerAudioContext = uni.createInnerAudioContext();
export default {
     data() {
    return {
            voicetext:"",
        msg:"",
        voicepath:""
       }
   },
  onLoad() {
      this.initaudio()  

   },
methods: {
   async initaudio(){
                           //注意此处必须为 await 因为会触发异步事件,手机上会弹出权限申请对话框处理完才能走下一步录音
                 let recordauth =  await permision.requestAndroidPermission("android.permission.RECORD_AUDIO")
                 console.log("判断有没有录音权限>>>>>>"+recordauth)
                  if(recordauth==1){
                               recorderManager.onStart((res)=>{
                                        console.log("开始 录音>>>>>>>>>...")
                                    });
                               recorderManager.onStop((res)=>{
                                    console.log("recorderstop....res.tempFilePath>>>"+res.tempFilePath)
                                    this.voicepath = res.tempFilePath
                                    this.uploadvoicefile()
                                    // 使用uni.uploadFile上传到服务器上,此时是mp3格式
                                });  

                                recorderManager.onError( (res)=> {  

                                 console.log('onError'+JSON.stringify(res));
                                });
                  }
            }, //initaudio 方法结束
          startvoice(){
                console.log("开始录音")
                recorderManager.start({
                    format:"mp3",
                    sampleRate: 16000 // 必须设置是后台设置的参数,不然百度语音识别不了
                });
         },
        endvoice(){  

              console.log("结束录音")
              //注意为了避免说话时间太短导致这个api出现bug要加一些延时
             setTimeout(()=>{
                recorderManager.stop()
             },1000)  

            },
            playvoice(){
                console.log("点击playvoice")
                if (this.voicepath) {
                    console.log("播放声音")
                    innerAudioContext.src = this.voicepath;
                    innerAudioContext.play();
                }
            },
            uploadvoicefile(){
                // this.msg = "调用java端服务文件路径"+this.voicepath
                 uni.uploadFile({
                url: 'http://ip:端口/uploadFile(java端接收文件接口名)',
                filePath: this.voicepath,//录音结束后返回的临时路径,
                name: 'file',
                formData: {
                   dev_id:1537 //中文带标点
                 },
                success: (uploadFileRes) => {
                    let word = uploadFileRes.data
                    console.log("上传音频成功"+word);
                },
                fail: (res) => {  

                    console.log("上传音频失败"+JSON.stringify(res));
                }
                });
            }
    }
}
</script> ```
 //注意uploadFile 的url属性 这个地方ip不能是localhost或127,如果自已电脑启动java服务必须 是本机的真实ip如192.xxx这种,或者域名什么的,并且java端接口一定要支持跨域,很多人卡到这个ip上,我也是网上很难找到解决问题的贴子
注意filePath这个路径就是recorderManager的onStop事件就得到的_doc这种开头的路径,不需要加什么file:不是像网上某些人说的加这种东西

Java端

pom里面需要引用两个包  

            <dependency>
            <groupId>com.baidu.aip</groupId>
            <artifactId>java-sdk</artifactId>
            <version>4.16.3</version>
        </dependency>  

        <dependency>
            <groupId>com.googlecode.soundlibs</groupId>
            <artifactId>mp3spi</artifactId>
            <version>1.9.5.4</version>
        </dependency>  

 ``` import com.baidu.aip.speech.AipSpeech;
import javazoom.spi.mpeg.sampled.file.MpegAudioFileReader;
import org.apache.commons.io.IOUtils;
import org.json.JSONArray;
import org.json.JSONObject;  

import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;  

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;  

@RestController
@CrossOrigin(origins = "*")
public class BaiduSpeech {
    //设置APPID/AK/SK
    public static final String APP_ID = ""; //去百度语音服务申请
    public static final String API_KEY = "";//去百度语音服务申请
    public static final String SECRET_KEY = "";//去百度语音服务申请  

    @RequestMapping(value = "/uploadFile")
    public String uploadFile( @RequestParam("dev_id") int dev_id, @RequestParam("file") MultipartFile file) throws Exception {
        byte[] pcmbytedata = mp3Convert2pcm(file.getInputStream());
        HashMap<String,Object> options = new HashMap<String,Object>();
        options.put("dev_pid",dev_id);//
        JSONObject jsonfrombaidu =  basicBydata(pcmbytedata,"pcm",options);
        JSONArray jsonArray =  jsonfrombaidu.getJSONArray("result");
        String result =  jsonArray.getString(0);
        System.out.println(result); //解析完的结果
        return result;
    }
    // 获取AipSpeech对象,建议单例使用
    public static AipSpeech getClient() {
        AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);
        // 可选:设置网络连接参数
        client.setConnectionTimeoutInMillis(2000);
        client.setSocketTimeoutInMillis(60000);
        return client;
    }  

    // 语音识别(来自文件)
    public static JSONObject basicBydata(byte[] voicedata, String fileType,HashMap<String,Object> options) {
        AipSpeech client = getClient();  

        return client.asr(voicedata, fileType, 16000, options);
    }
    /**
     * MP3转换PCM
     * @param inputStream MP3输入流
     * @throws Exception
     */
    public static byte[] mp3Convert2pcm(InputStream inputStream) throws Exception {
        //转换PCM audioInputStream 数据
        AudioInputStream audioInputStream = getPcmAudioInputStream(inputStream);
        byte[] pcmBytes = IOUtils.toByteArray(audioInputStream);
        return pcmBytes;
    }  

    /**
     * 获取PCM AudioInputStream 数据
     * @param inputStream MP3输入流
     * @return AudioInputStream PCM输入流
     */
    private static AudioInputStream getPcmAudioInputStream(InputStream inputStream) {
        AudioInputStream audioInputStream = null;
        AudioFormat targetFormat = null;
        try {
            AudioInputStream in = null;
            MpegAudioFileReader mp = new MpegAudioFileReader();
            in = mp.getAudioInputStream(inputStream);
            AudioFormat baseFormat = in.getFormat();
            targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(), 16,
                    baseFormat.getChannels(), baseFormat.getChannels() * 2, baseFormat.getSampleRate(), false);
            audioInputStream = AudioSystem.getAudioInputStream(targetFormat, in);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return audioInputStream;
    }  

} ``` 

到此这篇关于uniapp调用百度语音实现录音转文字功能的文章就介绍到这了,更多相关uniapp录音转文字内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • uniapp实现滑动评分效果

    本文实例为大家分享了uniapp实现滑动评分的具体代码,供大家参考,具体内容如下 uniapp开发. 滑动评分.点击评分 <template> <view> <view class="flex" style="margin:200rpx;"> <block v-for="(item,index) in scoreArray" :key='index' ><!-- 遍历评分列表 --> &

  • uniapp实现录音上传功能

    目录 uni-app 介绍 html部分 js部分 创建实例 开始录音 结束录音 播放录音 暂停播放 提交录音到后端 重新录制 onLoad部分 计时器 数据部分 uni-app 介绍 uni-app 是一个使用 Vue.js 开发跨平台应用的前端框架. 开发者通过编写 Vue.js 代码,uni-app 将其编译到iOS.Android.微信小程序等多个平台,保证其正确运行并达到优秀体验. html部分 我是写了个录音的图片 点击之后弹出一个弹出层(仿了下qq的样式) 样式怎么写我就不赘述了大

  • uniapp实现可滑动选项卡

    本文实例为大家分享了uniapp实现可滑动选项卡的具体代码,供大家参考,具体内容如下 tabControl-tag.vue <template name="tabControl"> <scroll-view scroll-x="true" :style="'background-color:'+bgc+';top:'+top+'px;'" :class="fixed?'fxied':''" :scroll-l

  • vue uniapp实现分段器效果

    本文实例为大家分享了vue uniapp实现分段器效果的具体代码,供大家参考,具体内容如下 此举只是记录下用vue动态改变样式效果 先展示下效果 template部分 <view class="countTime"> <text class="title">折扣和就餐时间</text> <view class="wrap"> <view class="box" v-for=

  • uniapp实现钉钉扫码登录示例代码

    由于uniapp暂无钉钉授权登录所以本文将钉钉扫码登录作为网页嵌入uniapp,最终实现钉钉扫码登录app 1. 用H5调起钉钉扫码登录 钉钉在网页端的扫码登录可参考钉钉文档:扫码登录第三方网站 - 钉钉开放平台 (dingtalk.com) // 钉钉扫码登录 dingLoginFn() { let dingData = { appid: OUT_LINK_CONFIG.dingAppid, state: "STATE", url: encodeURIComponent('登录后的回

  • uniapp实现日期时间选择器

    本文实例为大家分享了uniapp实现日期时间选择器的具体代码,供大家参考,具体内容如下 由于项目需求需要,尝试过使用Vant组件库,但是一直出现问题,插件市场的插件又不太符合需求,使用就查了相关资料,最终捣鼓的效果如下: 首先现在根目录下创建util文件夹放dateTimePicker.js dateTimePicker.js function withData(param){ return param < 10 ? '0' + param : '' + param; } function ge

  • uniapp调用百度语音实现录音转文字功能

    经历三天时间各种遇到困难 之后终于实现了这个功能,参照网上了许多文章 才找到一个能正常实现的方法,网上能找到的例子都不起作用,相信很多人困惑在这,为了避免别人出现这种情况,我分享我的代码,绝对可用,包括 uniapp前端使用了recorderManager和java端调用百度语音转文字,我相信很多人都很需要我写的东西,我只试验了安卓手机,html5 + 里面 plus.speech这个方式就不要用了,不好用,调用百度的语音识别时在百度的管理控制台会看到dev_id这个参数没传的错误也没找到添加这

  • Python3调用百度AI识别图片中的文字功能示例【测试可用】

    本文实例讲述了Python3调用百度AI识别图片中的文字功能.分享给大家供大家参考,具体如下: 首先pip install命令安装baidu-aip模块,如下图所示(这里使用pip3 install baidu-aip命令): 编辑Python代码时注意,需要首先引入AipOcr和re两个模块,即: from aip import AipOcr import re 示例代码如下: from aip import AipOcr import re APP_ID='***' API_KEY='***

  • 易语言调用百度语音平台实现文字转换语音功能的代码

    调用百度语音平台实现文字转换语音功能 此功能需要加载精易模块5.6 .版本 2 .支持库 wmp9 .程序集 窗口程序集1 .子程序 _试听按钮_被单击 播放器1.地址 = "http://tts.baidu.com/text2audio?lan=zh&pid=101&ie=UTF-8&text=" + 编码_URL编码 (内容编辑框.内容, , 真) + "&spd=5&per=4" ' 参数 可需 描述 ' tex 必填

  • python调用百度语音REST API

    本文实例为大家分享了python调用百度语音REST API的具体代码,供大家参考,具体内容如下 (百度的rest接口的部分网址发生了一定的变化,相关代码已更新) 百度通过 REST API 的方式给开发者提供一个通用的 HTTP 接口,基于该接口,开发者可以轻松的获得语音合成与语音识别能力.SDK中只提供了PHP.C和JAVA的相关样例,使用python也可以灵活的对端口进行调用,本文描述了简单使用Python调用百度语音识别服务 REST API 的简单样例. 1.语音识别与语音合成的调用

  • Python调用百度AI实现图片上文字识别功能实例

    目录 简介 步骤 安装百度AI库 注册百度AI开放平台 调用glob库 调用AipOcr库识别文字 可能会遇到的问题 批量操作 总结 简介 Python免费调用百度AI实现图片上面的文字识别 步骤 安装百度AI库 !pip install baidu-aip 注册百度AI开放平台 先注册百度AI,获得ID和密钥.注册方法可参考:注册方法 只需走到 "1.6 获取密钥" 即可.然后记录下自己的APP_ID.API_KEY.SECRET_KEY,就可以开始了. 调用glob库 glob库用

  • C#调用百度翻译API实现一个翻译功能

    前言 虽然百度翻译相对于谷歌翻译在准确性方面还有很大的提升空间,但网络的现实情况及百度翻译接口的免费易用性方面让我们选择百度翻译接口.下面来一起看看详细的步骤吧 方法如下 appId 和 passWord 需要到百度翻译开放平台申请 using System; using System.Net; using System.Web.Security; using System.Web.Script.Serialization; namespace TranslatorOfWang { class

  • python 3调用百度OCR API实现剪贴板文字识别

    本程序调用百度OCR API对剪贴板的图片文字识别,配合CaptureScreen软件,可快速识别文字. #!python3 import urllib.request, urllib.parse import os, io, sys, json, socket import base64 from PIL import ImageGrab socket.setdefaulttimeout(30) def get_auth(): apikey = 'your apikey' secret_key

  • python录音并调用百度语音识别接口的示例

    #!/usr/bin/env python import requests import json import base64 import pyaudio import wave import os import psutil #首先配置必要的信息 def bat(voice_path): baidu_server = 'https://aip.baidubce.com/oauth/2.0/token?' grant_type = 'client_credentials' client_id

  • 易语言调用百度文字识别api方法

    现在百度ai特别强大,很多大公司都是调用百度的数据,那么对于习惯易语言的我们改怎么操作呢?今天以百度ai文字识别为例. 首先打开百度ai平台 注册或登录百度账号,进入控制台,选择文字识别 新建应用,获取appid和app key 选择技术文档,api文档 参考第一个调用方式,通过url调用 要获取token请参考相关链接 然后根据参数说明填写相关代码,最后结果如下: .版本 2 .支持库 spec .程序集 窗口程序集_启动窗口 .子程序 __启动窗口_创建完毕 .子程序 _按钮1_被单击 .局

  • Python调用百度OCR实现图片文字识别的示例代码

    百度AI提供了一天50000次的免费文字识别额度,可以愉快的免费使用!下面直接上方法: 首先在百度AI创建一个应用,按照下图创建即可,创建后会获得如下: 创建后会获得如下信息: APP_ID = '******' API_KEY = '************' SECRET_KEY = '**************' 下面就是百度API包的安装,在终端cmd输入如下语句直接pip方式安装,注意是 baidu-api 哦! pip install --user baidu-aip 接下来上py

随机推荐