视频音频转文字-长音频的识别

今天看到一篇很好的朗读,想把它转成文字,现知的方法有几种:

1、手机上讯飞输入法的实时语音识别。但需要人一直在旁边,需要声音外放。
2、已知的一些识别软件或者字幕软件。但找着麻烦,有的还要付费。
3、调用百度或者讯飞的接口。有好几种模式,这里采用最普通的语音识别接口,还有其他接口有待尝试。问题是坑坑巨多。
下面就3开始具体展开。
代码部分可参考百度官方示例:https://ai.baidu.com/ai-doc/SPEECH/6k38lxp0r
;https://github.com/Baidu-AIP/speech-demo。
踩得坑有这些:MP3转wav格式,wav的切割(因为普通的语音识别不支持太长的语音),wav参数的转换(采样率受代码限制,只能是16000或者8000),语音识别代码的选取(刚开始用的是谷歌的接口,在网上找了很多都是这个,但是这个总有一些奇奇怪怪的bug,开了梯子也没用)

MP3转wav格式和wav参数的转换可以通过这个软件解决:https://jingyan.baidu.com/article/c74d6000dcadee0f6a595dd2.html

wav的切割如下:`

 f = wave.open(r"yu2.wav", "rb")
    params = f.getparams()
    anchannels, asampwidth, aframerate, anframes = params[:4]
    print(aframerate)
    if not aframerate == 16000:
        print("采样率错误")

    neirong = []
    sound,shichang = get_wav_make("yu2.wav")
    mm = np.linspace(0,shichang,shichang/8000)
    print(shichang,mm)
    for i in range(0,len(mm)-1):
        begin = mm[i]
        end = mm[i+1]
        cut_wav = sound[begin:end]  # 以毫秒为单位截取[begin, end]区间的音频
        cut_wav.export("E:/py/语音转文字/分割/" + "test" + str(i)+".wav", format='wav')  # 存储新的wav文件

`
全部代码:

from pydub import AudioSegment
import numpy as np
# filePath = '.../'
import sys
import json
import base64
import time
import wave
IS_PY3 = sys.version_info.major == 3

if IS_PY3:
    from urllib.request import urlopen
    from urllib.request import Request
    from urllib.error import URLError
    from urllib.parse import urlencode
    timer = time.perf_counter
else:
    from urllib2 import urlopen
    from urllib2 import Request
    from urllib2 import URLError
    from urllib import urlencode
    if sys.platform == "win32":
        timer = time.clock
    else:
        # On most other platforms the best timer is time.time()
        timer = time.time

API_KEY = 'yours API_KEY'
SECRET_KEY = 'yours SECRET_KEY'




CUID = '123456PYTHON'
# 采样率
RATE = 16000  # 固定值

# 普通版

DEV_PID = 1537  # 1537 表示识别普通话,使用输入法模型。根据文档填写PID,选择语言及识别模型
ASR_URL = 'http://vop.baidu.com/server_api'
SCOPE = 'audio_voice_assistant_get'  # 有此scope表示有asr能力,没有请在网页里勾选,非常旧的应用可能没有

#测试自训练平台需要打开以下信息, 自训练平台模型上线后,您会看见 第二步:“”获取专属模型参数pid:8001,modelid:1234”,按照这个信息获取 dev_pid=8001,lm_id=1234
# DEV_PID = 8001 ;
# LM_ID = 1234 ;

# 极速版 打开注释的话请填写自己申请的appkey appSecret ,并在网页中开通极速版(开通后可能会收费)

# DEV_PID = 80001
# ASR_URL = 'http://vop.baidu.com/pro_api'
# SCOPE = 'brain_enhanced_asr'  # 有此scope表示有极速版能力,没有请在网页里开通极速版

# 忽略scope检查,非常旧的应用可能没有
# SCOPE = False

class DemoError(Exception):
    pass


"""  TOKEN start """

TOKEN_URL = 'http://openapi.baidu.com/oauth/2.0/token'


