• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

pythontkinter界面化+百度API—语音识别(一)

武飞扬头像
张顺财
帮助1

目录

 百度API

tkineter界面设计

完整代码:


 实现结果如下:

学新通

 百度API

语音识别功能是调用百度语音识别API去实现的。(这是百度开放的免费功能,每人可以注册领取免费资源。)所以我们需要在百度AI开放平台-全球领先的人工智能服务平台里去进行短语音识别的应用创建然后获取自己的ID、API key和Secre Key。

进入百度AI平台后选择开放能力下的语音技术-->语音识别-->短语音识别

学新通

选择【立即使用】进入,然后选择【创建应用】,根据提示创建完成即可获得自己的ID、API key和Secre Key。

学新通

 对百度API的调用和具体参数使用方法可以参考里面的【技术文档内容https://ai.百度.com/ai-doc/SPEECH/Vk38lxily】,这里只说在代码里具体用到的内容。(看代码部分)

tkineter界面设计

1.界面的初始化及布局:

代码里的以下三个参数的就是上面获得的ID、API key和Secre Key。

        self.ID = ' '
        self.Key = ' '
        self.Secret = ' '

  1.  
    def __init__(self):
  2.  
    self.ID = ''
  3.  
    self.Key = ''
  4.  
    self.Secret = ''
  5.  
    # 用语音类创建对象
  6.  
    self.client = AipSpeech(self.ID, self.Key, self.Secret) # 语音识别对象
  7.  
     
  8.  
    #创建窗口
  9.  
    self.window = Tk()# Toplevel() # Tk()
  10.  
    self.window.resizable(width=False, height=False)
  11.  
    self.window.title('语音识别') #设置标题
  12.  
    self. window. geometry('500x800') #设置窗口大小
  13.  
     
  14.  
    # 打开图像,转为tkinter兼容的对象,
  15.  
    img = Image.open('2.jpg').resize([500,800])
  16.  
    self.img = ImageTk.PhotoImage(img)
  17.  
    #创建画布,将图像作为画布背景, 铺满整个窗口
  18.  
    self.canvas = Canvas(self.window, width=500, height=800) #设置画布的宽、高
  19.  
    self.canvas.place(x=0, y=0)
  20.  
    self.canvas.create_image(250,400,image = self.img) #把图像放到画布,默认放置中心点
  21.  
    self.canvas.create_text(250, 100, text='语音识别', font=('宋体', 40)) #这个直接在画布上显示的标签,相当于透明背景色
  22.  
     
  23.  
    # 创建标题标签:这个是会有背景色的,会遮挡图片内容
  24.  
    # Label(self.window, bg='royalblue', text='语音识别', font=('宋体', 40), fg='white').pack(pady=100) # 上下间隔100
  25.  
    # 创建文本框
  26.  
    self.content = Text(self.window,width = 22,height = 5,font=('宋体',20))
  27.  
    self.content.place(x = 100, y =200)
  28.  
    # 创建按钮
  29.  
    Button(self.window,width = 10,text = '语音转文字',font=('宋体',20),fg='white',
  30.  
    command = lambda :self.StoT(),bg = 'dodgerblue',activebackground = 'black',activeforeground = 'white').place(x = 100, y =600) #activebackground 设置按键按下有变化 activebforeground设置前景色
  31.  
    Button(self.window, width = 10,text='文字转语音', font=('宋体', 20), fg='white',
  32.  
    command=lambda :self.say(), bg='dodgerblue', activebackground='black',
  33.  
    activeforeground='white').place(x = 260, y =600)
  34.  
    Button(self.window, width=21,text='返回', font=('宋体', 20), fg='white',
  35.  
    command=lambda :self.back(), bg='dodgerblue', activebackground='black',
  36.  
    activeforeground='white').place(x = 100, y =650)
  37.  
    Button(self.window, width=5, text='清空', font=('宋体', 20), fg='white',
  38.  
    command=lambda: self.delete_text(), bg='dodgerblue', activebackground='black',
  39.  
    activeforeground='white').place(x=300, y=350)
  40.  
    self.window.mainloop(0)
学新通

