【python】使用百度api进行音频文件转写
【python】使用百度api进行音频文件转写
脚本目标:
- 智能云的音频文件转写文档只给了个demo,每次只能传1分钟以内的音频啥的,不好直接用,简单打包一下,做到把音频放文件夹,直接出转写结果就行了,偶尔用一下的用户,就我这个用着应该没什么问题
环境准备:
- 百度智能云先开通音频文件转写,创建一个应用,应用名称随便写,描述随便写,接口选择选全选,语音包名不需要,应用创建完后,在应用列表里有个Api Key和Secret Key,复制下来,脚本要用
- 下载ffmpeg,把bin文件夹里的三个exe文件复制到项目文件夹下
脚本思路:
- 创建一个文件夹,让用户把音频放里面,用pydub把音频分割成每段59秒,依次调用音频文件转写的api,把返回结果保存到一起就行了
代码实现:
- 分割音频
代码
def CutAudio(self, path):
format = path[-3:]
filename = path.split("\\")[-1]
filename = re.findall(rf"(.*?)\.{format}", filename) # 取出.mp3后缀的文件名
print(f"文件名={filename[0]}----格式={format}")
mp3 = AudioSegment.from_file(f'{path}', f"{format}") # 打开mp3文件
mp3 = mp3.set_frame_rate(16000)
mp3 = mp3.set_channels(1)
cuts = make_chunks(mp3, self.long)
for index, cut in enumerate(cuts):
CutName = (f"{filename[0]}-{index}.wav")
cut.export(f'{self.TempAudio}/{CutName}', format="wav")
print(f"{filename[0]}分割完成")
最终代码:其实就是把分割音频部分和提供的demo结合到一起
import base64
import json
import os.path
import re
import sys
import time
from os import mkdir, listdir
from shutil import rmtree
from pydub import AudioSegment
from pydub.utils import make_chunks
IS_PY3 = sys.version_info.major == 3
from urllib.request import urlopen
from urllib.request import Request
from urllib.error import URLError
from urllib.parse import urlencode
timer = time.perf_counter
class DemoError(Exception):
pass
class AudioToText:
AudioDir = "./AudioDir"
TempAudio = "./TempAudio"
AudioPath = ""
long = 59000 # 切割的长度
API_KEY = '?????????????'
SECRET_KEY = '??????????????'
AUDIO_FILE = '.....'
FORMAT = AUDIO_FILE[-3:]
RATE = 16000 # 固定值
CUID = '123456PYTHON' # 可填可不填
DEV_PID = 1737 # 1537 表示识别普通话,1737 英文
ASR_URL = 'http://vop.baidu.com/server_api'
SCOPE = 'audio_voice_assistant_get' # 有此scope表示有asr能力,没有请在网页里勾选,非常旧的应用可能没有
TOKEN_URL = 'http://aip.baidubce.com/oauth/2.0/token'
def __init__(self):
if not os.path.exists(self.AudioDir):
mkdir(self.AudioDir)
mkdir(self.TempAudio)
self.AudioPath = input(f"1.单个音频文件:输入音频文件路径\n2.多个音频文件:把音频全放到{self.AudioDir}文件夹里后Enter\n")
language = int(input("普通话选择1 , 英文选择2\n"))
if language == 1:
self.DEV_PID = 1537
elif language == 2:
self.DEV_PID = 1737
def CutAudio(self, path):
format = path[-3:]
filename = path.split("\\")[-1]
filename = re.findall(rf"(.*?)\.{format}", filename) # 取出.mp3后缀的文件名
print(f"文件名={filename[0]}----格式={format}")
mp3 = AudioSegment.from_file(f'{path}', f"{format}") # 打开mp3文件
mp3 = mp3.set_frame_rate(16000)
mp3 = mp3.set_channels(1)
cuts = make_chunks(mp3, self.long)
for index, cut in enumerate(cuts):
CutName = (f"{filename[0]}-{index}.wav")
cut.export(f'{self.TempAudio}/{CutName}', format="wav")
print(f"{filename[0]}分割完成")
def OneAudioFile(self):
self.CutAudio(self.AudioPath)
def ManyAudioFile(self):
for each in listdir(self.AudioDir):
self.CutAudio(f"{self.AudioDir}\\{each}")
def fetch_token(self):
params = {'grant_type': 'client_credentials',
'client_id': self.API_KEY,
'client_secret': self.SECRET_KEY}
post_data = urlencode(params)
if (IS_PY3):
post_data = post_data.encode('utf-8')
req = Request(self.TOKEN_URL, post_data)
try:
f = urlopen(req)
result_str = f.read()
except URLError as err:
result_str = err.read()
if (IS_PY3):
result_str = result_str.decode()
result = json.loads(result_str)
if ('access_token' in result.keys() and 'scope' in result.keys()):
if self.SCOPE and (not self.SCOPE in result['scope'].split(' ')): # SCOPE = False 忽略检查
raise DemoError('scope is not correct')
return result['access_token']
else:
raise DemoError(
'MAYBE API_KEY or SECRET_KEY not correct: access_token or scope not found in token response')
def transfer(self, path):
token = self.fetch_token()
speech_data = []
with open(path, 'rb') as speech_file:
speech_data = speech_file.read()
length = len(speech_data)
if length == 0:
raise DemoError('file %s length read 0 bytes' % path)
speech = base64.b64encode(speech_data)
if (IS_PY3):
speech = str(speech, 'utf-8')
params = {'dev_pid': self.DEV_PID,
# "lm_id" : LM_ID, #测试自训练平台开启此项
'format': path[-3:],
'rate': self.RATE,
'token': token,
'cuid': self.CUID,
'channel': 1,
'speech': speech,
'len': length
}
post_data = json.dumps(params, sort_keys=False)
req = Request(self.ASR_URL, post_data.encode('utf-8'))
req.add_header('Content-Type', 'application/json')
try:
begin = timer()
f = urlopen(req)
result_str = f.read()
except URLError as err:
result_str = err.read()
if (IS_PY3):
result_str = str(result_str, 'utf-8')
result_str = re.findall(r":\[\"(.*?)\"\],", result_str)[0]
print(result_str)
with open("result.txt", "a") as of:
of.write(f"{result_str}\n")
def do_trans(self):
for each in listdir(f"./{self.TempAudio}"):
self.transfer(f"{self.TempAudio}/{each}")
def run(self):
if self.AudioPath is not "":
self.OneAudioFile()
else:
self.ManyAudioFile()
self.do_trans()
def __del__(self):
rmtree(self.TempAudio)
if __name__ == '__main__':
audio = AudioToText()
audio.run()
看到那个一堆问号的Api Key 和 Secret Key了吗,把之前复制下来的粘贴上去
把没安装的库自己安装一下,ffmpeg里的三个exe要记得复制到项目文件夹
然后直接跑就行了
后记:
其实就是方便大家,可以直接用这个功能,可以不用浪费时间再写一遍
【python】使用百度api进行音频文件转写的更多相关文章
- python使用百度api翻译中英文
python使用百度api翻译中英文 写程序取变量名的时候,常常需要翻译单词,或者将中文翻译成英语.有道词典,必应词典都很好,可是...命令行习惯了还是觉得用在cmd里面调出程序使用起来也许会更爽.于 ...
- 吴裕雄--天生自然python学习笔记:python 用pygame模块处理音频文件
除了对图片. Word 等普通格式的文件进行处理外, Python 还有强大的多媒体文件操作能力,如对音频.视频 文件的操作 . 如果要播放音乐,我们可以用 pygame 包中的 mixer 对 象. ...
- 爬虫-python调用百度API/requests
from urllib.request import urlopen import requests import json url = "http://apis.baidu.com/txa ...
- Python调用百度接口(情感倾向分析)和讯飞接口(语音识别、关键词提取)处理音频文件
本示例的过程是: 1. 音频转文本 2. 利用文本获取情感倾向分析结果 3. 利用文本获取关键词提取 首先是讯飞的语音识别模块.在这里可以找到非实时语音转写的相关文档以及 Python 示例.我略作了 ...
- 百度ai 基于node 语音识别 音频文件类型转换
百度ai 基于node 语音识别 音频文件类型转换 项目简介 源代码移步:https://github.com/xuess/ai-baidu-node 本项目主要功能为,本地音频语音识别和文件类型转换 ...
- Python 调用百度翻译API
由于实习公司这边做的是日文app,有时要看看用户反馈,对于我这种五十音图都没记住的人,表示百度翻译确实还可以.但不想每次都复制粘贴啊,google被墙也是挺蛋疼的事,所以用python结合baidu ...
- ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件
原文:ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件 先看效果图,然后上代码: <UserControl x:Class= ...
- Python获得百度统计API的数据并发送邮件
Python获得百度统计API的数据并发送邮件 小工具 本来这么晚是不准备写博客的,当是想到了那个狗子绝对会在开学的时候跟我逼逼这个事情,所以,还是老老实实地写一下吧. Baidu统计API的使 ...
- Python实例---爬取下载喜马拉雅音频文件
PyCharm下python爬虫准备 打开pycharm 点击设置 点击项目解释器,再点击右边+号 搜索相关库并添加,例如:requests 喜马拉雅全网递归下载 打开谷歌/火狐浏览器,按F12打开开 ...
- Python开发【Tornado】:搭建文件下载服务、音频文件播放
Tornado 如何做文件下载 要求:浏览器输入url地址,直接弹窗提示下载 Tornado服务端,搭建文件下载服务 #!/usr/bin/env python # -*- coding:utf-8 ...
随机推荐
- 如何在 macOS Sonoma 虚拟机中安装 VMware Tools
vmware-tools VMware Tools 简介 VMware Tools 中包含一系列服务和模块,可在 VMware 产品中实现多种功能,从而使用户能够更好地管理客户机操作系统,以及与客户机 ...
- 《ASP.NET Core 与 RESTful API 开发实战》-- (第9章)-- 读书笔记(上)
第 9 章 测试和文档 9.1 测试 测试是软件生命周期中的一个非常重要的阶段,对于保证软件的可靠性具有极其重要的意义 常见的测试方法有很多,根据不同的维度,可以把测试方法分为不同的类别 从观察结构的 ...
- MySQL 报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket
MySQL 报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket 一.错误现场还原: 下面我们通过三种方式 ...
- Skywalking-Aop Docker单机环境搭建
1.OAP-SERVER和UI环境搭建 本次搭建是基于MySQL进行持久化,因此需要提前准备好一个MySQL容器 (MySQL容器部署略过).如有错误还请指正. 1.1 OAP服务搭建 拉取skywa ...
- NC19325 游戏
题目链接 题目 题目描述 BLUESKY007,fengxunling和dreagonm三个人发现了一个像素游戏,这款神奇的游戏每次会生成一个nxm的网格,其中每一个格子都被随机染色为R,G,B三种颜 ...
- Codeforces Round #847 (Div. 3) A-G
比赛链接 A 题意 判断输入字符串与 \(\pi\) 的最长前缀匹配,不超过 \(30\) 位. 题解 知识点:模拟. 抄样例最后一个 \(30\) 都正确的,直接匹配. 时间复杂度 \(O(1)\) ...
- Shiro 框架的MD5加密算法实现原理
直接上代码:该代码可以直接用于项目中做MD5加密,加盐加密,多层散列加密 import java.io.UnsupportedEncodingException; import java.securi ...
- java 手写并发框架(一)异步查询转同步的 7 种实现方式
序言 本节将学习一下如何实现异步查询转同步的方式,共计介绍了 7 种常见的实现方式. 思维导图如下: 异步转同步 业务需求 有些接口查询反馈结果是异步返回的,无法立刻获取查询结果. 比如业务开发中我们 ...
- 如何避免FOUC
如何避免FOUC FOUC即无样式内容闪烁也可以称为文档样式短暂失效,主要就是指HTML已加载而样式表并未加载,此后样式表再加载而产生的闪烁现象. 样式表前置 根据浏览器渲染的顺序,将CSS在< ...
- CSS加JS实现网页返回顶部功能
最近在设计自己的博客,前端页面在内容很多的时候往下拖动会有滚动条.通常我们都需要一个返回顶部的功能来实现快速来到网页顶部.当然实现方式不止一种,这里我采用的最实用的一种.使用CSS+Jquery方式 ...