2016-07-14 16:22:09 xiaokui_wingfly 阅读数 3397
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    6112 人正在学习 去看看 杨波

voicewo 是一个专门用于在网页中实现语音识别转换的jQuery插件。开发人员可以用voicewo将用户的语音转换成文字,插入到指定的HTML表单里,无缝地与Java、.NET、PHP、ASP等多种编程语言集成。适合在聊天室、评论框、论坛、博客、电子邮件等互联网应用中使用。

这里写图片描述

主要特点:

  • 快速:体积小,加载速度快
  • 架构:采用Flash语音采集,云端API接口识别,页面Javascript文本处理
  • 风格:修改风格容易,只需修改CSS文件
  • 扩展:提供多组Javascript事件接口,扩展定制方便
  • 兼容:支持大部分主流浏览器,比如IE、Firefox、Safari、Chrome、Opera

快速示例

<!DOCTYPE html>
<html>
<head>
<title>Voicewo jQuery Plugin Demo</title>
<link rel="stylesheet" type="text/css" href="voicewo.css">
<script src="jquery-1.11.0.min.js" type="text/javascript"></script>
<script src="jquery.voicewo.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function(){
   $('#btn').voicewo({
      'width'        : 92,
      'height'       : 25,
      'outputId'     : 'txt',
      'buttonImage'  : 'btn.png',
      'swf'          : 'voicewo.swf'
   });
})
</script>
</head>
<body>
   <textarea id="txt" cols="60" name="txt" rows="6"></textarea>
   <div id="btn"></div>
</body>
</html>

使用说明:

本插件架构是用Flash进行语音采集,提交到云端接口(目前接口采用科大讯飞)进行语音至文本转换,jQuery插件页面控制操作。

1、首先在科大讯飞-语音云开放平台(http://open.voicecloud.cn/)注册,获得appid;

2、下载本插件包并解压缩,用Adobe Flash Professional CS5.5 打开voicewo.fla与voicewo.as文件,编辑voicewo.as,将其中的private const domain:String = “www.youdomain.com”; 改为自己的网站域名,多个域名可以用分号隔开,该代码是防止别人恶意调用,调试时也可以用*代表所有域名访问。另外将其中的private const configs:String = “appid=53000000,timeout=2000″; appid换成自己申请到的数字。重新编译发布voicewo.swf文件;注:编辑flash时先要加载库,方法是打开CS5.5开发工具,单击【文件】->【ActionScript…】,点击库路径选项卡,添加库路径”./lib”,确定即可。

3、按照前面的代码示例调用,注意要先引入jquery脚本与插件脚本文件以及样式文件,即可在自己的web项目中使用;

4、应用部署完成后,在科大讯飞语音云平台中请求审核接口。

运行环境:

  1. 客户端需要有麦克风;
  2. 客户端浏览器需要支持flash插件;
  3. 客户端控制面板的flash设置需要授权浏览器用户使用麦克风。

查看原文

查看在线演示Demo和更多原文内容:
http://www.ibloger.net/article/1177.html

2016-08-29 16:56:24 qq_25824197 阅读数 4450
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    6112 人正在学习 去看看 杨波

         最近在研究语音识别,前段时间使用了百度语音识别,最近公司又突然让转用科大讯飞的SDK,感觉有点坑。不过 也算是学习了使用新的SDK了吧。在这里将集成SDK以及一些使用方法写一下。

第一步:获取APPid

先在科大讯飞语音识别开发者网站注册,获取APPid。

第二步:集成SDK

导入科大讯飞的iflyMSC.framework;然后再导入相关的依赖库:

第三步:初始化启动服务


在app delegate里面写入如下代码初始化

NSLog(@"%@",[IFlySetting getVersion]);

    //设置sdklog等级,log保存在下面设置的工作路径中

    [IFlySetting setLogFile:LVL_ALL];

    

    //打开输出在consolelog开关

    [IFlySetting showLogcat:NO];

    

    //设置sdk的工作路径

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUser DomainMask, YES);

    NSString *cachePath = [paths objectAtIndex:0];

    [IFlySetting setLogFilePath:cachePath];

    

    //创建语音配置,appid必须要传入,仅执行一次则可

    NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",APPID_VALU E];

    

    //所有服务启动前,需要确保执行createUtility

    [IFlySpeechUtility createUtility:initString];

