2024 年最新 Python 基于百度智能云实现短语音识别、语音合成详细教程

news2025/2/24 15:03:38

百度智能云语音识别

采用国际领先的流式端到端语音语言一体化建模算法,将语音快速准确识别为文字,支持手机应用语音交互、语音内容分析、机器人对话等场景。百度短语音识别可以将 60 秒以下的音频识别为文字。适用于语音对话、语音控制、语音输入等场景。

接口类型:通过 REST API 的方式提供的通用的 HTTP 接口。适用于任意操作系统,任意编程语言
接口限制:需要上传完整的录音文件,录音文件时长不超过 60 秒。浏览器由于无法跨域请求百度语音服务器的域名,因此无法直接调用API接口。
支持音频格式:pcm、wav、amr、m4a
音频编码要求:采样率 160008000(仅支持普通话模型),16 bit 位深,单声道(音频格式查看及转换)

在这里插入图片描述

创建新应用

在这里插入图片描述

安装语音识别 Python SDK

SDK 下载安装地址:https://ai.baidu.com/sdk#asr

语音识别 Python SDK目录结构

├── README.md
├── aip                   //SDK目录
│   ├── __init__.py       //导出类
│   ├── base.py           //aip基类
│   ├── http.py           //http请求
│   └── speech.py 		  //语音识别
└── setup.py              //setuptools安装

安装使用 Python SDK

如果已安装 pip,执行 pip install baidu-aip 即可。
如果已安装 setuptools,执行 python setup.py install 即可。

新建 AipSpeech

AipSpeech是语音识别的Python SDK客户端,为使用语音识别的开发人员提供了一系列的交互方法。常量APP_ID在百度云控制台中创建,常量API_KEY与SECRET_KEY是在创建完毕应用后,系统分配给用户的,均为字符串,用于标识用户,为访问做签名验证,可在AI服务控制台中的应用列表中查看。

from aip import AipSpeech

""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

配置 AipSpeech

如果用户需要配置AipSpeech的网络请求参数(一般不需要配置),可以在构造 AipSpeech 之后调用接口设置参数。

在这里插入图片描述

语音识别 SDK 接口文档

接口描述:向远程服务上传整段语音进行识别

请求说明:举例,要对段保存有一段语音的语音文件进行识别:

def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

client.asr(get_file_content('audio.pcm'), 'pcm', 16000, {
    'dev_pid': 1537,
})

接口函数说明
在这里插入图片描述
dev_pid 参数列表
在这里插入图片描述

返回数据参数详情

在这里插入图片描述

{
    "err_no": 0,
    "err_msg": "success.",
    "corpus_no": "15984125203285346378",
    "sn": "481D633F-73BA-726F-49EF-8659ACCC2F3D",
    "result": ["北京天气"]
}

详细接口文档:https://ai.baidu.com/ai-doc/SPEECH/0lbxfnc9b

本地语音识别案例

读取本地 pcm 语音文件,识别语音的内容。

from aip import AipSpeech


def get_file_content(filePath):
    """
    读取本地文件
    :param filePath: 
    :return: 
    """
    with open(filePath, 'rb') as fp:
        return fp.read()


def recognize_audio(client: AipSpeech, filePath: str):
    """
    识别本地 pcm 语音文件
    :param client:
    :param filePath:
    :return:
    """
    result = client.asr(get_file_content(filePath), 'pcm', 16000, {
        'dev_pid': 1537,
    })
    return result['result'][0]

主函数源码

import os
import time
from aip import AipSpeech
import dotenv

import baidu_speech_tool

dotenv.load_dotenv(".env")

APP_ID = os.getenv("APP_ID")
API_KEY = os.getenv("API_KEY")
SECRET_KEY = os.getenv("SECRET_KEY")

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

"""记录开始时间"""
start_time = time.time()

filePath = "2024060302300905.pcm"

result = baidu_speech_tool.recognize_audio(client=client, filePath=filePath)
"""记录结束时间"""
end_time = time.time()

