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

最近在学习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 wavefrom pyaudio import PyAudio, paInt16framerate = 16000 # 采样率num_samples = 2000 # 采样点channels = 1 # 声道sampwidth = 2 # 采样宽度2bytesFILEPATH = "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 requestsimport 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:55import waveimport requestsimport timeimport base64from pyaudio import PyAudio, paInt16import webbrowserframerate = 16000 # 采样率num_samples = 2000 # 采样点channels = 1 # 声道sampwidth = 2 # 采样宽度2bytesFILEPATH = "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 datadef 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 Resultdef 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):")

经测试,大吼效果更佳

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动控制节水灌溉技术的高低代表着农业现代化的发展状况,灌溉系统自动化水平较低是制约我国高效农业发展的主要原因。本文就此问题研究了单片机控制的滴灌节水灌溉系统,该系统可对不同土壤的湿度进行监控,并按照作物对土壤湿度的要求进行适时、适量灌水,其核心是单片机和PC机构成的控制部分,主要对土壤湿度与灌水量之间的关系、灌溉控制技术及设备系统的硬件、软件编程各个部分进行了深入的研究。 单片机控制部分采用上下位机的形式。下位机硬件部分选用AT89C51单片机为核心,主要由土壤湿度传感器,信号处理电路,显示电路,输出控制电路,故障报警电路等组成,软件选用汇编语言编程。上位机选用586型以上PC机,通过MAX232芯片实现同下位机的电平转换功能,上下位机之间通过串行通信方式进行数据的双向传输,软件选用VB高级编程语言以建立友好的人机界面。系统主要具有以下功能:可在PC机提供的人机对话界面上设置作物要求的土壤湿度相关参数;单片机可将土壤湿度传感器检测到的土壤湿度模拟量转换成数字量,显示于LED显示器上,同时单片机可采用串行通信方式将此湿度值传输到PC机上;PC机通过其内设程序计算出所需的灌水量和灌水时间,且显示于界面上,并将有关的灌水信息反馈给单片机,若需灌水,则单片机系统启动鸣音报警,发出灌水信号,并经放大驱动设备,开启电磁阀进行倒计时定时灌水,若不需灌水,即PC机上显示的灌水量和灌水时间均为0,系统不进行灌水。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值