在使用的页面

- (void)viewWillAppear:(BOOL)animated

{

    NSLog(@"%s",__func__);

    [super viewWillAppear:animated];

   

    [self initRecognizer];


}


- (void)viewWillDisappear:(BOOL)animated

{

    NSLog(@"%s",__func__);

    [super viewWillDisappear:animated];

    [_iFlySpeechRecognizer cancel];

    [_iFlySpeechRecognizer setDelegate:nil];

    [_iFlySpeechRecognizer setParameter:@"" forKey:[IFlySpeechConstant PARAMS]];


}


//初始化识别参数

- (void)initRecognizer

{

    NSLog(@"%s",__func__);

    

    //单利模式 UI的实例

    if (self.iFlySpeechRecognizer==nil) {

        _iFlySpeechRecognizer=[IFlySpeechRecognizer sharedInstance];

        [_iFlySpeechRecognizer setParameter:@"" forKey:[IFlySpeechConstant PARAMS]];

        

        //设置听写模式

        [_iFlySpeechRecognizer setParameter:@"iat" forKey:[IFlySpeechConstant IFLY_DOM AIN]];

        

    }

    _iFlySpeechRecognizer.delegate=self;

    

    if (_iFlySpeechRecognizer!=nil) {

        IATConfig *instance=[IATConfig sharedInstance];

        

        //设置最长录音时间

        [_iFlySpeechRecognizer setParameter:instance.speechTimeout forKey:[IFlySpeechC onstant SPEECH_TIMEOUT]];

        

        //设置后端点

        [_iFlySpeechRecognizer setParameter:instance.vadEos forKey:[IFlySpeechConstant VAD_EOS]];

        

        //设置前端点

        [_iFlySpeechRecognizer setParameter:instance.vadBos forKey:[IFlySpeechConstant VAD_BOS]];

        

        //网络等待时间

        [_iFlySpeechRecognizer setParameter:@"20000" forKey:[IFlySpeechConstant NET_TI MEOUT]];

        

        //设置采样率,推荐16K

        [_iFlySpeechRecognizer setParameter:IATConfig.lowSampleRate forKey:[IFlySpeech Constant SAMPLE_RATE]];

        if ([instance.language isEqualToString:[IATConfig chinese]]) {

            //设置语言

            [_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechCo nstant LANGUAGE]];

            //设置方言

            [_iFlySpeechRecognizer setParameter:instance.accent forKey:[IFlySpeechCons tant ACCENT]];

            

        }else if([instance.language isEqualToString:[IATConfig english]]){

            [_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechCo nstant LANGUAGE]];

        }

        //设置是否返回标点符号

        [_iFlySpeechRecognizer setParameter:instance.dot forKey:[IFlySpeechConstant AS R_PTT]];

    }

    

}

- (void)startButtonClick

{

    NSLog(@"start");

    [_textView setText:@""];

    [_textView resignFirstResponder];

    self.isCanceled=NO;

    if (_iFlySpeechRecognizer==nil) {

        [self initRecognizer];

    }

    [_iFlySpeechRecognizer cancel];

    

    //设置音频来源为麦克风

    [_iFlySpeechRecognizer setParameter:IFLY_AUDIO_SOURCE_MIC forKey:@"audio_sourc e"];

    

    //设置听说结果格式为json

    [_iFlySpeechRecognizer setParameter:@"json" forKey:[IFlySpeechConstant RESULT_ TYPE]];

    

    //保存录音文件,保存在sdk工作路径中,如未设置工作路径,则默认保存在library/cache下(为了测 试音频流识别用的)

    [_iFlySpeechRecognizer setParameter:@"asr.pcm" forKey:[IFlySpeechConstant ASR_ AUDIO_PATH]];

    

    [_iFlySpeechRecognizer setDelegate:self];

    

    BOOL ret=[_iFlySpeechRecognizer startListening];

    if (ret) {

        NSLog(@"启动成功");

    }else{

        [_popUpView showText:@"启动失败"];

    }

}