2.录音模块(根据声音的有无决定录音的结束):

  1.  
    def get_adio(sec=0):
  2.  
    p = pyaudio.PyAudio()
  3.  
    stream = p.open(format=pyaudio.paInt16,
  4.  
    channels=1,
  5.  
    rate=16000,
  6.  
    input=True,
  7.  
    frames_per_buffer=1024)
  8.  
    wf = wave.open('test.wav', 'wb')
  9.  
    wf.setnchannels(1)
  10.  
    wf.setsampwidth(p.get_sample_size(pyaudio.paInt16))
  11.  
    wf.setframerate(16000)
  12.  
    print('开始说话')
  13.  
    stopflag = 0
  14.  
    conflag = 0
  15.  
    while True:
  16.  
    data = stream.read(1024)
  17.  
    rt_data = np.frombuffer(data, np.dtype('<i2'))
  18.  
    fft_temp_data = fftpack.fft(rt_data, rt_data.size, overwrite_x=True)
  19.  
    fft_data = np.abs(fft_temp_data)[0:fft_temp_data.size // 2 1]
  20.  
    # print(sum(fft_data) // len (fft_data))
  21.  
    # 判断麦克风是否停止,判断说话是否结束,#麦克风阀值,默认7000
  22.  
    if sum(fft_data) // len(fft_data) > 7000:
  23.  
    conflag = 1
  24.  
    else:
  25.  
    stopflag = 1
  26.  
    oneSecond = int(16000 / 1024)
  27.  
    if stopflag conflag > oneSecond: # 如果两种情况的次数超过一帧的大小
  28.  
    if stopflag > oneSecond // 3 * 2: # 其中无声的部分超过一帧的2/3,则停止
  29.  
    break
  30.  
    else:
  31.  
    stopflag = 0
  32.  
    conflag = 0
  33.  
    wf.writeframes(data)
  34.  
    print('停止说话')
  35.  
    stream.stop_stream()
  36.  
    stream.close()
  37.  
    p.terminate()
  38.  
    wf.close()
  39.  
    return 'test.wav'
学新通

 3.语音转文本模块(这里就是调用的百度API去语音识别)

  1.  
    def StoT(self):
  2.  
    file = self.get_adio()
  3.  
    # 调用对象进行识别,需要为对象传递参数:
  4.  
    # 识别三种格式:wav,pcm,amr
  5.  
    # 语音文件,语音格式,采样频率,识别ID(1573:中文普通话)
  6.  
    Format = file[-3:]
  7.  
    data = open(file, 'rb').read()
  8.  
    result = self.client.asr(data, Format, 16000, {'dev_pid': 1537})
  9.  
    result = result['result'][0]
  10.  
    self.insert_text(result)
  11.  
    print(result)

 4.文本朗读模块(这里是调用python里的pyttsx3库去实现将文本语音播放出来)

  1.  
    def say(self):
  2.  
    engine = pyttsx3.init()
  3.  
    engine.say(self.content.get(0.0, END))
  4.  
    engine.runAndWait()

完整代码:

  1.  
    from tkinter import *
  2.  
    from PIL import Image,ImageTk
  3.  
    from aip import AipSpeech
  4.  
    import pyaudio
  5.  
    from scipy import fftpack
  6.  
    import wave
  7.  
    import numpy as np
  8.  
    import pyttsx3
  9.  
     
  10.  
    #语音识别界面设计,创建类,在构造方法中没计界面
  11.  
    class AsrPage():
  12.  
    def __init__(self):
  13.  
    self.ID = ''
  14.  
    self.Key = ''
  15.  
    self.Secret = ''
  16.  
    # 用语音类创建对象
  17.  
    self.client = AipSpeech(self.ID, self.Key, self.Secret) # 语音识别对象
  18.  
     
  19.  
    #创建窗口
  20.  
    self.window = Tk()# Toplevel() # Tk()
  21.  
    self.window.resizable(width=False, height=False)
  22.  
    self.window.title('语音识别') #设置标题
  23.  
    self. window. geometry('500x800') #设置窗口大小
  24.  
     
  25.  
    # 打开图像,转为tkinter兼容的对象,
  26.  
    img = Image.open('2.jpg').resize([500,800])
  27.  
    self.img = ImageTk.PhotoImage(img)
  28.  
    #创建画布,将图像作为画布背景, 铺满整个窗口
  29.  
    self.canvas = Canvas(self.window, width=500, height=800) #设置画布的宽、高
  30.  
    self.canvas.place(x=0, y=0)
  31.  
    self.canvas.create_image(250,400,image = self.img) #把图像放到画布,默认放置中心点
  32.  
    self.canvas.create_text(250, 100, text='语音识别', font=('宋体', 40))
  33.  
     
  34.  
    # 创建标题标签
  35.  
    # Label(self.window, bg='royalblue', text='语音识别', font=('宋体', 40), fg='white').pack(pady=90) # 上下间隔100
  36.  
    # 创建文本框
  37.  
    self.content = Text(self.window,width = 22,height = 5,font=('宋体',20))
  38.  
    self.content.place(x = 100, y =200)
  39.  
    # 创建按钮
  40.  
    Button(self.window,width = 10,text = '语音转文字',font=('宋体',20),fg='white',
  41.  
    command = lambda :self.StoT(),bg = 'dodgerblue',activebackground = 'black',
  42.  
    activeforeground = 'white').place(x = 100, y =600) #activebackground 设置按键按下有变化 activebforeground设置前景色
  43.  
    # Button(self.window, width = 5,text='识别', font=('宋体', 20), fg='white',
  44.  
    # command=self.jumpweb2, bg='dodgerblue', activebackground='black',
  45.  
    # activeforeground='white').place(x = 200, y =600)
  46.  
    Button(self.window, width = 10,text='文字转语音', font=('宋体', 20), fg='white',
  47.  
    command=lambda :self.say(), bg='dodgerblue', activebackground='black',
  48.  
    activeforeground='white').place(x = 260, y =600)
  49.  
    Button(self.window, width=21,text='返回', font=('宋体', 20), fg='white',
  50.  
    command=lambda :self.back(), bg='dodgerblue', activebackground='black',
  51.  
    activeforeground='white').place(x = 100, y =650)
  52.  
    Button(self.window, width=5, text='清空', font=('宋体', 20), fg='white',
  53.  
    command=lambda: self.delete_text(), bg='dodgerblue', activebackground='black',
  54.  
    activeforeground='white').place(x=300, y=350)
  55.  
    self.window.mainloop(0)
  56.  
     
  57.  
    def delete_text(self):
  58.  
    self.content.delete(0.0,END)
  59.  
    def insert_text(self,text):
  60.  
    self.content.insert('insert',text)
  61.  
     
  62.  
     
  63.  
    def get_adio(sec=0):
  64.  
    p = pyaudio.PyAudio()
  65.  
    stream = p.open(format=pyaudio.paInt16,
  66.  
    channels=1,
  67.  
    rate=16000,
  68.  
    input=True,
  69.  
    frames_per_buffer=1024)
  70.  
    wf = wave.open('test.wav', 'wb')
  71.  
    wf.setnchannels(1)
  72.  
    wf.setsampwidth(p.get_sample_size(pyaudio.paInt16))
  73.  
    wf.setframerate(16000)
  74.  
    print('开始说话')
  75.  
    stopflag = 0
  76.  
    conflag = 0
  77.  
    while True:
  78.  
    data = stream.read(1024)
  79.  
    rt_data = np.frombuffer(data, np.dtype('<i2'))
  80.  
    fft_temp_data = fftpack.fft(rt_data, rt_data.size, overwrite_x=True)
  81.  
    fft_data = np.abs(fft_temp_data)[0:fft_temp_data.size // 2 1]
  82.  
    # print(sum(fft_data) // len (fft_data))
  83.  
    # 判断麦克风是否停止,判断说话是否结束,#麦克风阀值,默认7000
  84.  
    if sum(fft_data) // len(fft_data) > 7000:
  85.  
    conflag = 1
  86.  
    else:
  87.  
    stopflag = 1
  88.  
    oneSecond = int(16000 / 1024)
  89.  
    if stopflag conflag > oneSecond: # 如果两种情况的次数超过一帧的大小
  90.  
    if stopflag > oneSecond // 3 * 2: # 其中无声的部分超过一帧的2/3,则停止
  91.  
    break
  92.  
    else:
  93.  
    stopflag = 0
  94.  
    conflag = 0
  95.  
    wf.writeframes(data)
  96.  
    print('停止说话')
  97.  
    stream.stop_stream()
  98.  
    stream.close()
  99.  
    p.terminate()
  100.  
    wf.close()
  101.  
    return 'test.wav'
  102.  
    def say(self):
  103.  
    engine = pyttsx3.init()
  104.  
    engine.say(self.content.get(0.0, END))
  105.  
    engine.runAndWait()
  106.  
     
  107.  
    def StoT(self):
  108.  
    file = self.get_adio()
  109.  
    # 调用对象进行识别,需要为对象传递参数:
  110.  
    # 识别三种格式:wav,pcm,amr
  111.  
    # 语音文件,语音格式,采样频率,识别ID(1573:中文普通话)
  112.  
    Format = file[-3:]
  113.  
    data = open(file, 'rb').read()
  114.  
    result = self.client.asr(data, Format, 16000, {'dev_pid': 1537})
  115.  
    result = result['result'][0]
  116.  
    self.insert_text(result)
  117.  
    print(result)
  118.  
     
  119.  
    def back(self):
  120.  
    self.window.destroy()
  121.  
     
  122.  
    AsrPage()
  123.  
     
学新通

 代码里用到的素材:背景图

学新通

 (这是我在学校学习的内容,在这里当做一个学习的记录和分享。上述都是本人自己的理解可能有描述错误的以及解释错误的地方,望谅解!(会持续改进的))

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgcgbbe
系列文章
更多 icon
同类精品
更多 icon
继续加载