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

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

2021.04.18:该文章是在18年,初学Python时写的,所以功能仅限于当时可用,至于现在(貌似依然可用)和以后就不确定了。完整的demo也在本文末尾,但偶尔还是有人私信我索要完整的代码(CSDN看的比较少,不能及时回复抱歉),这让我觉得很奇怪,所以再次强调一下,完整的demo在本文末尾,如果能帮到初学编程时还有些迷茫的你,甚感荣幸,祝你学习愉快!

以下是原文:


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

github上几年前的练习题
有一题是这样的:

使用 Python 实现:对着电脑吼一声,自动打开浏览器中的默认网站。
例如,对着笔记本电脑吼一声“百度”,浏览器自动打开百度首页。

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

  1. 本地录音
  2. 上传录音,获得返回结果
  3. 组一个map,根据结果打开相应的网页

所需模块:

  1. PyAudio:录音接口
  2. wave:打开录音文件并设置音频参数
  3. requests:GET/POST

为什么要用百度语音识别api呢?因为免费试用。。
在这里插入图片描述
不多说,登录百度云,创建应用
在这里插入图片描述
查看文档REST API文档
文档写的蛮详细的,简单概括就是

  1. 可以下载使用SDK在这里插入图片描述
  2. 不需要下载使用SDK

选择2.

  1. 根据文档组装url获取token
  2. 处理本地音频以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):')

经测试,大吼效果更佳

  • 65
    点赞
  • 393
    收藏
    觉得还不错? 一键收藏
  • 31
    评论
### 回答1: 要使用Python调用百度API实现语音识别需要先注册百度开发者账号并创建应用,获取API Key和Secret Key。然后安装Python百度AI SDK,使用SDK提供的语音识别接口,将语音文件上传到百度服务器进行识别,最后将识别结果返回给Python程序。具体实现步骤可以参考百度AI SDK的官方文档。 ### 回答2: Python是一种开源、高级、解释型编程语言,在人工智能这一领域表现出了强大的应用能力,其中调用百度API实现语音识别Python一个应用场景。 百度语音识别API是基于深度学习的中文普通话语音识别技术,其提供了语音转文字的功能,可应用于智能语音助手、语音翻译、语音识别等领域。Python调用百度API实现语音识别的主要步骤如下: 1.获取API访问密钥 在百度智能云控制台中开通百度语音识别服务,并生成API Key和Secret Key。 2.安装Python SDK并调用API 使用Python SDK,安装百度AI SDK,并编写代码。示例代码如下: ``` import sys import json import uuid from aip import AipSpeech app_id = '[app_id]' # 在智能云中申请的app_id api_key = '[api_key]' # 在智能云中申请的api_key secret_key = '[secret_key]' # 在智能云中申请的secret_key client = AipSpeech(app_id, api_key, secret_key) def get_file_content(filePath): with open(filePath, 'rb') as fp: return fp.read() def recognize_speech(file_path): speech = get_file_content(file_path) res = client.asr(speech, 'pcm', 16000, { 'dev_pid': 1536, }) if res and 'result' in res: return res['result'][0] if __name__ == "__main__": file_path = "[path to your audio file]" text = recognize_speech(filePath) print(text) ``` 3.测试 运行代码,输出语音文件中的文字,检查语音识别是否成功。如果识别准确率不高,可以调整API参数或尝试其他语音识别引擎,以提高识别效果。 总之,Python调用百度API实现语音识别不仅方便快捷,还可以应用于很多实际场景,如智能家居、车载导航、航空管制等等。随着人工智能技术的不断发展,Python作为AI领域的主力编程语言之一,将继续发挥重要作用。 ### 回答3: Python作为一种简单易用、开发效率高的编程语言,在语音识别领域有着广泛的应用。而百度语音识别技术就是基于人工智能技术,可以将人类语音转换为相应的文字,它可以帮助用户快速实现语音输入、语音搜索、语音识别等功能。下面将详细介绍如何使用Python调用百度API实现语音识别。 第一步:准备百度语音识别API 在开始之前,需要百度AI开放平台申请一个应用程序,申请过程不难。在申请之后,可以得到一个App ID、API Key和Secret Key,这三个参数是调用百度语音API的必须参数,并且需要保密,以免泄露。 第二步:安装Python语音识别库 在Python中,有很多语音识别库可以选择,比如SpeechRecognition、PyAudio、PocketSphinx等,这里我们选择使用SpeechRecognition库,因为它支持多种语音识别API。 可以通过pip命令来安装SpeechRecognition: pip install SpeechRecognition 如果想要使用其他库,只需要替换其中的引入语句和对应的方法即可。 第三步:编写Python代码 import speech_recognition as sr # 将语音文件传递给语音识别器 r = sr.Recognizer() with sr.AudioFile('test.wav') as source: audio_data = r.record(source) # 通过语音识别API获取转换结果 key = 'API Key' secret = 'Secret Key' r = sr.Recognizer() with sr.AudioFile('test.wav') as source: audio_data = r.record(source) result = r.recognize_baidu(audio_data, key, secret) print(result) 以上是代码的基本结构,其中: - 第1行引入了SpeechRecognition库; - 第4-6行读取音频文件,将其转换为能够被语音识别器处理的格式; - 第9-11行调用百度语音识别API,将语音转换成文字,并返回相应的结果; - 第14行输出识别结果。 第四步:运行Python代码 在代码编辑器中,输入以上代码,保存到一个.py文件。将要进行语音识别的音频文件放到与这个.py文件同一目录下,然后在命令行中运行: python filename.py 其中filename.py是文件名。当然,也可以选择集成开发环境,比如PyCharm、Visual Code等。 总结 通过Python调用百度语音API实现语音识别,不仅能够提高工作效率,而且也可以更方便地实现语音输入、语音搜索、语音命令等功能。只需要按照以上步骤,就可以完成基于Python语音识别任务。
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值