"""计算并打印执行时间"""
execution_time = end_time - start_time
print(f"Execution time: {execution_time: .4f} seconds")

"""识别结果"""
print(result)

百度智能云语音合成

百度短文本在线合成服务,基于HTTP请求的REST API接口,将文本转换为可以播放的音频文件。本文档描述了使用语音合成服务REST API的方法。

接口文档:https://ai.baidu.com/ai-doc/SPEECH/mlbxh7xie

tex 字段 2 次urlencode

由于urlencode有两个标准 RFC 1738和RFC 3986. 百度为了更好地兼容,支持1次及2次urlencode, 其中2次urlencode可以覆盖全部的特殊字符。因而推荐传递tex 参数时做2次urlencode编码。

测试用例:“1+1=2”。 一次urlencode时,“+”可能会没有合成。

POST 调用方式(推荐)

将文本以及其他参数写入到body里面,利用html表单的方式将参数传递到服务端。 所有的参数都在body中。body里面的数据为:

tex=***&lan=zh&cuid=***&ctp=1&aue=3&tok=***

tex 原始参数是"百度你好“

第一次urlencode后 tex=%e7%99%be%e5%ba%a6%e4%bd%a0%e5%a5%bd
第二次urlencode后 tex=%25e7%2599%25be%25e5%25ba%25a6%25e4%25bd%25a0%25e5%25a5%25bd

GET 调用方式

将所有的参数都填写到URL地址中,可以通过浏览器可以播放合成的语音结果。

https://tsn.baidu.com/text2audio?tex=***&lan=zh&cuid=***&ctp=1&tok=***
    

注意 tex 参数需要按照 url 参数标准使用 url_encode UTF8编码,如合成文字为“百度你好” 。

http://tsn.baidu.com/text2audio?tex=%e7%99%be%e5%ba%a6%e4%bd%a0%e5%a5%bd&lan=zh&cuid=***&ctp=1&tok=***

如果合成成功返回的Content-Type以“audio”开头。

aue =3 ,返回为二进制mp3文件,具体header信息 Content-Type: audio/mp3;
aue =4 ,返回为二进制pcm文件,具体header信息 Content-Type:audio/basic;codec=pcm;rate=16000;channel=1
aue =5 ,返回为二进制pcm文件,具体header信息 Content-Type:audio/basic;codec=pcm;rate=8000;channel=1
aue =6 ,返回为二进制wav文件,具体header信息 Content-Type: audio/wav;

如果合成出现错误,则会返回json文本,具体header信息为:Content-Type: application/json。其中sn字段主要用于DEBUG追查问题,如果出现问题,可以提供sn帮助确认问题。

安装语音合成 Python SDK

SDK 下载安装地址:https://ai.baidu.com/sdk#asr

语音识别 Python SDK目录结构

├── README.md
├── aip                   //SDK目录
│   ├── __init__.py       //导出类
│   ├── base.py           //aip基类
│   ├── http.py           //http请求
│   └── speech.py         //语音合成
└── setup.py              //setuptools安装

安装使用 Python SDK

如果已安装 pip,执行 pip install baidu-aip 即可。
如果已安装 setuptools,执行 python setup.py install 即可。

新建 AipSpeech

AipSpeech是语音识别的Python SDK客户端,为使用语音识别的开发人员提供了一系列的交互方法。常量APP_ID在百度云控制台中创建,常量API_KEY与SECRET_KEY是在创建完毕应用后,系统分配给用户的,均为字符串,用于标识用户,为访问做签名验证,可在AI服务控制台中的应用列表中查看。

from aip import AipSpeech

""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

配置 AipSpeech

如果用户需要配置AipSpeech的网络请求参数(一般不需要配置),可以在构造 AipSpeech 之后调用接口设置参数。

在这里插入图片描述

语音合成 SDF 接口文档

接口描述:基于该接口,开发者可以轻松的获取语音合成能力

