Python语音识别API实现文字转语音的几种方法

搜狗(目前好用,免费)

    def textToAudio_Sougou(message, filePath):
        # https://ai.so    gou.com/doc/?url=/docs/content/tts/references/rest/
        '''
        curl -X POST \
             -H "Content-Type: application/json" \
             --data '{
          "appid": "xxx",
          "appkey": "xxx",
          "exp": "3600s"
        }' https://api.zhiyin.sogou.com/apis/auth/v1/create_token
        '''

        token = 'xxx'
        headers = {
            'Authorization' : 'Bearer '+token,
            'Appid' : 'xxx',
            'Content-Type' : 'application/json',
            'appkey' : 'xxx',
            'secretkey' : 'xxx'
        }
        data = {
          'input': {
            'text': message
          },
          'config': {
            'audio_config': {
              'audio_encoding': 'LINEAR16',
              'pitch': 1.0,
              'volume': 1.0,
              'speaking_rate': 1.0
            },
            'voice_config': {
              'language_code': 'zh-cmn-Hans-CN',
              'speaker': 'female'
            }
          }
        }

        result = requests.post(url=url, headers=headers, data=json.dumps(data, ensure_ascii=False).encode('utf-8')).content
        with open(filePath, 'wb') as f:
            f.write(result)

百度(现在收费了,送一定额度)

import base64
import json
import os
import time
import shutil
import requests

class BaiduVoiceToTxt():
    # 初始化函数
    def __init__(self):
        # 定义要进行切割的pcm文件的位置。speech-vad-demo固定好的,没的选
        self.pcm_path = ".\\speech-vad-demo\\pcm\\16k_1.pcm"
        # 定义pcm文件被切割后,分割成的文件输出到的目录。speech-vad-demo固定好的,没的选
        self.output_pcm_path = ".\\speech-vad-demo\\output_pcm\\"

    # 百度AI接口只接受pcm格式,所以需要转换格式
    # 此函数用于将要识别的mp3文件转换成pcm格式,并输出为.\speech-vad-demo\pcm\16k_1.pcm
    def change_file_format(self,filepath):
        file_name = filepath
        # 如果.\speech-vad-demo\pcm\16k_1.pcm文件已存在,则先将其删除
        if os.path.isfile(f"{self.pcm_path}"):
            os.remove(f"{self.pcm_path}")
        # 调用系统命令,将文件转换成pcm格式,并输出为.\speech-vad-demo\pcm\16k_1.pcm
        change_file_format_command = f".\\ffmpeg\\bin\\ffmpeg.exe -y  -i {file_name}  -acodec pcm_s16le -f s16le -ac 1 -ar 16000 {self.pcm_path}"
        os.system(change_file_format_command)

    # 百度AI接口最长只接受60秒的音视,所以需要切割
    # 此函数用于将.\speech-vad-demo\pcm\16k_1.pcm切割
    def devide_video(self):
        # 如果切割输出目录.\speech-vad-demo\output_pcm\已存在,那其中很可能已有文件,先将其清空
        # 清空目录的文件是先删除,再创建
        if os.path.isdir(f"{self.output_pcm_path}"):
            shutil.rmtree(f"{self.output_pcm_path}")
        time.sleep(1)
        os.mkdir(f"{self.output_pcm_path}")
        # vad-demo.exe使用相对路径.\pcm和.\output_pcm,所以先要将当前工作目录切换到.\speech-vad-demo下不然vad-demo.exe找不到文件
        os.chdir(".\\speech-vad-demo\\")
        # 直接执行.\vad-demo.exe,其默认会将.\pcm\16k_1.pcm文件切割并输出到.\output_pcm目录下
        devide_video_command = ".\\vad-demo.exe"
        os.system(devide_video_command)
        # 切换回工作目录
        os.chdir("..\\")

    # 此函数用于将.\speech-vad-demo\output_pcm\下的文件的文件名的时间格式化成0:00:00,000形式
    def format_time(self, msecs):
        # 一个小时毫秒数
        hour_msecs = 60 * 60 * 1000
        # 一分钟对应毫秒数
        minute_msecs = 60 * 1000
        # 一秒钟对应毫秒数
        second_msecs = 1000
        # 文件名的时间是毫秒需要先转成秒。+500是为了四舍五入,//是整除
        # msecs = (msecs + 500) // 1000
        # 小时
        hour = msecs // hour_msecs
        if hour < 10:
            hour = f"0{hour}"
        # 扣除小时后剩余毫秒数
        hour_left_msecs = msecs % hour_msecs
        # 分钟
        minute = hour_left_msecs // minute_msecs
        # 如果不足10分钟那在其前补0凑成两位数格式
        if minute < 10:
            minute = f"0{minute}"
        # 扣除分钟后剩余毫秒数
        minute_left_msecs = hour_left_msecs % minute_msecs
        # 秒
        second = minute_left_msecs // second_msecs
        # 如果秒数不足10秒,一样在其前补0凑足两位数格式
        if second < 10:
            second = f"0{second}"
        # 扣除秒后剩余毫秒数
        second_left_msecs = minute_left_msecs % second_msecs
        # 如果不足10毫秒或100毫秒,在其前补0凑足三位数格式
        if second_left_msecs < 10:
            second_left_msecs = f"00{second_left_msecs}"
        elif second_left_msecs < 100:
            second_left_msecs = f"0{second_left_msecs}"
        # 格式化成00:00:00,000形式,并返回
        time_format = f"{hour}:{minute}:{second},{second_left_msecs}"
        return time_format

    # 此函数用于申请访问ai接口的access_token
    def get_access_token(self):
        # 此变量赋值成自己API Key的值
        client_id = 'f3wT23Otc8jXlDZ4HGtS4jfT'
        # 此变量赋值成自己Secret Key的值
        client_secret = 'YPPjW3E0VGPUOfZwhjNGVn7LTu3hwssj'
        auth_url = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret

        response_at = requests.get(auth_url)
        # 以json格式读取响应结果
        json_result = json.loads(response_at.text)
        # 获取access_token
        access_token = json_result['access_token']
        return access_token

    # 此函数用于将.\speech-vad-demo\output_pcm\下的单个文件由语音转成文件
    def transfer_voice_to_srt(self,access_token,filepath):
        # 百度语音识别接口
        url_voice_ident = "http://vop.baidu.com/server_api"
        # 接口规范,以json格式post数据
        headers = {
            'Content-Type': 'application/json'
        }
        # 打开pcm文件并读取文件内容
        pcm_obj = open(filepath,'rb')
        pcm_content_base64 = base64.b64encode(pcm_obj.read())
        pcm_obj.close()
        # 获取pcm文件大小
        pcm_content_len = os.path.getsize(filepath)

        # 接口规范,则体函义见官方文件,值得注意的是cuid和speech两个参数的写法
        post_data = {
            "format": "pcm",
            "rate": 16000,
            "dev_pid": 1737,
            "channel": 1,
            "token": access_token,
            "cuid": "1111111111",
            "len": pcm_content_len,
            "speech": pcm_content_base64.decode(),
        }
        proxies = {
            'http':"127.0.0.1:8080"
        }
        # 调用接口,进行音文转换
        response = requests.post(url_voice_ident, headers=headers, data=json.dumps(post_data))
        # response = requests.post(url_voice_ident,headers=headers,data=json.dumps(post_data),proxies=proxies)
        return response.text