//停止录音

- (void)stopButtonClick

{

    NSLog(@"stop");

    [_iFlySpeechRecognizer stopListening];

    [_textView resignFirstResponder];

}

//取消录音

- (void)cancelButtonClick

{

    NSLog(@"cancel");

    [_iFlySpeechRecognizer cancel];

    [_textView resignFirstResponder];

}


回调方法

#pragma mark - IFlySpeechRecognizerDelegate


/**

  音量回调函数

  volume 030

  ****/

- (void) onVolumeChanged: (int)volume

{

    if (self.isCanceled) {

        [_popUpView removeFromSuperview];

        return;

    }

    

    NSString * vol = [NSString stringWithFormat:@"音量:%d",volume];

    [_popUpView showText: vol];

}


/**

  开始识别回调

  ****/

- (void) onBeginOfSpeech

{

    NSLog(@"onBeginOfSpeech");

    [_popUpView showText: @"正在录音"];

}


/**

  停止录音回调

  ****/

- (void) onEndOfSpeech

{

    NSLog(@"onEndOfSpeech");

    

    [_popUpView showText: @"停止录音"];

}


/**

  听写结束回调(注:无论听写是否正确都会回调)

  error.errorCode =

  0     听写正确

  other 听写出错

  ****/

- (void)onError:(IFlySpeechError *)error

{

    NSLog(@"%s",__func__);

    NSString *text;

    

    if (self.isCanceled) {

        text=@"识别取消";

    }else if (error.errorCode==0){

        if (self.result.length==0) {

            text=@"无识别结果";

        }else{

            text=@"识别成功";

        }

    }else{

        text=[NSString stringWithFormat:@"发生错误:%d %@",error.errorCode,error .errorDesc];;

        NSLog(@"%@",text);

    }

    

}


/**

 无界面,听写结果回调

  results:听写结果

  isLast:表示最后一次

  ****/


- (void)onResults:(NSArray *)results isLast:(BOOL)isLast

{

    NSMutableString *resultString=[[NSMutableString alloc]init];

    NSDictionary *dic=results[0];

    for (NSString *key in dic) {

        [resultString appendFormat:@"%@",key];

    }

    self.result=[NSString stringWithFormat:@"%@%@",self.textView.text,resultString ];

    NSString *resultFromJson=[ISRDataHelper stringFromJson:resultString];

    self.textView.text=[NSString stringWithFormat:@"%@%@",_textView.text,resultFro mJson];

    if (isLast) {

        NSLog(@"听说结果(json:%@测试",self.result);

    }

    NSLog(@"_result=%@",_result);

    NSLog(@"resultFromJson=%@",resultFromJson);

    NSLog(@"isLast=%d,_textView.text=%@",isLast,_textView.text);

    

}


/**

  听写取消回调

  ****/

- (void) onCancel

{

    NSLog(@"识别取消");

}



对比百度语音识别的SDK,科大讯飞的SDK更新比较快速,百度语音识别的SDK最新版本还是15年更新的, 并且给的实例Demo用的全是自动内存管理,文档上的集成方式也不一样,当时集成百度语音识别时候也出现 各种问题,相对还是科大讯飞的使用起来简单粗暴,官方下载的Demo看起来也比较有条理。不过百度语音识 别可以在边说话边识别出结果,而科大讯飞的必须要说完之后才能把结果全部返回。