def fetch_token():
    params = {'grant_type': 'client_credentials',
              'client_id': API_KEY,
              'client_secret': SECRET_KEY}
    post_data = urlencode(params)
    if (IS_PY3):
        post_data = post_data.encode( 'utf-8')
    req = Request(TOKEN_URL, post_data)
    try:
        f = urlopen(req)
        result_str = f.read()
    except URLError as err:
        # print('token http response http code : ' + str(err.code))
        result_str = err.read()
    if (IS_PY3):
        result_str =  result_str.decode()

    # print(result_str)
    result = json.loads(result_str)
    # print(result)
    if ('access_token' in result.keys() and 'scope' in result.keys()):
        # print(SCOPE)
        if SCOPE and (not SCOPE in result['scope'].split(' ')):  # SCOPE = False 忽略检查
            raise DemoError('scope is not correct')
        # print('SUCCESS WITH TOKEN: %s  EXPIRES IN SECONDS: %s' % (result['access_token'], result['expires_in']))
        return result['access_token']
    else:
        raise DemoError('MAYBE API_KEY or SECRET_KEY not correct: access_token or scope not found in token response')

"""  TOKEN end """

# 操作函数
def get_wav_make(dataDir):
    sound = AudioSegment.from_wav(dataDir)
    duration = sound.duration_seconds  *10*1000 # 音频时长(ms)
    # begin = 0
    # end = int(duration / 2)
    # cut_wav = sound[begin:end]  # 以毫秒为单位截取[begin, end]区间的音频
    # cut_wav.export(filePath + 'test.wav', format='wav')  # 存储新的wav文件
    return  sound,duration

if __name__ == '__main__':
    f = wave.open(r"yu2.wav", "rb")
    params = f.getparams()
    anchannels, asampwidth, aframerate, anframes = params[:4]
    print(aframerate)
    if not aframerate == 16000:
        print("采样率错误")

    neirong = []
    sound,shichang = get_wav_make("yu2.wav")
    mm = np.linspace(0,shichang,shichang/8000)
    print(shichang,mm)
    for i in range(0,len(mm)-1):
        begin = mm[i]
        end = mm[i+1]
        cut_wav = sound[begin:end]  # 以毫秒为单位截取[begin, end]区间的音频
        cut_wav.export("E:/py/语音转文字/分割/" + "test" + str(i)+".wav", format='wav')  # 存储新的wav文件
        filename = "E:/py/语音转文字/分割/" + "test" + str(i)+".wav"
        AUDIO_FILE = filename  # 只支持 pcm/wav/amr 格式,极速版额外支持m4a 格式
        # 文件格式
        FORMAT = AUDIO_FILE[-3:]  # 文件后缀只支持 pcm/wav/amr 格式,极速版额外支持m4a 格式
        token = fetch_token()

        speech_data = []
        with open(AUDIO_FILE, 'rb') as speech_file:
            speech_data = speech_file.read()

        length = len(speech_data)
        if length == 0:
            raise DemoError('file %s length read 0 bytes' % AUDIO_FILE)
        speech = base64.b64encode(speech_data)
        if (IS_PY3):
            speech = str(speech, 'utf-8')
        params = {'dev_pid': DEV_PID,
                  # "lm_id" : LM_ID,    #测试自训练平台开启此项
                  'format': FORMAT,
                  'rate': RATE,
                  'token': token,
                  'cuid': CUID,
                  'channel': 1,
                  'speech': speech,
                  'len': length
                  }
        post_data = json.dumps(params, sort_keys=False)
        # print post_data
        req = Request(ASR_URL, post_data.encode('utf-8'))
        req.add_header('Content-Type', 'application/json')
        try:
            begin = timer()
            f = urlopen(req)
            result_str = f.read()
            print("Request time cost %f" % (timer() - begin))
        except URLError as err:
            print('asr http response http code : ' + str(err.code))
            result_str = err.read()

        if (IS_PY3):
            result_str = str(result_str, 'utf-8')

        print(result_str)
        neirong.append(result_str)
        time.sleep(0.2)

时间匆忙,万望海涵。有事请私信,谢谢。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值