zoukankan      html  css  js  c++  java
  • python调用百度语音(语音识别-斗地主语音记牌器)

    一、概述

    本篇简要介绍百度语音语音识别的基本使用(其实是斗地主时想弄个记牌器又没money,抓包什么的又不会,只好搞语音识别的了)

    二、创建应用

    打开百度语音官网产品与使用->语音识别->立即使用->创建应用

    出现如下页面

    依照提示依次填写,最终结果

    (ps:我就想弄个记牌的,就起了个计数器的名)

    点右方的 ‘查看key’ 记下App ID,API Key,Secret Key。接下来要用到

     

    需要安装模块
    
    pip install baidu-aip
    pip install pyaudio

    语音识别代码

    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)
    
    # 读取文件
    def get_file_content(filePath):
        with open(filePath, 'rb') as fp:
            return fp.read()
    # 识别本地文件
    li=client.asr(get_file_content('01.pcm'), 'pcm', 8000, {
        'lan': 'zh',
    })
    
    print(li)
    # 从URL获取文件识别
    # client.asr('', 'pcm', 16000, {
    #     'url': 'http://121.40.195.233/res/16k_test.pcm',
    #     'callback': 'http://xxx.com/receive',
    # })

    python录音代码

    import wave
    from pyaudio import PyAudio,paInt16
    
    framerate=8000
    NUM_SAMPLES=2000
    channels=1
    sampwidth=2
    TIME=2
    def save_wave_file(filename,data):
        '''save the date to the wavfile'''
        wf=wave.open(filename,'wb')
        wf.setnchannels(channels)
        wf.setsampwidth(sampwidth)
        wf.setframerate(framerate)
        wf.writeframes(b"".join(data))
        wf.close()
    
    def my_record():
        pa=PyAudio()
        stream=pa.open(format = paInt16,channels=1,
                       rate=framerate,input=True,
                       frames_per_buffer=NUM_SAMPLES)
        my_buf=[]
        count=0
        while count<TIME*5:#控制录音时间
            string_audio_data = stream.read(NUM_SAMPLES)
            my_buf.append(string_audio_data)
            count+=1
            print('.')
        save_wave_file('01.pcm',my_buf)
        stream.close()
    
    chunk=2014
    def play():
        wf=wave.open(r"01.pcm",'rb')
        p=PyAudio()
        stream=p.open(format=p.get_format_from_width(wf.getsampwidth()),channels=
        wf.getnchannels(),rate=wf.getframerate(),output=True)
        while True:
            data=wf.readframes(chunk)
            if data=="":break
            stream.write(data)
        stream.close()
        p.terminate()
    
    if __name__ == '__main__':
        my_record()
        print('Over!')
        play()

    效果如下图:

     

    帮助文档:

    百度语音帮助文档or手册

    三、后记

    本代码未完全实现,有兴趣可自行整理,玩斗地主的时候声音可能要大点,因为识别有时候会报3001错误,音频质量过差,不过被打可别找我

  • 相关阅读:
    Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别
    用foreach遍历 datagridView 指定列所有的内容
    treeView1.SelectedNode.Level
    YES NO 上一个 下一个
    正则 单词全字匹配查找 reg 边界查找 精确匹配 只匹配字符 不含连续的字符
    抓取2个字符串中间的字符串
    sqlite 60000行 插入到数据库只用不到2秒
    将多行文本以单行的格式保存起来 读和写 ini
    将秒转换成时间格式
    richtextbox Ctrl+V只粘贴纯文本格式
  • 原文地址:https://www.cnblogs.com/qflyue/p/8489541.html
Copyright © 2011-2022 走看看