首页 > 编程语言 >【python】使用百度api进行音频文件转写

【python】使用百度api进行音频文件转写

时间:2022-12-03 23:44:05浏览次数:36  
标签:python self 音频文件 api mp3 str path import result

 

【python】使用百度api进行音频文件转写

脚本目标:

  1. 智能云的音频文件转写文档只给了个demo,每次只能传1分钟以内的音频啥的,不好直接用,简单打包一下,做到把音频放文件夹,直接出转写结果就行了,偶尔用一下的用户,就我这个用着应该没什么问题

环境准备:

  1. 百度智能云先开通音频文件转写,创建一个应用,应用名称随便写,描述随便写,接口选择选全选,语音包名不需要,应用创建完后,在应用列表里有个Api Key和Secret Key,复制下来,脚本要用
  2. 下载ffmpeg,把bin文件夹里的三个exe文件复制到项目文件夹下

脚本思路:

  1. 创建一个文件夹,让用户把音频放里面,用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,self,音频文件,api,mp3,str,path,import,result
From: https://www.cnblogs.com/water-wells/p/16949009.html

相关文章

  • python循环
    python学习1.for循环range()函数foriinrange(1,10):print(i)#输出为123456789该函数还可以制定步长如:foriinrange(1,10,2)即为以2为步长,在1到......
  • python报错 ModuleNotFoundError: No module named ‘win32api‘
    参考链接https://blog.csdn.net/weixin_43149311/article/details/120806116报错信息如下:ModuleNotFoundError:Nomodulenamed‘win32api‘解决方法参考1.重新......
  • 在linux虚拟机中运行python
    在linux虚拟机中运行python方法1:运用python指令运行一般情况linux系统会自动安装python所以在终端中输入python3就自动进入python的交互模式输入ctrl+z退出交互模式......
  • python推导式
    python推导式推导式是用一行式子来完成循环操作的语句,一般与for循环结合来使用。列表推导式公式[exprforvalueincollection[ifcondition]]例子对循环内元素......
  • Python基础之函数
    一、函数的作用函数就是将⼀段具有独⽴功能的代码块整合到⼀个整体并命名,在需要的位置调⽤这个名称即可完成对应的需求。函数在开发过程中,可以更⾼效的实现代码重⽤。二、......
  • Python处理PDF
    目录ReadinfoRotatePageMergePDFsSplitPDFsEncryptaPDFDecryptaPDFAddwatermarkreference:HowtoWorkWithaPDFinPythonreference:给PDF添加水印本文使......
  • 最大流,最小费最大流问题 python
    最大流,最小费最大流问题python徐少华算法设计与分析P145解题思路解题算法最小费用最大流:解法I步骤一:利用最大流算法,将网络的流量调整到最大流步骤二:构建......
  • Python 第11章 上机实验
    说明:导入pymysql包,关于使用mysql的代码,只能在我的电脑使用,同时我抹去了使用mysql的账号秘密importsqlite3#连接到SQLite数据库conn=sqlite3.connect('mrsoft.db')......
  • ( Java 和 C++ 还是有差别)卑微地向API低下了头,但是反转字符串的单词依旧写了很久 学
    344.反转字符串-ezclassSolution{publicvoidreverseString(char[]s){intleft=0,right=s.length-1;chartmp;while(l......
  • 【Python】笔记:协程
    协程用作协程的生成器的基本行为协程使用生成器函数定义:定义体中有yield关键字defsimple_coroutine():print('->coroutinestart')x=yield#因为......