python调用百度语音api_python通过调用百度api实现语音识别(超详细)

人工智能117

最近在学习python,做一些python练习题

github上几年前的练习题

有一题是这样的:

使用 Python 实现:对着电脑吼一声,自动打开浏览器中的默认网站。

例如,对着笔记本电脑吼一声"百度",浏览器自动打开百度首页。

然后开始search相应的功能需要的模块(windows10),理一下思路:

本地录音

上传录音,获得返回结果

组一个map,根据结果打开相应的网页

所需模块:

PyAudio:录音接口

wave:打开录音文件并设置音频参数

requests:GET/POST

为什么要用百度语音识别api呢?因为免费试用。。

不多说,登录百度云,创建应用

查看文档REST API文档

文档写的蛮详细的,简单概括就是

可以下载使用SDK

不需要下载使用SDK

选择2.

根据文档组装url获取token

处理本地音频以JSON格式POST到百度语音识别服务器,获得返回结果

语音格式

格式支持:pcm(不压缩)、wav(不压缩,pcm编码)、amr(压缩格式)。推荐pcm 采样率 :16000 固定值。 编码:16bit 位深的单声道。

百度服务端会将非pcm格式,转为pcm格式,因此使用wav、amr会有额外的转换耗时。

保存为pcm格式可以识别,只是windows自带播放器识别不了pcm格式的,所以改用wav格式,毕竟用的模块是wave?

首先是本地录音

import wave

from pyaudio import PyAudio, paInt16

framerate = 16000 # 采样率

num_samples = 2000 # 采样点

channels = 1 # 声道

sampwidth = 2 # 采样宽度2bytes

FILEPATH = 'speech.wav'

def save_wave_file(filepath, data):

wf = wave.open(filepath, 'wb')

wf.setnchannels(channels)

wf.setsampwidth(sampwidth)

wf.setframerate(framerate)

wf.writeframes(b''.join(data))

wf.close()

录音

def my_record():

pa = PyAudio()

打开一个新的音频stream

stream = pa.open(format=paInt16, channels=channels,

rate=framerate, input=True, frames_per_buffer=num_samples)

my_buf = [] #存放录音数据

t = time.time()

print('正在录音...')

while time.time() < t + 4: # 设置录音时间(秒)

循环read,每次read 2000frames

string_audio_data = stream.read(num_samples)

my_buf.append(string_audio_data)

print('录音结束.')

save_wave_file(FILEPATH, my_buf)

stream.close()

然后是获取token

import requests

import base64 #百度语音要求对本地语音二进制数据进行base64编码

组装url获取token,详见文档

base_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s"

APIKey = "LZAdqHUGC**mbfKm"

SecretKey = "WYPPwgHu*BU6GM****"

HOST = base_url % (APIKey, SecretKey)

def getToken(host):

res = requests.post(host)

return res.json()['access_token']

传入语音二进制数据,token

dev_pid为百度语音识别提供的几种语言选择

def speech2text(speech_data, token, dev_pid=1537):

FORMAT = 'wav'

RATE = '16000'

CHANNEL = 1

CUID = '**'

SPEECH = base64.b64encode(speech_data).decode('utf-8')

data = {

'format': FORMAT,

'rate': RATE,

'channel': CHANNEL,

'cuid': CUID,

'len': len(speech_data),

'speech': SPEECH,

'token': token,

'dev_pid':dev_pid

}

url = 'https://vop.baidu.com/server_api'

headers = {'Content-Type': 'application/json'}

r=requests.post(url,data=json.dumps(data),headers=headers)

print('正在识别...')

r = requests.post(url, json=data, headers=headers)

Result = r.json()

if 'result' in Result:

return Result['result'][0]

else:

return Result

最后就是对返回的结果进行匹配,这里使用webbrowser这个模块

webbrower.open(url)

完整demo

!/usr/bin/env python

-- coding: utf-8 --

Date : 2018-12-02 19:04:55

import wave

import requests

import time

import base64

from pyaudio import PyAudio, paInt16

import webbrowser

framerate = 16000 # 采样率

num_samples = 2000 # 采样点

channels = 1 # 声道

sampwidth = 2 # 采样宽度2bytes

FILEPATH = 'speech.wav'

base_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s"

APIKey = "**"

SecretKey = "**"

HOST = base_url % (APIKey, SecretKey)

def getToken(host):

res = requests.post(host)

return res.json()['access_token']

def save_wave_file(filepath, data):

wf = wave.open(filepath, 'wb')