if __name__ == "__main__":
    # 实例化
    baidu_voice_to_srt_obj = BaiduVoiceToTxt()
    # 自己要进行音文转换的音视存放的文件夹
    video_dir = ".\\video\\"
    all_video_file =[]
    all_file = os.listdir(video_dir)
    subtitle_format = "{\\fscx75\\fscy75}"
    # 只接受.mp3格式文件。因为其他格式没研究怎么转成pcm才是符合接口要求的
    for filename in all_file:
        if ".mp3" in filename:
            all_video_file.append(filename)
    all_video_file.sort()
    i = 0
    video_file_num = len(all_video_file)
    print(f"当前共有{video_file_num}个音频文件需要转换,即将进行处理请稍等...")
    # 此层for循环是逐个mp3文件进行处理
    for video_file_name in all_video_file:
        i += 1
        print(f"当前转换{video_file_name}({i}/{video_file_num})")
        # 将音视翻译成的内容输出到同目录下同名.txt文件中
        video_file_srt_path = f".\\video\\{video_file_name[:-4]}.srt"
        # 以覆盖形式打开.txt文件
        video_file_srt_obj = open(video_file_srt_path,'w+')

        filepath = os.path.join(video_dir, video_file_name)
        # 调用change_file_format将mp3转成pcm格式
        baidu_voice_to_srt_obj.change_file_format(filepath)
        # 将转换成的pcm文件切割成多个小于60秒的pcm文件
        baidu_voice_to_srt_obj.devide_video()
        # 获取token
        access_token = baidu_voice_to_srt_obj.get_access_token()
        # 获取.\speech-vad-demo\output_pcm\目录下的文件列表
        file_dir = baidu_voice_to_srt_obj.output_pcm_path
        all_pcm_file = os.listdir(file_dir)
        all_pcm_file.sort()
        j = 0
        pcm_file_num = len(all_pcm_file)
        print(f"当前所转文件{video_file_name}({i}/{video_file_num})被切分成{pcm_file_num}块,即将逐块进行音文转换请稍等...")
        # 此层for是将.\speech-vad-demo\output_pcm\目录下的所有文件逐个进行音文转换
        for filename in all_pcm_file:
            j += 1
            filepath = os.path.join(file_dir, filename)
            if (os.path.isfile(filepath)):
                # 获取文件名上的时间
                time_str = filename[10:-6]
                time_str_dict = time_str.split("-")
                time_start_str = baidu_voice_to_srt_obj.format_time(int(time_str_dict[0]))
                time_end_str = baidu_voice_to_srt_obj.format_time(int(time_str_dict[1]))
                print(f"当前转换{video_file_name}({i}/{video_file_num})-{time_start_str}-{time_end_str}({j}/{pcm_file_num})")
                response_text = baidu_voice_to_srt_obj.transfer_voice_to_srt(access_token, filepath)
                # 以json形式读取返回结果
                json_result = json.loads(response_text)
                # 将音文转换结果写入.srt文件
                video_file_srt_obj.writelines(f"{j}\r\n")
                video_file_srt_obj.writelines(f"{time_start_str} --> {time_end_str}\r\n")
                if json_result['err_no'] == 0:
                    print(f"{time_start_str}-{time_end_str}({j}/{pcm_file_num})转换成功:{json_result['result'][0]}")
                    video_file_srt_obj.writelines(f"{subtitle_format}{json_result['result'][0]}\r\n")
                elif json_result['err_no'] == 3301:
                    print(f"{time_start_str}-{time_end_str}({j}/{pcm_file_num})音频质量过差无法识别")
                    video_file_srt_obj.writelines(f"{subtitle_format}音频质量过差无法识别\r\n")
                else:
                    print(f"{time_start_str}-{time_end_str}({j}/{pcm_file_num})转换过程遇到其他错误")
                    video_file_srt_obj.writelines(f"{subtitle_format}转换过程遇到其他错误\r\n")
                video_file_srt_obj.writelines(f"\r\n")
        video_file_srt_obj.close()

