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实现基于两张图片生成圆角图标效果的方法
Mar 26 Python
解决Python requests 报错方法集锦
Mar 19 Python
Python Numpy 数组的初始化和基本操作
Mar 13 Python
python实现比较文件内容异同
Jun 22 Python
Django Rest framework之认证的实现代码
Dec 17 Python
python之线程通过信号pyqtSignal刷新ui的方法
Jan 11 Python
Django框架登录加上验证码校验实现验证功能示例
May 23 Python
python3实现单目标粒子群算法
Nov 14 Python
tensorflow 初始化未初始化的变量实例
Feb 06 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
Apr 22 Python
Python3创建Django项目的几种方法(3种)
Jun 03 Python
Python创建SQL数据库流程逐步讲解
Sep 23 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 获取远程网页内容的代码(fopen,curl已测)
2011/06/06 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
PHP中trim()函数简单使用指南
2015/04/16 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
2015/12/17 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
使用PHP json_decode可能遇到的坑与解决方法
2017/08/03 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
jQuery对象和DOM对象相互转化
2009/04/24 Javascript
JS数学函数Exp使用说明
2012/08/09 Javascript
JS获取各种宽度、高度的简单介绍
2014/12/19 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
JS动态修改iframe内嵌网页地址的方法
2015/04/01 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
从0开始学Vue
2016/10/27 Javascript
jQuery实现的隔行变色功能【案例】
2019/02/18 jQuery
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
浅谈python对象数据的读写权限
2016/09/12 Python
Python中模块string.py详解
2017/03/12 Python
Python中交换两个元素的实现方法
2018/06/29 Python
在python image 中实现安装中文字体
2020/05/16 Python
纯CSS和jQuery实现的在页面顶部显示的进度条效果2例(仿手机浏览器进度条效果)
2014/04/16 HTML / CSS
HTML5触摸事件(touchstart、touchmove和touchend)的实现
2020/05/08 HTML / CSS
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
戛纳奢侈品商店:Jacques Loup法国
2019/11/04 全球购物
主键(Primary Key)约束和唯一性(UNIQUE)约束的区别
2013/05/29 面试题
暑期实践思想汇报
2014/01/06 职场文书
电脑租赁公司创业计划书
2014/01/08 职场文书
计算机专业自荐信
2014/05/24 职场文书
2015年大学生村官工作总结
2015/04/21 职场文书
员工安全责任协议书
2016/03/22 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
vue实现水波涟漪效果的点击反馈指令
2021/05/31 Vue.js
python使用BeautifulSoup 解析HTML
2022/04/24 Python
Elasticsearch6.2服务器升配后的bug(避坑指南)
2022/09/23 Servers