wf.setnchannels(channels)

wf.setsampwidth(sampwidth)

wf.setframerate(framerate)

wf.writeframes(b''.join(data))

wf.close()

def my_record():

pa = PyAudio()

stream = pa.open(format=paInt16, channels=channels,

rate=framerate, input=True, frames_per_buffer=num_samples)

my_buf = []

count = 0

t = time.time()

print('正在录音...')

while time.time() < t + 4: # 秒

string_audio_data = stream.read(num_samples)

my_buf.append(string_audio_data)

print('录音结束.')

save_wave_file(FILEPATH, my_buf)

stream.close()

def get_audio(file):

with open(file, 'rb') as f:

data = f.read()

return data

def speech2text(speech_data, token, dev_pid=1537):

FORMAT = 'wav'

RATE = '16000'

CHANNEL = 1

CUID = '*'

SPEECH = base64.b64encode(speech_data).decode('utf-8')

data = {

'format': FORMAT,

'rate': RATE,

'channel': CHANNEL,

'cuid': CUID,

'len': len(speech_data),

'speech': SPEECH,

'token': token,

'dev_pid':dev_pid

}

url = 'https://vop.baidu.com/server_api'

headers = {'Content-Type': 'application/json'}

r=requests.post(url,data=json.dumps(data),headers=headers)

print('正在识别...')

r = requests.post(url, json=data, headers=headers)

Result = r.json()

if 'result' in Result:

return Result['result'][0]

else:

return Result

def openbrowser(text):

maps = {

'百度': ['百度', 'baidu'],

'腾讯': ['腾讯', 'tengxun'],

'网易': ['网易', 'wangyi']

}

if text in maps['百度']:

webbrowser.open_new_tab('https://www.baidu.com')

elif text in maps['腾讯']:

webbrowser.open_new_tab('https://www.qq.com')

elif text in maps['网易']:

webbrowser.open_new_tab('https://www.163.com/')

else:

webbrowser.open_new_tab('https://www.baidu.com/s?wd=%s' % text)

if name == 'main':

flag = 'y'

while flag.lower() == 'y':

print('请输入数字选择语言:')

devpid = input('1536:普通话(简单英文),1537:普通话(有标点),1737:英语,1637:粤语,1837:四川话\n')

my_record()

TOKEN = getToken(HOST)

speech = get_audio(FILEPATH)

result = speech2text(speech, TOKEN, int(devpid))

print(result)

if type(result) == str:

openbrowser(result.strip(','))

flag = input('Continue?(y/n):')

经测试,大吼效果更佳

Original: https://blog.csdn.net/weixin_35400275/article/details/112957934
Author: 馍菌
Title: python调用百度语音api_python通过调用百度api实现语音识别(超详细)



相关阅读

Title: 【车道线检测论文阅读笔记——经典论文粗读汇总】

[阅读心得] 车道线检测论文粗读笔记

前言

  1. 本篇目的:熟悉自动驾驶基本知识,了解自动驾驶领域的写作思路。顺便记录一下各个论文的主要工作
  2. 预计完成时间:一周内完成
  3. 日志:
    1) 1.4日:完成seg部分论文粗读以及SCNN论文的精读,明天开始mask部分论文粗读
    2) 1.5日:完成mask部分粗读2篇
    3) 1.6日:完成其余全部论文,并整理、分类完成。

一、Segmentation

把车道线检测视作 semantic segmentation任务来做,这是较早被提出也是相对主流的车道线检测任务的解决方案。下述工作都基本延续着这一个思路在做。

1. SCNN

[论文] Spatial As Deep: Spatial CNN for Traffic Scene Understanding
[代码] https://github.com/XingangPan/SCNN
python调用百度语音api_python通过调用百度api实现语音识别(超详细)
创新点: 提出了一种新的卷积方式: Spatial CNN,充分利用图像的空间信息。用更少的计算代价在"细长"、"大型"的物体上概括能力都很强。且引入了SCNN的baseline在车道线检测任务和语义分割任务上表现效果优异,达到了当时的SOTA水平。此外还建立了一个新的车道线检测数据集。
为什么: 由于车道线的外观信息较少、先验几何约束较明显,而CNN对同一层空间的信息利用不够、传统的方法MRF、CRF需要计算成本过高,不能满足实时性,因此需要一种计算效率高且能充分利用空间信息的方法检测车道线。
怎么做: 提出SCNN,对浅层特征体横向、竖向切开,用CNN分别对单层卷积,从四个方向(U,D,R,L)然后类似Residual Connect的方法连接下一层,从而实现在同一层之间空间信息的传播。
思考: 在2017年提出的这一方法,确实对空间信息的利用更好,但是这种传播方式类似RNN,无法做到并行计算,所以计算成本仍然比较高,笔者认为如今可以尝试使用Transformer结构达到更好的效果。

