思路:录制本地文件->调用API进行识别->返回结果

 

首先使用pip安装pyaudio

pip3 install pyaudio

emmm

常规操作

去pypi看一下 https://pypi.org/project/PyAudio/#files

发现pypi目前还没有更新python3.7的pyaudio包

先去网上找一找有没有第三方做过

果然有->https://github.com/intxcc/pyaudio_portaudio

哈哈 还有release版本

直接下载然后用 pip安装即可!

nice!

官方文档在这里->http://people.csail.mit.edu/hubert/pyaudio/

试一下录音的example吧

import pyaudio
import wave

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)

print("* recording")

frames = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)

print("* done recording")

stream.stop_stream()
stream.close()
p.terminate()

wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()

完全没问题!

那么录音没问题了???

当然不是,下图是百度语音识别开发文档

由于使用百度的语音识别api,就必须按照他们的规矩来

因为pyaudio录制的是wav需要转一下;百度开发文档还是很贴心的给出了FFmpeg 的许多转换命令。

 

wav 文件转 16k 16bits 位深的单声道pcm文件

ffmpeg -y  -i 16k.wav  -acodec pcm_s16le -f s16le -ac 1 -ar 16000 16k.pcm 

44100 采样率 单声道 16bts pcm 文件转 16000采样率 16bits 位深的单声道pcm文件

ffmpeg -y -f s16le -ac 1 -ar 44100 -i test44.pcm  -acodec pcm_s16le -f s16le -ac 1 -ar 16000 16k.pcm 

mp3 文件转 16K 16bits 位深的单声道 pcm文件

ffmpeg -y  -i aidemo.mp3  -acodec pcm_s16le -f s16le -ac 1 -ar 16000 16k.pcm 

// -acodec pcm_s16le pcm_s16le 16bits 编码器 
// -f s16le 保存为16bits pcm格式
// -ac 1 单声道
//  -ar 16000  16000采样率

如果你的电脑没有安装ffmeg 请去->http://ffmpeg.org/

 

安装百度语音的Python包

pip install baidu-aip

没有出现问题(注意使用百度语音需要注册百度开发者【不要钱】)

接下来就是仿照开发文档写一个调用即可!

如图我共写了三个py

record.py 主要用来录音(产生一个output.wav)

wav2pcm.py主要是使用FFmpeg进行音频格式转换(output.wav -> output.pcm)

main.py 主要是创建百度语音api客户端然后提交pcm格式语音并从服务器获得识别结果

 

record.py

import pyaudio
import wave

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 16000
RECORD_SECONDS = 3
WAVE_OUTPUT_FILENAME = "output.wav"
def rec():
    p = pyaudio.PyAudio()

    stream = p.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK)

    print("* 请讲话!")

    frames = []

    for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
        data = stream.read(CHUNK)
        frames.append(data)

    print("* 请闭嘴!")

    stream.stop_stream()
    stream.close()
    p.terminate()

    wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(b''.join(frames))
    wf.close()

 

wav2pcm.py

import os

def wav2pcm(wav_file):
    # 假设 wav_file = "音频文件.wav"
    # wav_file.split(".") 得到["音频文件","wav"] 拿出第一个结果"音频文件"  与 ".pcm" 拼接 等到结果 "音频文件.pcm"
    pcm_file = "%s.pcm" %(wav_file.split(".")[0])

    # 执行转换
    os.system("ffmpeg -y  -i %s  -acodec pcm_s16le -f s16le -ac 1 -ar 16000 %s"%(wav_file,pcm_file))

    return pcm_file

 

main.py

import record
import wav2pcm
from aip import AipSpeech

#百度语音的三个参数
APP_ID = "*"
API_KEY = "*"
SECRET_KEY = "*"

#录音
record.rec()

#wav转pcm
wav2pcm.wav2pcm("output.wav")

#读取pcm文件
with open("output.pcm","rb") as fp:
    file_context = fp.read()

print("识别中...")
#调用百度语音API进行识别
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
res = client.asr(file_context,"pcm",16000,{'dev_pid':1536,})

#打印结果
#print(res['err_msg'])
print(res['result'])