文档地址:https://ai.baidu.com/ai-doc/SPEECH/plbxhh4be

请求说明

合成文本长度必须小于1024字节,如果本文长度较长,可以采用多次请求的方式。文本长度不可超过限制
举例,要把一段文字合成为语音文件:

result  = client.synthesis('你好百度', 'zh', 1, {
    'vol': 5,
})

# 识别正确返回语音二进制 错误则返回dict 参照下面错误码
if not isinstance(result, dict):
    with open('audio.mp3', 'wb') as f:
        f.write(result)

在这里插入图片描述
tex 字段 2 次 urlencode

由于urlencode有两个标准 RFC 1738和RFC 3986. 百度为了更好地兼容,支持1次及2次urlencode, 其中2次urlencode可以覆盖全部的特殊字符。SDK内部加了1次urlencode,因而推荐传递tex 参数时再做1次urlencode编码。

测试用例:“1+1=2”。 依靠 SDK 内的 1 次 urlencode 时,“+”可能会没有合成。

返回样例

// 成功返回二进制文件流
// 失败返回
{
    "err_no":500,
    "err_msg":"notsupport.",
    "sn":"abcdefgh",
    "idx":1
}

语音合成音色

本页面为调用发音人所属音库、发音人名称、调用per参数等信息。语音合成音色:https://ai.baidu.com/ai-doc/SPEECH/Rluv3uq3d

试听:https://ai.baidu.com/tech/speech/tts_online

在这里插入图片描述

本地语音合成案例

API 调用案例

import requests
import os

import dotenv

dotenv.load_dotenv(".env")

APP_ID = os.getenv("APP_ID")
API_KEY = os.getenv("API_KEY")
SECRET_KEY = os.getenv("SECRET_KEY")


