python调用百度语音REST API


Posted in Python onAugust 30, 2018

本文实例为大家分享了python调用百度语音REST API的具体代码,供大家参考,具体内容如下

(百度的rest接口的部分网址发生了一定的变化,相关代码已更新)

百度通过 REST API 的方式给开发者提供一个通用的 HTTP 接口,基于该接口,开发者可以轻松的获得语音合成与语音识别能力。SDK中只提供了PHP、C和JAVA的相关样例,使用python也可以灵活的对端口进行调用,本文描述了简单使用Python调用百度语音识别服务 REST API 的简单样例。

1、语音识别与语音合成的调用

注册开发者帐号和创建应用的过程就不再赘述,百度的REST API在调用过程基本分为三步:

  • 获取token
  • 向Rest接口提交数据
  • 处理返回数据

具体代码如下所示:

#!/usr/bin/python3

import urllib.request
import urllib
import json
import base64
class BaiduRest:
  def __init__(self, cu_id, api_key, api_secert):
    # token认证的url
    self.token_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s"
    # 语音合成的resturl
    self.getvoice_url = "http://tsn.baidu.com/text2audio?tex=%s&lan=zh&cuid=%s&ctp=1&tok=%s"
    # 语音识别的resturl
    self.upvoice_url = 'http://vop.baidu.com/server_api'

    self.cu_id = cu_id
    self.getToken(api_key, api_secert)
    return

  def getToken(self, api_key, api_secert):
    # 1.获取token
    token_url = self.token_url % (api_key,api_secert)

    r_str = urllib.request.urlopen(token_url).read()
    token_data = json.loads(r_str)
    self.token_str = token_data['access_token']
    pass

  def getVoice(self, text, filename):
    # 2. 向Rest接口提交数据
    get_url = self.getvoice_url % (urllib.parse.quote(text), self.cu_id, self.token_str)

    voice_data = urllib.request.urlopen(get_url).read()
    # 3.处理返回数据
    voice_fp = open(filename,'wb+')
    voice_fp.write(voice_data)
    voice_fp.close()
    pass

  def getText(self, filename):
    # 2. 向Rest接口提交数据
    data = {}
    # 语音的一些参数
    data['format'] = 'wav'
    data['rate'] = 8000
    data['channel'] = 1
    data['cuid'] = self.cu_id
    data['token'] = self.token_str
    wav_fp = open(filename,'rb')
    voice_data = wav_fp.read()
    data['len'] = len(voice_data)
    data['speech'] = base64.b64encode(voice_data).decode('utf-8')
    post_data = json.dumps(data)
    r_data = urllib.request.urlopen(self.upvoice_url,data=bytes(post_data,encoding="utf-8")).read()
    # 3.处理返回数据
    return json.loads(r_data)['result']

if __name__ == "__main__":
  # 我的api_key,供大家测试用,在实际工程中请换成自己申请的应用的key和secert
  api_key = "SrhYKqzl3SE1URnAEuZ0FKdT" 
  api_secert = "hGqeCkaMPb0ELMqtRGc2VjWdmjo7T89d"
  # 初始化
  bdr = BaiduRest("test_python", api_key, api_secert)
  # 将字符串语音合成并保存为out.mp3
  bdr.getVoice("你好北京邮电大学!", "out.mp3")
  # 识别test.wav语音内容并显示
  print(bdr.getText("out.wav"))

2、调用pyaudio使用麦克风录制声音

python中的pyaudio库可以直接通过麦克风录制声音,可使用pip进行安装。我们可以通过调用该库,获取到wav测试语音。
具体代码如下所示:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

from pyaudio import PyAudio, paInt16 
import numpy as np 
from datetime import datetime 
import wave