; 2. ENet

[论文] ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation
python调用百度语音api_python通过调用百度api实现语音识别(超详细)
创新点: 提出了一种轻量化的端到端网络结构, ENet,用于移动端语义分割。权衡了速度和精度,能够达到实时性。
为什么: 当时的CNN网络结构大多使用VGG16做backbone,且大量用到Fully Connected层,参数量巨大,计算成本高,大多需要在工作站上运行,无法在算力较弱的边缘端运行
怎么做: 提出ENet,参考了Residual Block、PRelu等方法,提高了每层CNN的效率,使最后搭建的网络结构仅用很少的参数量获得较好的效果。

; 3. LaneNet

[论文] Towards End-to-End Lane Detection: an Instance Segmentation Approach
python调用百度语音api_python通过调用百度api实现语音识别(超详细)
创新点: 提出了一种端到端的 车道线检测网络 LaneNet,能够达到50FPS。不同于先前的网络设计,LaneNet不受车道线数目变化的影响。此外,训练了一种 视角转换的网络 H-Net,更加鲁棒地完成视角变换。
为什么: 当时的车道线检测网络受限于预设好的车道线数目,不能应对车道线变换问题。
怎么做: LaneNet用两个分支分别完成分割和ID提取任务,随后聚类完成对不同车道线的区分。输出结果通过H-Net生成的单应矩阵拟合,后还原回原图。解决了车道线变化和视角波动的问题。

; 4. SAD

[论文] Learning Lightweight Lane Detection CNNs by Self Attention Distillation
[代码] https://github.com/cardwing/Codes-for-Lane-Detection

python调用百度语音api_python通过调用百度api实现语音识别(超详细)
创新点: 提出了一种基于注意力图的知识蒸馏方式,在不增加新的标签和监督需求的条件下,提高车道线检测网络的训练效果,并且只在训练时采用,推理时间没有增加。并且充分分析了SAD的使用条件。
为什么: 车道线检测作为segmentation任务存在正负样本不均衡、目标被遮挡、光线不足等困难场景的限制。之前的工作尝试从MTL(multi-task learning)和MP(message passing)两种手段提升模型的应对能力。但是MTL需要额外的人工标注、MP则占用较大推理时间,均不够理想。
怎么做: SAD是一种自监督学习的策略,在原始网络训练过一定数量的epoch后,令 当前层网络学习 下一层网络,来提高每一层网络的捕捉信息能力,从而提高整个网络的性能。并且这一策略只在训练时使用。

; 5. DSUNet

[论文] End-to-End Deep Learning of Lane Detection and Path Prediction for Real-Time Autonomous Driving
python调用百度语音api_python通过调用百度api实现语音识别(超详细)
创新点: 将Depthwise Separable Convolution引入到UNet中,提出了一种轻量化的分割网络 DSUNet,在1.6倍推理速度的情况下达到了与Unet几乎相同的性能。
为什么: 自动驾驶场景下的算力较低,必须使用轻量化的网络
怎么做: 将Unet中的常规卷积全部替换成Depthwise Conv+Pointwise Conv的组合,从而减小参数量

; 二、Mark

不同于分割方式,下述工作大多基于anchor或者key-point等模式,利用车道线的几何约束进行回归,各自工作的思想独创性比较强,百花齐放。

1. UFast

[论文] Ultra Fast Structure-aware Deep Lane Detection
[代码] https://github.com/cfzd/Ultra-Fast-Lane-Detection

python调用百度语音api_python通过调用百度api实现语音识别(超详细)
创新点: 提出了一种新的row-based范式的车道线检测网络 UFast,不同于以往的分割思路,把图像分割成row anchor与grid cell进行分类识别是否为车道线,有效解决了 计算成本过高no-visual-clue这两个问题。还提出了一种利用车道线先验信息的 structural loss。提出的方法在速度和精读两个层面均达到了SOTA。
为什么: 先前的工作大多把车道线检测看作一个semantic segmentation任务,但是这样一是会导致计算成本过高,二是没用充分利用车道线的先验信息。
怎么做: 提出新的范式 UFast,把图像按row分割成若干行,在每个行中分出若干grid cells,对每个cell进行分类识别,判断是否属于车道线,这样的做法相比segmentation任务对原图全部像素进行处理,参数量大幅减小,同时显式地展示了车道线的位置信息,方便后面利用先验提升精度。随后,利用同一车道线相邻处距离近和车道线多为直线两个先验信息提出 两种loss,提高训练效果。最后,在训练中利用增加seg任务分支,增加网络的特征融合能力,防止只训练classification任务会过早饱和而影响性能。