2016-07-06 16:37:35 victor_barnett 阅读数 3550
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    6112 人正在学习 去看看 杨波

        用了半天时间弄明白了在iOS上如何配置语音识别功能,然后用半天时间写了一个demo,公司坑爹的是不用科大飞讯的语音识别,而使用的是OpenEars,用google查了一下最新的介绍文章是2013年的,OpenEars是一款国外比较主流的语音识别的第三方框架,全是英文文档(吐槽一下,做开发必须要学好英语啊).

1.什么是OpenEars?

        OpenEars是面向iOS平台的一个离线的语音识别和text-to-speech(文字语音转换)开发工具包.OpenEars主要是针对英语,也支持中文的语言包,但是我感觉它的识别性不是太好.最重要的是,这是一款免费的工具包,除了基本的免费功能,它还提供了可以用来扩展基本功能的付费插件.今天主要介绍的是它的免费功能,即简单的语音识别功能.


        当前OpenEars的最新版本为2.5,下载地址为http://www.politepix.com/wp-content/uploads/OpenEarsDistribution.tar.bz2


2.详细配置OpenEars的步骤

(1)点击上方链接下载OpenEars的扩展包,打击打开扩展包,里面有一个Framework的文件夹,将这个文件拖进你的工程文件中.然后检查这个文件的路径(正常情况下Xcode会为你自动添加好文件的路径),点击你的工程文件,然后点击Build Settings,在搜索输入框输入Framework Search Paths,右键点击刚刚添加的Framework文件夹,然后show in finder即可查看文件的路径,核对两个路径是否正确.不正确或者不存在,手动添加即可.见图


核对检查好路径之后,为了添加二进制文件的存储,需要将Build Settings里的Deployment Postprocessing设置为YES.然后添加AudioToolbox库和AVFoundation库到你的项目里边.



(2)在你需要进行语音识别的.m文件下引入头文件,需引入头文件如下:


在你需要进行语音识别的.h文件下引入头文件,需引入头文件如下:


然后跟你需要实现语音识别的文件下引入协议(绿色<>部分为需要引入的协议),例如


并将OEEventsObserver属性添加到您的其他类属性(OEEventsObserver必须您的类的属性,否则它不会工作):



然后在viewDidLoad或者你需要的地方进行初始化观察者并签订协议:



下一步是创建你需要使用到的语音类文件,这决定你将使用什么语言进行识别,在viewDidLoad或者其他地方均可,具体实现如下:


其中的words是你创建的需要识别的单词.

最后在你需要开启语音识别的地方添加如下方法,开启语音识别:



其中你注册的观察者签订的协议方法如下所示



包含中文和英文声学模型的demo地址:Demo地址



2020-03-20 10:52:48 qq_41241504 阅读数 32
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    6112 人正在学习 去看看 杨波

       

js