def create_audio(text: str, file_name: str):
    url = "https://tsn.baidu.com/text2audio"

    payload = f'tex={text}&tok=' + get_access_token() + '&cuid=naAUL3Evzwj8A79l1kFHvRz1oUWZfOmo&ctp=1&lan=zh&spd=5&pit=5&vol=5&per=0&aue=4'
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Accept': '*/*'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
    with open(f"./{file_name}.pcm", 'wb') as f:
        f.write(response.text)
    response = requests.get(url, stream=True, headers=headers, data=payload)
    # 检查请求是否成功
    if response.status_code == 200:
        # 打开文件以二进制写入模式
        with open(f"./{file_name}.pcm", 'wb') as file:
            # 分块读取并写入文件
            for chunk in response.iter_content(1024):
                if chunk:
                    file.write(chunk)
    else:
        print(f"请求失败,状态码:{response.status_code}")

def get_access_token():
    """
    使用 AK,SK 生成鉴权签名(Access Token)
    :return: access_token,或是None(如果错误)
    """
    url = "https://aip.baidubce.com/oauth/2.0/token"
    params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY}
    return str(requests.post(url, params=params).json().get("access_token"))


if __name__ == '__main__':
    create_audio("你好", "test")

AipSpeech SDK 版本

import os

import dotenv

dotenv.load_dotenv(".env")
from aip import AipSpeech

APP_ID = os.getenv("APP_ID")
API_KEY = os.getenv("API_KEY")
SECRET_KEY = os.getenv("SECRET_KEY")

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)


def baidu_create_audio(text):
    result = client.synthesis('你好百度', 'zh', 1, {
        'vol': 5,
        'per': 5118
    })

    # 识别正确返回语音二进制 错误则返回 dict 参照下面错误码
    if not isinstance(result, dict):
        with open('audio.pcm', 'wb') as f:
            f.write(result)

baidu_create_audio("你好")

常见调用问题

access_token 错误 API_KEY / SECRET_KEY 错误

    params['access_token'] = authObj['access_token']
                             ~~~~~~~^^^^^^^^^^^^^^^^
KeyError: 'access_token'

Process finished with exit code 1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1824235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 32 之 静态成员函数

#include <iostream> #include <string> using namespace std;// 特点: // 1.在编译阶段就分配了内存空间 // 2.类内声明&#xff0c;在类外进行初始化 // 3.所有对象共享一份静态成员数据 class Students02{ public:int s_c;static int s_d;// 静态成员函数&#…

重装了mysql,然后安装为服务时,net start 启动一直报错,MySQL服务无法启动的解决

之前写过一篇关于安装mysql的文章&#xff0c;按上面的处理&#xff0c;基本上是可以的。 今天换了下目录&#xff0c;重新安装&#xff0c;一直报错。 然后我们来看一下问题&#xff1a; mysqld -console 这里的目录是有问题的&#xff0c;设置的是&#xff1a;datadird:\to…

如何完美解决升级 IntelliJ IDEA 最新版之后遇到 Git 记住密码功能失效的问题

&#x1f6e0;️ 如何完美解决升级 IntelliJ IDEA 最新版之后遇到 Git 记住密码功能失效的问题 摘要 在这篇文章中&#xff0c;我们将详细探讨如何解决在升级到 IntelliJ IDEA 最新版&#xff08;2024.1.3 Ultimate Edition&#xff09;后遇到的 Git 记住密码功能失效的问题。…

简单Mesh多线程合并,使用什么库性能更高

1&#xff09;简单Mesh多线程合并&#xff0c;使用什么库性能更高 2&#xff09;Unity Semaphore.WaitForSignal耗时高 3&#xff09;VS编辑的C#代码注释的中文部分乱码 4&#xff09;变量IntPtr m_cachePtr切换线程后变空 这是第389篇UWA技术知识分享的推送&#xff0c;精选了…

【github】项目的代码仓库重命名

问题 有时候&#xff0c;我们先创建了远端项目仓库&#xff0c;然后就把相关code上传到远端项目仓库。 可能需要结合实际情况对远端项目仓库进行重命名。 当前仓库名称v_ttc&#xff0c;如何将他修改成v_datejs 操作步骤 1、在 GitHub.com 上&#xff0c;导航到存储库的主页…

个人关于Leecode 49题见解(保姆级)

题目&#xff1a; 49. 字母异位词分组 中等 相关标签 相关企业 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "…

边界内聚和耦合

内聚 功能内聚 功能内聚是软件工程中一个重要的概念&#xff0c;它描述了一个模块内部各个元素之间的紧密程度。一个具有高功能内聚的模块意味着其内部的各个组件都共同完成一个具体的、明确的功能&#xff0c;并且这些组件之间的联系不是偶然的&#xff0c;而是因为它们共同服…

QT打包(windows linux)封包 完整图文版

目录 简介: 一. for windows 1.首先下载组件 2.开始构建Release版本. 3.然后点击构建 4.在文件夹内直接点击exe文件,会报下面的错误,因为缺少dll连接; 5.需要把这个exe单独复制到一个文件夹内, 6.先cd到单独exe所在的文件夹; cd 文件路径 7.然后运行 windeployqt 文…

渗透测试和红蓝对抗是什么?二者之间有何区别?

在网络安全这个庞大的体系中&#xff0c;渗透测试、红蓝对抗是比较常见的专业名词&#xff0c;承担着非常重要的作用&#xff0c;那么什么是渗透测试、红蓝对抗?红蓝对抗和渗透测试有什么区别?小编通过这篇文章为大家介绍一下。 渗透测试 渗透测试&#xff0c;是通过模拟黑…

FastWeb - Lua开源跨平台网站开发服务

在网站开发领域&#xff0c;大家都熟知PHPStudy和宝塔这两款广受欢迎的工具&#xff0c;但今天我要介绍的是一款功能强大、支持跨平台的开源Lua网站开发服务——Fast Web&#xff0c;以及与之配套的网站管理器。 Fast Web简介 Fast Web是一款基于Lua编写的网站开发框架&#…

AI金融投资:批量下载深交所公募REITs公开说明书

打开深交所公募REITs公开说明书页面&#xff0c;F12查看网络&#xff0c;找到真实地址&#xff1a;https://reits.szse.cn/api/disc/announcement/annList?random0.3555675437003616 { "announceCount": 39, "data": [ { "id": "80bc9…

【全开源】多功能投票小程序源码(Uniapp+ThinkPHP+FastAdmin)

&#x1f4a5;**【热门推荐】多功能投票小程序&#xff0c;一键解决你的选择难题&#xff01;**&#x1f4a5; 基于ThinkPHPFastAdminUniapp开发的多功能系统&#xff0c;支持图文投票、自定义选手报名内容、自定义主题色、礼物功能(高级授权)、弹幕功能(高级授权)、会员发布、…

[Vulnhub]Solid-State POP3邮件服务(James)+rbash逃逸

信息收集&SSH Server IP addressPorts Open192.168.8.100TCP:22,25,80,110,119,4555 Nmap 扫描: $ nmap -p- 192.168.8.100 --min-rate 1000 -sC -sV 结果: Host is up (0.00061s latency). Not shown: 65529 closed tcp ports (conn-refused) PORT STATE SERVICE…

使用overflow:hidden;无法去掉滚动条问题

<div class"bg"><img src"/assets/imgs/home-page.png" alt"首页图" style"width: auto; height: calc(100vh - 64px)"><div class"text"><h1>亿色科技 易于生活</h1></div></div&g…

关于钽电容器的作用、优缺点、选型指南及故障诊断方法等介绍

钽电容器&#xff0c;全称为钽电解电容器&#xff0c;是一种以金属钽作为介质材料的电解电容器。与传统的电解电容器不同&#xff0c;钽电容器不使用液体电解质&#xff0c;而是利用钽氧化物&#xff08;五氧化二钽&#xff09;作为固态电解质&#xff0c;这使得它们具有更高的…

谷歌Google广告开户要提供什么材料?

谷歌Google广告是企业出海&#xff0c;触及全球潜在客户的必备渠道&#xff0c;无论您是初创公司还是成熟企业&#xff0c;想要在激烈的市场竞争中脱颖而出&#xff0c;有效利用谷歌广告的力量至关重要。云衔科技&#xff0c;作为数字化营销解决方案与SaaS软件服务商&#xff0…

el-cascader 支持多层级,多选(可自定义限制数量),保留最后一级

多功能的 el-cascader 序言&#xff1a;最近遇到一个需求关于级联的&#xff0c;有点东西&#xff0c;这里是要获取某个产品类型下的产品&#xff0c;会存在产品类型和产品在同一级的情况&#xff0c;但是产品类型不能勾选&#xff1b; 情况1&#xff08;二级菜单是产品&…

【Oracle生产运维】数据库服务器高负载排查处理

说明 在Oracle数据库运维工作中&#xff0c;经常会遇到Oracle数据库服务器平均负载&#xff08;load average&#xff09;突然异常升高&#xff0c;如果放任不管&#xff0c;严重的情况下会出现数据库宕机、服务器重启等重大故障。因此&#xff0c;当发现数据库服务器平均负载…

热门开源项目推荐:智谱GLM-4-9B和ChatGLM3-6B

目录 热门开源项目推荐&#xff1a;智谱GLM-4-9B和ChatGLM3-6B 1.引言 1.1 开源文化简介 1.2 开源项目的重要性 1.3 博客目的和读者价值 2.什么是开源项目&#xff1f; 2.1 开源定义 2.2 开源许可证类型 2.3 开源社区的作用 3.为什么程序员应该关注开源项目&#xff…

高精度减法的实现

这是C算法基础-基础算法专栏的第八篇文章&#xff0c;专栏详情请见此处。 引入 上次我们学习了高精度加法的实现&#xff0c;这次我们要学习高精度减法的实现。 高精度减法与高精度加法的定义、前置过程都是大致相同的&#xff0c;如果想了解具体内容&#xff0c;可以移步至我的…