腾讯(收费的)

到此这篇关于Python语音识别API实现文字转语音的几种方法的文章就介绍到这了,更多相关Python 文字转语音内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python文字转语音实现过程解析

    这篇文章主要介绍了python文字转语音实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 使用百度接口 接口地址 https://ai.baidu.com/docs#/TTS-Online-Python-SDK/top 安装接口 pip install baidu-aip from aip import AipSpeech """ 你的 APPID AK SK """ APP_ID =

  • python 利用pyttsx3文字转语音过程详解

    这篇文章主要介绍了python 利用pyttsx3文字转语音过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 # -*- coding: utf-8 -*- import pyttsx3 engine = pyttsx3.init() with open("all.txt",'r',encoding='utf-8') as f: while 1: line = f.readline() print(line, end = '')

  • Python详解文字转语音的实现

    前言: 这是一篇简单的Python文字(汉字)转语音教程,当然对于其他语言工具在实现的方法上也是一样的 . 汉字转语音实现就分为两步,第一步将汉字转为拼音,第二步通过拼音调用相匹配的音频文件.下面是具体的开发实例教程. 开发环境:Windows Python版本:3.x 外置模块准备:pygame(可直接在cmd命令行中pip install pygame安装) 汉字转拼音 我使用的是将汉字转为Unicode码,然后通过查询一个匹配文件(我使用的是unicode_py.txt)获取该汉字的拼音,

  • python文字转语音的实例代码分析

    使用百度接口 接口地址 https://ai.baidu.com/docs#/TTS-Online-Python-SDK/top 安装接口 pip install baidu-aip from aip import AipSpeech """ 你的 APPID AK SK """ APP_ID = '你的 App ID' API_KEY = '你的 Api Key' SECRET_KEY = '你的 Secret Key' client = Ai

  • 使用Python实现文字转语音并生成wav文件的例子

    目前手边的一些工作,需要实现声音播放功能,而且仅支持wav声音格式. 现在,一些网站上支持文字转语音功能,但是生成的都是MP3文件,这样还需要额外的软件来转成wav文件,十分麻烦. 后来,研究Python,发现Python可以很容易的实现上面的功能. 步骤如下, 1.使用百度语音实现TTS(Text To Speech),生成mp3文件; 2. 使用pydub和ffmpeg实现mp3转wav格式. 下面,先上简单的示例代码,然后对代码作简单的分析. #!/usr/bin/python -tt #

  • python3实现语音转文字(语音识别)和文字转语音(语音合成)

    话不多说,直接上代码运行截图  1.语音合成 -------> 执行: 结果: 输入要转换的内容,程序直接帮你把转换好的mp3文件输出(因为下一步–语音识别–需要.pcm格式的文件,程序自动执行格式转换,同时生成17k.pcm文件,暂时不用管,(你也可以通过修改默认参数改变文件输出的位置,名称及是否进行pcm转换 <------- 2.语音处理 ----> 方便起见, 我们直接运行语音处理程序,识别我们上一步的17k.pcm文件: What?识别居然出现了点错误,不过不用担心,博主已经调

  • Python语音识别API实现文字转语音的几种方法

    搜狗(目前好用,免费) def textToAudio_Sougou(message, filePath): # https://ai.so gou.com/doc/?url=/docs/content/tts/references/rest/ ''' curl -X POST \ -H "Content-Type: application/json" \ --data '{ "appid": "xxx", "appkey":

  • python常见读取语音的3种方法速度对比

    python 读取语音文件时,常用的无非以下三种方式,但是在我们数据量变的很大是,不同的读取方式之间的性能差异就会被进一步放大,于是本文着重对比了librosa.soundfile.wavfile三种方式的在重复读取一万次某个文件所耗时间的差异,为确保实验结果的可比性,每种方式读取出的语音序列值均一致.具体数值,在下方程序结果中已经标示. # -*- coding: utf-8 -*- """ # @Time : 2022/12/29 17:27 # @Author : Wa

  • Python中字典(dict)合并的四种方法总结

    本文主要给大家介绍了关于Python中字典(dict)合并的四种方法,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍: 字典是Python语言中唯一的映射类型. 映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表. 字典对象是可变的,它是一个容器类型,能存储任意个数的Python对象,其中也可包括其他容器类型. 字典类型与序列类型的区别: 1. 存取和访问数据的方式不同. 2. 序列类型只用数字类型的键(从序列的开始按数值顺序索引

  • Python获取当前页面内所有链接的四种方法对比分析

    本文实例讲述了Python获取当前页面内所有链接的四种方法.分享给大家供大家参考,具体如下: ''' 得到当前页面所有连接 ''' import requests import re from bs4 import BeautifulSoup from lxml import etree from selenium import webdriver url = 'http://www.testweb.com' r = requests.get(url) r.encoding = 'gb2312'

  • python爬虫 使用真实浏览器打开网页的两种方法总结

    1.使用系统自带库 os 这种方法的优点是,任何浏览器都能够使用, 缺点不能自如的打开一个又一个的网页 import os os.system('"C:/Program Files/Internet Explorer/iexplore.exe" http://www.baidu.com') 2.使用python 集成的库 webbroswer python的webbrowser模块支持对浏览器进行一些操作,主要有以下三个方法: import webbrowser webbrowser.

  • python修改list中所有元素类型的三种方法

    修改list中所有元素类型: 方法一: new = list() a = ['1', '2', '3'] for x in a: new.append(int(x)) print(new) 方法二: a = ['1', '2', '3'] b = [int(x) for x in a] print(b) 方法三: a = ['1', '2', '3'] print(map(int, a)) 以上这篇python修改list中所有元素类型的三种方法就是小编分享给大家的全部内容了,希望能给大家一个参

  • 对python捕获ctrl+c手工中断程序的两种方法详解

    日常编写调试运行程序过程中,难免需要手动停止,以下两种方法可以捕获ctrl+c立即停止程序 1.使用python的异常KeyboardInterrupt try: while 1: pass except KeyboardInterrupt: pass 2.使用signal模块 def exit(signum, frame): print('You choose to stop me.') exit() signal.signal(signal.SIGINT, exit) signal.sign

  • Python 炫技操作之合并字典的七种方法

    Python 语言里有许多(而且是越来越多)的高级特性,是 Python 发烧友们非常喜欢的.在这些人的眼里,能够写出那些一般开发者看不懂的高级特性,就是高手,就是大神. 但你要知道,在团队合作里,炫技是大忌. 为什么这么说呢?我说下自己的看法: 越简洁的代码,越清晰的逻辑,就越不容易出错: 在团队合作中,你的代码不只有你在维护,降低别人的阅读/理解代码逻辑的成本是一个良好的品德 简单的代码,只会用到最基本的语法糖,复杂的高级特性,会有更多的依赖(如语言的版本) 该篇是「炫技系列」的第二篇内容,

  • Python 获取异常(Exception)信息的几种方法

    异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种 Python 中获取异常信息的方法,这里获取异常(Exception)信息采用 try-except- 程序结构. 如下所示: try: print(x) except Exception as e: print(e) 1. str(e) 返回字符串类型,只给出异常信息,不包括异常信息的类型,如: try: print(x) except Exception as e: print(str(e)) 打印结

  • python批量生成身份证号到Excel的两种方法实例

    身份证号码的编排规则 前1.2位数字表示:所在省份的代码: 第3.4位数字表示:所在城市的代码: 第5.6位数字表示:所在区县的代码: 第7~14位数字表示:出生年.月.日: 第15.16位数字表示:所在地的派出所的代码: 第17位数字表示性别:奇数表示男性,偶数表示女性: 第18位数字是校检码,计算方法如下: (1)将前面的身份证号码17位数分别乘以不同的系数.从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2. (2)将这17位数字和系数相

随机推荐