class recoder:
  NUM_SAMPLES = 2000   #pyaudio内置缓冲大小
  SAMPLING_RATE = 8000  #取样频率
  LEVEL = 500     #声音保存的阈值
  COUNT_NUM = 20   #NUM_SAMPLES个取样之内出现COUNT_NUM个大于LEVEL的取样则记录声音
  SAVE_LENGTH = 8     #声音记录的最小长度:SAVE_LENGTH * NUM_SAMPLES 个取样
  TIME_COUNT = 60   #录音时间,单位s

  Voice_String = []

  def savewav(self,filename):
    wf = wave.open(filename, 'wb') 
    wf.setnchannels(1) 
    wf.setsampwidth(2) 
    wf.setframerate(self.SAMPLING_RATE) 
    wf.writeframes(np.array(self.Voice_String).tostring()) 
    # wf.writeframes(self.Voice_String.decode())
    wf.close() 

  def recoder(self):
    pa = PyAudio() 
    stream = pa.open(format=paInt16, channels=1, rate=self.SAMPLING_RATE, input=True, 
      frames_per_buffer=self.NUM_SAMPLES) 
    save_count = 0 
    save_buffer = [] 
    time_count = self.TIME_COUNT

    while True:
      time_count -= 1
      # print time_count
      # 读入NUM_SAMPLES个取样
      string_audio_data = stream.read(self.NUM_SAMPLES) 
      # 将读入的数据转换为数组
      audio_data = np.fromstring(string_audio_data, dtype=np.short)
      # 计算大于LEVEL的取样的个数
      large_sample_count = np.sum( audio_data > self.LEVEL )
      print(np.max(audio_data))
      # 如果个数大于COUNT_NUM,则至少保存SAVE_LENGTH个块
      if large_sample_count > self.COUNT_NUM:
        save_count = self.SAVE_LENGTH 
      else: 
        save_count -= 1

      if save_count < 0:
        save_count = 0 

      if save_count > 0 : 
      # 将要保存的数据存放到save_buffer中
        #print save_count > 0 and time_count >0
        save_buffer.append( string_audio_data ) 
      else: 
      #print save_buffer
      # 将save_buffer中的数据写入WAV文件,WAV文件的文件名是保存的时刻
        #print "debug"
        if len(save_buffer) > 0 : 
          self.Voice_String = save_buffer
          save_buffer = [] 
          print("Recode a piece of voice successfully!")
          return True
      if time_count==0: 
        if len(save_buffer)>0:
          self.Voice_String = save_buffer
          save_buffer = [] 
          print("Recode a piece of voice successfully!")
          return True
        else:
          return False

if __name__ == "__main__":
  r = recoder()
  r.recoder()
  r.savewav("test.wav")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python常见异常分类与处理方法
Jun 04 Python
django中的HTML控件及参数传递方法
Mar 20 Python
Python 查找字符在字符串中的位置实例
May 02 Python
使用Python监视指定目录下文件变更的方法
Oct 15 Python
Django ORM多对多查询方法(自定义第三张表&amp;ManyToManyField)
Aug 09 Python
使用python写的opencv实时监测和解析二维码和条形码
Aug 14 Python
python 进程间数据共享multiProcess.Manger实现解析
Sep 23 Python
python实现LRU热点缓存及原理
Oct 29 Python
使用Keras加载含有自定义层或函数的模型操作
Jun 10 Python
django中cookiecutter的使用教程
Dec 03 Python
python解包用法详解
Feb 17 Python
深度学习小工程练习之垃圾分类详解
Apr 14 Python
python调用百度语音识别api
Aug 30 #Python
python实现ID3决策树算法
Aug 29 #Python
python实现C4.5决策树算法
Aug 29 #Python
python机器学习之KNN分类算法
Aug 29 #Python
深入理解python中sort()与sorted()的区别
Aug 29 #Python
Python实现拷贝/删除文件夹的方法详解
Aug 29 #Python
Python读写zip压缩文件的方法
Aug 29 #Python
You might like
php google或baidu分页代码
2009/11/26 PHP
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
深入PHP中的HashTable结构详解
2013/06/13 PHP
php上传图片并压缩的实现方法
2015/12/22 PHP
js鼠标左右键 键盘值小结
2010/06/11 Javascript
Jquery实现自定义弹窗示例
2014/03/12 Javascript
javascript中为某个元素指定事件的三种方式
2014/08/07 Javascript
jQuery unbind()方法实例详解
2016/01/19 Javascript
三分钟带你玩转jQuery.noConflict()
2016/02/15 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
详解Nodejs的timers模块
2016/12/22 NodeJs
Node.js 回调函数实例详解
2017/07/06 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
浅谈vue项目打包优化策略
2018/09/29 Javascript
微信小程序日历效果
2018/12/29 Javascript
[02:37]2018DOTA2亚洲邀请赛赛前采访-EG篇
2018/04/03 DOTA
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
2015/05/05 Python
python下载图片实现方法(超简单)
2017/07/21 Python
Python简单定义与使用字典dict的方法示例
2017/07/25 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
Ranorex通过Python将报告发送到邮箱的方法
2020/01/12 Python
墨尔本最受欢迎的复古风格品牌:Princess Highway
2018/12/21 全球购物
荷兰的时尚市场:To Be Dressed
2019/05/06 全球购物
奥林匹亚体育:Olympia Sports
2020/12/30 全球购物
买房子个人收入证明
2014/01/16 职场文书
小学教学随笔感言
2014/02/26 职场文书
小学作文评语大全
2014/04/21 职场文书
争当四好少年演讲稿
2014/09/13 职场文书
村委会贫困证明范本
2014/09/17 职场文书
领导干部贪图享乐整改措施
2014/09/21 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
干部作风建设个人剖析材料
2014/10/11 职场文书
五好家庭事迹材料
2014/12/20 职场文书
党支部半年考察意见
2015/06/01 职场文书
创业计划书之熟食店
2019/10/16 职场文书
Python的代理类实现,控制访问和修改属性的权限你都了解吗
2022/03/21 Python