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中的if、else、elif语句用法简明讲解
Mar 11 Python
20招让你的Python飞起来!
Sep 27 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
May 09 Python
python利用百度AI实现文字识别功能
Nov 27 Python
对Python信号处理模块signal详解
Jan 09 Python
python实现用类读取文件数据并计算矩形面积
Jan 18 Python
python代码区分大小写吗
Jun 17 Python
python实现人性化显示金额数字实例详解
Sep 25 Python
利用python批量爬取百度任意类别的图片的实现方法
Oct 07 Python
python asyncio 协程库的使用
Jan 21 Python
浅谈Python xlwings 读取Excel文件的正确姿势
Feb 26 Python
Python利用FlashText算法实现替换字符串
Mar 31 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的构造方法,析构方法和this关键字详细介绍
2013/10/22 PHP
php获取远程文件大小
2015/10/20 PHP
PHP实现原比例生成缩略图的方法
2016/02/03 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
2016/03/18 PHP
javascript iframe中打开文件,并检测iframe存在否
2008/12/28 Javascript
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
javascript使用avalon绑定实现checkbox全选
2015/05/06 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
2015/09/09 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
jQuery中选择器的基础使用教程
2016/05/23 Javascript
教你一步步用jQyery实现轮播器
2016/12/18 Javascript
javascript实现去除HTML标签的方法
2016/12/26 Javascript
详解react-native-fs插件的使用以及遇到的坑
2017/09/12 Javascript
jQuery响应滚动条事件功能示例
2017/10/14 jQuery
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
微信小程序实现选项卡效果
2018/11/06 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
Angular单元测试之事件触发的实现
2020/01/20 Javascript
python爬取w3shcool的JQuery课程并且保存到本地
2017/04/06 Python
python利用socketserver实现并发套接字功能
2018/01/26 Python
python 批量解压压缩文件的实例代码
2019/06/27 Python
python输出带颜色字体实例方法
2019/09/01 Python
Python3列表List入门知识附实例
2020/02/09 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
2020/02/12 Python
Python爬虫爬取、解析数据操作示例
2020/03/27 Python
豪华床上用品 :Jennifer Adams
2019/09/15 全球购物
关于雷锋的演讲稿
2014/05/10 职场文书
群众路线教育实践活动学习笔记内容
2014/11/06 职场文书
后勤个人工作总结
2015/02/28 职场文书
2015年度电厂个人工作总结
2015/05/13 职场文书
建国大业观后感600字
2015/06/01 职场文书
党员干部学习心得体会
2016/01/23 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书
学会Python数据可视化必须尝试这7个库
2021/06/16 Python
sql时间段切分实现每隔x分钟出一份高速门架车流量
2022/02/28 SQL Server