; 2. FOLOLane

[论文] Focus on Local: Detecting Lane Marker from Bottom Up via Key Point
python调用百度语音api_python通过调用百度api实现语音识别(超详细)

创新点: 提出一种新的车道线检测网络, FOLOLane,把车道线检测视作 关键点评估+关联任务。降低计算成本的同时避免了Segmentation策略中噪声大、信息冗余的问题。最后FOLOLane在CULane和TuSimple数据集上均获得了SOTA的精度。
为什么: 主流的方法把车道线检测视作分割任务,但是这样一是计算量大,二是pixel-wise的输出存在信息的冗余、会带来大量的噪声干扰,导致后去post-processing过程聚类可能出错,影响精度。
怎么做: 通过轻量级的分割网络,输出两个分支,一个分支输出heatmap图表示像素是否是关键点,另一个分支输出offsets用于精准补偿关键点的位置。输出的网络通过关联算法完成局部到全局的曲线关联,形成多条完整的curve

; 3. Line-CNN

[论文] Line-CNN: End-to-End Traffic Line Detection With Line Proposal Unit
python调用百度语音api_python通过调用百度api实现语音识别(超详细)
创新点: 提出了一种 端到端的车道线检测网络 L-CNN,类比Faster R-CNN中的RPN结构,提出针对车道线的 LPU(Line Proposal Unit)模块,把车道线检测视作一种基于 line-anchor的检测任务,这样把每条车道线视为一个整体,利用了高维语义信息,能够有效地应对 遮挡、残缺等情况。
为什么: 车道线检测任务具有目标 虚实结合分离合并情况多发环境多变等难点,而目前的车道线检测方法大多较少地利用到了车道线的全局信息。
怎么做: 图片线通过作为backbone的 ResNet获取特征图,随后对输出的特征图左、下、右边界进行1*1卷积的窗口滑动,对每个位置提出line proposal,并通过对预设的line anchor进行位置补偿,得到精准的车道线位置。

; 4. Lane-ATT

[论文] Keep your Eyes on the Lane: Real-time Attention-guided Lane Detection
[代码] https://github.com/lucastabelini/LaneATT
python调用百度语音api_python通过调用百度api实现语音识别(超详细)
创新点: 提出了一种基于line的anchor-based网络, Lane-ATT,将车道线检测视为anchor-based检测任务来做。并且引入了attention机制将局部特征和全局特征融合,以便更好的应对部分遮挡、表示磨损等情况。
为什么: 车道线检测任务中,基于多项式回归的方法受数据长尾分布的影响效果差,而基于语义分割的方法实时性不好,计算成本过高。
怎么做: 输入图片通过resnet输出特征图,再基于line anchor进行pooling操作,将输出的向量输入胡注意力模块融合局部和全局信息。最后通过cls和reg两个分支进行学习,输出车道线检测结果。

; 5. E2E-LMD

[论文] End-to-End Lane Marker Detection via Row-wise Classification

python调用百度语音api_python通过调用百度api实现语音识别(超详细)
创新点: 提出了一种车道线检测网络, E2E-LMD。把车道线检测视作一个逐行分类任务(row-wise),利用了车道线的几何先验信息,在CULane上达到了当时的SOTA。
为什么: 之前的车道线检测方法大多采取segmentation+post-processing的方式进行,但是这种模式的第一阶段没有充分利用车道线本身的几何约束,所以导致后续复杂且高计算成本的聚类等工序。
怎么做: 在分割网络的backbone后,接共享的HRM层对宽度 降维,随后输出三个分支,输出分别为 当前车道线的置信度、当前行的置信度,以及对应行车道线的坐标。只有前两个分支输出的置信度均大于阈值,第三个分支输出的坐标才被采纳。另外为了增强网络的分辨力,在HRM层中引入了注意力模块SE block。

Original: https://blog.csdn.net/selami/article/details/122212298
Author: 书玮嘎
Title: 【车道线检测论文阅读笔记——经典论文粗读汇总】