const app = getApp();
//引入插件:微信同声传译
const plugin = requirePlugin('WechatSI');
//获取全局唯一的语音识别管理器recordRecoManager
const manager = plugin.getRecordRecognitionManager();
const db = wx.cloud.database();
Page({

  /**
   * 页面的初始数据
   */
  data: {
    play_stop: 2,
    textInputTis: 1,
    tis: '按住 说话',
    //语音
    recordState: false, //录音状态
    content: '', //内容
    answer: '', //答案
    src: '', //答案语音
    // 当is_clock为true时识别
    is_clock: true,
    list: [{
      type: 2,
      src: '',
      text: '智能人机聊天!',
    },
    ]
  },
  // 发送消息
  sendOut(e) {
    var that = this
    console.log(1111, e)
    let text = e.detail.value
    if (text == '') {
      wx.showToast({
        title: '请输入聊天内容',
        icon: 'none',
      })
    } else {
      let arr = {
        type: 1,
        src: '',
        text: text
      };
      var a = that.data.list;
      a.push(arr)
      that.setData({
        content: text,
        list: a,
        title: ''
      })
      this.answer()
    }
  },
  // 语音文字切换
  textInputTis() {
    console.log('this.data.textInputTis', this.data.textInputTis)
    if (this.data.textInputTis == 1) {
      this.setData({
        textInputTis: 2
      })
    } else if (this.data.textInputTis == 2) {
      this.setData({
        textInputTis: 1
      })
    }
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function(options) {
    // 


    //识别语音
    this.initRecord();
  },
  onReady() {
    //创建内部 audio 上下文 InnerAudioContext 对象。
    this.innerAudioContext = wx.createInnerAudioContext();
    this.innerAudioContext.onError(function(res) {
      console.log(res);
     this.setData({
       play_stop:1,
     })
    })
  },
  //识别语音 -- 初始化
  initRecord: function() {
    const that = this;

    // 有新的识别内容返回,则会调用此事件
    manager.onRecognize = function(res) {
      console.log(res)
    }
    // 正常开始录音识别时会调用此事件
    manager.onStart = function(res) {
      console.log("成功开始录音识别", res)
    }
    // 识别错误事件
    manager.onError = function(res) {
      console.error("error msg", res)
    }
    //识别结束事件
    manager.onStop = function(res) {
      console.log('..............结束录音')
      console.log('录音临时文件地址 -->' + res.tempFilePath);
      console.log('录音总时长 -->' + res.duration + 'ms');
      console.log('文件大小 --> ' + res.fileSize + 'B');
      console.log('语音内容 --> ' + res.result);
      if (that.data.is_clock == true) {
        // 语音结束识别


        if (res.result == '') {
          wx.showModal({
            title: '提示',
            content: '听不清楚,请重新说一遍!',
            showCancel: false,
            success: function(res) {}
          })
          return;
        }


        var text = res.result;
        text = text.replace(/[\ |\。|\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?]/g, "");
        console.log('text', text)
        let arr = {
          type: 1,
          src: res.tempFilePath,
          text: res.result
        };
        var a = that.data.list;
        a.push(arr)
        console.log(333333333, a)
        that.setData({
          content: text,
          list: a,
        })
        that.answer();
        that.bottom()
      } else {
        console.log('取消')
        that.setData({
          is_clock: true,
        })
      }
    }
  },
  // 匹配答案
  answer() {
    this.stoppreviewImage()
    // console.log('list',this.data.list)
    var that = this
    let content = this.data.content
    db.collection("yuyin").where({
      daan: {
        $regex: '.*' + content + '.*',
        $options: '1'
      }
    }).get({
      success: res => {
        console.log('匹配', res)
        if (res.data.length == 0) {
          wx.showModal({
            title: '提示',
            content: '暂时没找到对应答案',
            showCancel: false,
            success: function(res) {}
          })
          return;
        }
        that.setData({
          answer: res.data[0].yuyin
        })
        this.wordYun()
      }
    })
  },
  bottom() {
    var that = this;
    this.setData({
      scrollTop: 100000
    })
  },
  // 答案文字转语音
  wordYun: function(e) {
    var that = this
    var that = this;
    let content = that.data.answer;
    plugin.textToSpeech({
      lang: "zh_CN",
      tts: true,
      content: content,
      success: function(res) {
        console.log(res);
        console.log("succ tts", res.filename);
        let arr = {
          type: 2,
          src: res.filename,
          text: content
        };
        var a = that.data.list;
        a.push(arr)
        that.setData({
          src: res.filename,
          list: a,

        })
        that.yuyinPlay();
        that.bottom()

      },
      fail: function(res) {
        console.log("fail tts", res)
      }
    })
  },
  // 点击并播放当前语音
  previewImage(e) {
    if (this.data.src == '') {
      console.log('暂无语音');
      return;
    }
    console.log(this.data.play_stop)
    let src = e.currentTarget.dataset.src
    if (this.data.play_stop =='play') {
   
      console.log(1238765432, src != this.data.src)
      if (src != this.data.src) {
        this.innerAudioContext.stop();
        this.innerAudioContext.src = src //设置音频地址
        this.innerAudioContext.play(); //播放音频
        this.setData({
          src: src,
          play_stop:'play',
        })

      } else {
        this.innerAudioContext.stop();
        this.setData({
          play_stop: 'stop',
        })
      }
    } else {
      this.innerAudioContext.src = this.data.src //设置音频地址
      this.innerAudioContext.play(); //播放音频
      this.setData({
        play_stop: 'play',
      })
    }

  },
  // 停止音频播放
  stoppreviewImage(e) {
    this.innerAudioContext.stop(); //播放音频
    this.setData({
      play_stop:'stop',
    })
  },
  //播放语音
  yuyinPlay: function(e) {
    if (this.data.src == '') {
      console.log('暂无语音');
      return;
    }
    this.setData({
      play_stop: 'play',
    })
    this.innerAudioContext.src = this.data.src //设置音频地址
    this.innerAudioContext.play(); //播放音频


  },
  //语音  --按住说话
  touchStart: function(e) {
    this.stoppreviewImage()
    console.log('长按')
    this.setData({
      recordState: true, //录音状态
      is_clock: true,
      startPoint: e.touches[0], //记录触摸点的坐标信息
      tis: '松开 结束'
    })
    // 语音开始识别
    manager.start({
      lang: 'zh_CN', // 识别的语言,目前支持zh_CN en_US zh_HK sichuanhua
    })
  },
  //语音  --松开结束
  touchEnd: function(e) {
    console.log('结束')
    this.setData({
      tis: '按住 说话'
    })
    manager.stop();


  },
  handleTouchMove: function(e) {
    //计算距离,当滑动的垂直距离大于25时,则取消发送语音
    if (Math.abs(e.touches[e.touches.length - 1].clientY - this.data.startPoint.clientY) > 25) {

      this.setData({
        is_clock: false //设置为不发送语音
      })
    }
  },
})

 

 

wxml

<!-- 
<view>{{content}}</view>
<view>{{answer}}</view> -->
<view class="bo">
  <scroll-view scroll-y="true" scroll-with-animation scroll-top="{{scrollTop}}">

    <block >
      <view class="body" wx:for='{{list}}' wx:key='index'>

        <view wx:if='{{item.type==1}}' class="right_body">
          <view class="flexRoe posRit">
            <view class="textBo">
              <view class="dataTime">{{item.sendOutname}} {{item.dataTime}}</view>
              <view wx:if="{{item.text!=''}}" class="ritTxt">
                <image wx:if="{{item.src!=''}}" bindtap="previewImage" mode='widthFix' data-src='{{item.src}}' src="../../img/voice.png" class="textImg"></image>
                <view>{{item.text}}</view>
              </view>

              <view wx:if="{{item.voice}}" class="ritTxt2" bindtap='my_audio_click' data-src='{{item.voice}}'>
                <image class='my_audio' src='/img/play.png'></image>
              </view>
            </view>
            <image class="head" style=" margin-left:20rpx " src="../../img/1.png"></image>
          </view>
        </view>
        <view wx:if='{{item.type==2}}' class="p_r left_body">
          <view class="flexRoe ">
            <image class="head" style=" margin-left:20rpx " src="../../img/2.png"></image>
            <view class="lfBo">
              <view class="dataTime">{{item.sendOutname}} {{item.dataTime}}</view>
              <view wx:if="{{item.text!=''}}" class="lftTxt">
                <image wx:if="{{item.src!=''}}" bindtap="previewImage" mode='widthFix' data-src='{{item.src}}' src="../../img/voice.png" class="textImg"></image>
                <view>{{item.text}}</view>
              </view>

              <view wx:if="{{item.voice}}" class="lftTxt2" bindtap='my_audio_click' data-src='{{item.voice}}'>
                <image class='my_audio' src='/img/play.png'></image>
              </view>
            </view>
          </view>
        </view>
      </view>
    </block>
  </scroll-view>
  <view class="jifBo" wx:if="{{tis=='录音中...'}}"> 
    <image src="../../img/111.gif" mode="widthFix"></image>
  </view>
  <view class="inp">

    <view class="p_r" wx:if="{{textInputTis==1}}">
     
      <view class="yuyin" bindtap="textInputTis"><image src="../../img/jp.png"  mode="widthFix"></image></view>
    
       <view class='serac_img' style="background:{{tis=='松开 结束'?'#ccc':''}}" catch:longpress="touchStart" catch:touchmove="handleTouchMove" catch:touchend="touchEnd">
       {{tis}}
      </view>
    </view>
       <view class="p_r" wx:if="{{textInputTis==2}}">
     
      <view class="yuyin" bindtap="textInputTis"><image src="../../img/jp.png"  mode="widthFix"></image></view>
    
         <input class="input" placeholder-class='plaCC' confirm-type="send" bindconfirm='sendOut' placeholder='聊天,在这里' value="{{title}}"></input>
    </view>
    <!-- <view class="p_r" wx:if="{{textInputTis==2}}">
             <view class="yuyin" bindtap="textInputTis"><image src="../../img/yn.png"  mode="widthFix"></image></view>
      <input class="input" placeholder-class='plaCC' confirm-type="send" bindconfirm='sendOut' placeholder='聊天,在这里' value="{{title}}"></input>

    </view> -->
  </view>
</view>

 css

page {
  background: #f2f2f2;
height: 100%;
overflow: hidden
}

.top_bo {
  display: flex;
  background: white;
  flex-direction: row;
}

.top_bo view {
  flex: 1;
  font-size: 28rpx;
  text-align: center;
  border: 1rpx solid #ccc;
  line-height: 80rpx;
}

scroll-view {
  height: 84vh;
    overflow: hidden;
  padding-bottom: 100rpx;
  padding-top:50rpx;
}

.noList {
  background: white;
  margin-top: 30rpx;
  /* height: 230rpx; */
  width: 100%;
  /* padding-top: 25%; */
}

.noMsg {
  text-align: center;
  color: #999;
  font-size: 28rpx;
}

.inp {
  position: absolute;
  bottom: 0;
  width: 100%;
  background: #e0e0e0;
  height: 100rpx;
  padding:  10rpx 0;
}

.inp input {
  background: #d0d0d0;
  border-radius: 15rpx;
  padding-left: 20rpx;
  height: 84rpx;
  /* margin-left: 2%; */

    width:80%;
  background: #fff;
  /* padding-left: 20rpx; */
  /* height: 84rpx; */
  margin-top: 10rpx;
  line-height: 80rpx;
  font-size: 32rpx;
  color: #0a0a0a


}

.yuyin {
  /* width: 60rpx */
  /* background: #00a9ec; */
  border-radius: 15rpx;
  height: 84rpx;
  line-height: 84rpx;
  color: #fff;
  padding: 0 10rpx;
  margin-left: 10rpx;
  margin-top: 10rpx;
  text-align: center;
}
.yuyin image{
  width: 60rpx;
  margin:15rpx 10rpx 0 10rpx;

}
.prohibit {
  background: #d0d0d0;
  border-radius: 15rpx;
  padding-left: 20rpx;
  height: 84rpx;
  margin-top: 10rpx;
  width: 94%;
  margin-left: 2%;
  text-align: center;
  line-height: 84rpx;
  color: rgb(34, 34, 34);
}

.plaCC {
  margin-left: 5rpx;
}

.p_r {
  display: flex;
  flex-direction: row;
}

.flexRoe {
  display: flex;
  flex-direction: row;
}

.body {
  width: 100%;
  position: relative;
  /* border: 1rpx solid #ccc; *//* height: 200rpx */
}

.right_body {
  width: 100%;
  /* border: 1rpx solid red; */
  padding: 20rpx;
  /* margin-top: 50rpx; */
}

.left_body {
  /* margin-top: 50rpx; */
}

.posRit {
  right: 20rpx;
}

.textBo {
  width: 620rpx;
  text-align: right;
}

.lfBo {
  margin-left: 10rpx;
}

.ritTxt {
  background: #44426a;
  padding: 10rpx 20rpx 10rpx 20rpx;
  color: white;
  border-radius: 15rpx 0 15rpx 15rpx;
  margin-top: 20rpx;
  float: right;
  max-width: 500rpx;
  word-wrap: break-word;
  text-align: left;
  font-size: 28rpx;
}

.lftTxt {
  background: #44426a;
  padding: 10rpx 20rpx 10rpx 20rpx;
  color: white;
  border-radius: 0rpx 15rpx 15rpx 15rpx;
  margin-top: 20rpx;
  float: left;
  max-width: 500rpx;
  word-wrap: break-word;
  text-align: left;
  font-size: 28rpx;
}

.my_audio {
  height: 60rpx;
  width: 60rpx;
  z-index: 2;
  position: relative;
  top: 10rpx;
  left: 20rpx;
  margin-right: 30rpx;
}

.dataTime {
  font-size: 28rpx;
}

.textImg {
  width: 50rpx;
  margin-top: 5rpx;
}

.head {
  width: 80rpx;
  height: 80rpx;
}

._ {
  height: 130rpx;
  width: 100%;
  background: #ccc;
}

.serac_img {
  width: 80%;
  background: #fff;
  border-radius: 15rpx;
  /* padding-left: 20rpx; */
  /* height: 84rpx; */
  margin-top: 10rpx;
  margin-left: 2%;
  text-align: center;
  line-height: 80rpx;
  font-size: 32rpx;
  color: #0a0a0a
}

.serac_img view {
  width: 70%;
  text-align: right;
  line-height: 80rpx;
  color: #bfbfbf;
}

.serac_img image {
  width: 50rpx;
  margin-top: 25rpx;
}
.jifBo{
  position: absolute;
  top: 0;
  left: 0;
  background: rgba(0, 0, 0, 0.5);
  width: 100%;
  height: 100%;
}
.jifBo image{
  width: 40%;
  margin-left: 30%;
  margin-top: 50%;
  
}

 

 

2020-03-12 15:29:54 weixin_42460570 阅读数 130
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    6112 人正在学习 去看看 杨波

需求:语音实时转换文字

步骤1:

首先我们要添加腾讯云智能语音插件

步骤2:

插件文档地址:

https://mp.weixin.qq.com/wxopen/plugindevdoc?appid=wx3e17776051baf153&token=262289731&lang=zh_CN

按照文档步骤我们首先要对app.json进行声明配置

步骤3

在开发之前大家要先去注册一个腾讯云账号,生成密钥,key,我们才能完成此功能.

步骤4

我们有了腾讯云账号信息及需要用到的信息之后,进去我们的开发阶段

wxml:

<button bindtap="recordingStart">
  开始录音
</button>
<button bindtap="recordingStop">
  结束
</button>
<view>{{text}}</view>

js

var plugin = requirePlugin("QCloudAIVoice")
let manager = plugin.getRecordRecognitionManager()
let appid = 130******
let secretid = 'AKID1rRoOm4o*******n4D9BSxH'
let secretkey = 'KPGwNY******xObaO3U'
let openConsole = false
plugin.setQCloudSecret(appid, secretid, secretkey, openConsole) //设置腾讯云账号信息,其中appid是数字,secret是字符串,
var options = {
    duration: 30000,
    engine_model_type:'16k_0'
};
Page({
    /**
     * 页面的初始数据
     */
    data: {
        text: ''
    },
    recordingStart() {
        let that = this;
        manager.start()
        manager.onRecognize((res) => {
            if (res.result) {
                that.setData({
                    text: res.result
                })
                console.log("current result", res.result)
            } else if (res.errMsg) {
                console.log("recognize error", res.errMsg)
            }
        })
    },
    recordingStop() {
        manager.stop()
    },
})

这样就可以实现语音实时转写了,插件很方便,唯一的限制就是音频时长60秒限制,帮助到大家的记得关注,点赞!

 

喜欢上方小程序,需要源码的,私信小编留下邮箱。

语音聊天机器人

阅读数 4094

没有更多推荐了,返回首页