IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 【python】tkinter界面化+百度API—语音识别 -> 正文阅读

[人工智能]【python】tkinter界面化+百度API—语音识别

?

目录

?百度API

tkineter界面设计

完整代码:


?实现结果如下:

?百度API

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

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

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

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

tkineter界面设计

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

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

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

    def __init__(self):
        self.ID = ''
        self.Key = ''
        self.Secret = ''
        # 用语音类创建对象
        self.client = AipSpeech(self.ID, self.Key, self.Secret)  # 语音识别对象

        #创建窗口
        self.window = Tk()# Toplevel() # Tk()
        self.window.resizable(width=False, height=False)
        self.window.title('语音识别')  #设置标题
        self. window. geometry('500x800') #设置窗口大小

        # 打开图像,转为tkinter兼容的对象,
        img = Image.open('2.jpg').resize([500,800])
        self.img = ImageTk.PhotoImage(img)
        #创建画布,将图像作为画布背景, 铺满整个窗口
        self.canvas = Canvas(self.window, width=500, height=800) #设置画布的宽、高
        self.canvas.place(x=0, y=0) 
        self.canvas.create_image(250,400,image = self.img) #把图像放到画布,默认放置中心点
        self.canvas.create_text(250, 100, text='语音识别', font=('宋体', 40)) #这个直接在画布上显示的标签,相当于透明背景色

        # 创建标题标签:这个是会有背景色的,会遮挡图片内容 
        # Label(self.window, bg='royalblue', text='语音识别', font=('宋体', 40), fg='white').pack(pady=100)  # 上下间隔100
        # 创建文本框
        self.content = Text(self.window,width = 22,height = 5,font=('宋体',20))
        self.content.place(x = 100, y =200)
        # 创建按钮
        Button(self.window,width = 10,text = '语音转文字',font=('宋体',20),fg='white',
               command = lambda :self.StoT(),bg = 'dodgerblue',activebackground =     'black',activeforeground = 'white').place(x = 100, y =600)  #activebackground 设置按键按下有变化 activebforeground设置前景色
        Button(self.window, width = 10,text='文字转语音', font=('宋体', 20), fg='white',
               command=lambda :self.say(), bg='dodgerblue', activebackground='black',
               activeforeground='white').place(x = 260, y =600)
        Button(self.window, width=21,text='返回', font=('宋体', 20), fg='white',
               command=lambda :self.back(), bg='dodgerblue', activebackground='black',
               activeforeground='white').place(x = 100, y =650)
        Button(self.window, width=5, text='清空', font=('宋体', 20), fg='white',
               command=lambda: self.delete_text(), bg='dodgerblue', activebackground='black',
               activeforeground='white').place(x=300, y=350)
        self.window.mainloop(0)

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

    def get_adio(sec=0):
        p = pyaudio.PyAudio()
        stream = p.open(format=pyaudio.paInt16,
                        channels=1,
                        rate=16000,
                        input=True,
                        frames_per_buffer=1024)
        wf = wave.open('test.wav', 'wb')
        wf.setnchannels(1)
        wf.setsampwidth(p.get_sample_size(pyaudio.paInt16))
        wf.setframerate(16000)
        print('开始说话')
        stopflag = 0
        conflag = 0
        while True:
            data = stream.read(1024)
            rt_data = np.frombuffer(data, np.dtype('<i2'))
            fft_temp_data = fftpack.fft(rt_data, rt_data.size, overwrite_x=True)
            fft_data = np.abs(fft_temp_data)[0:fft_temp_data.size // 2 + 1]
            # print(sum(fft_data) // len (fft_data))
            # 判断麦克风是否停止,判断说话是否结束,#麦克风阀值,默认7000
            if sum(fft_data) // len(fft_data) > 7000:
                conflag += 1
            else:
                stopflag += 1
            oneSecond = int(16000 / 1024)
            if stopflag + conflag > oneSecond:  # 如果两种情况的次数超过一帧的大小
                if stopflag > oneSecond // 3 * 2:  # 其中无声的部分超过一帧的2/3,则停止
                    break
                else:
                    stopflag = 0
                    conflag = 0
            wf.writeframes(data)
        print('停止说话')
        stream.stop_stream()
        stream.close()
        p.terminate()
        wf.close()
        return 'test.wav'

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

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

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

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

完整代码:

from tkinter import *
from PIL import Image,ImageTk
from aip import  AipSpeech
import pyaudio
from scipy import fftpack
import wave
import numpy as np
import pyttsx3

#语音识别界面设计,创建类,在构造方法中没计界面
class AsrPage():
    def __init__(self):
        self.ID = '25119908'
        self.Key = '7BMfjrjk1wNpNoS6E3pcQCaR'
        self.Secret = 'fA3hWZPnlr1cWC3Kb9wKKCmGS2oOrUD9'
        # 用语音类创建对象
        self.client = AipSpeech(self.ID, self.Key, self.Secret)  # 语音识别对象

        #创建窗口
        self.window = Tk()# Toplevel() # Tk()
        self.window.resizable(width=False, height=False)
        self.window.title('语音识别')  #设置标题
        self. window. geometry('500x800') #设置窗口大小

        # 打开图像,转为tkinter兼容的对象,
        img = Image.open('2.jpg').resize([500,800])
        self.img = ImageTk.PhotoImage(img)
        #创建画布,将图像作为画布背景, 铺满整个窗口
        self.canvas = Canvas(self.window, width=500, height=800) #设置画布的宽、高
        self.canvas.place(x=0, y=0)
        self.canvas.create_image(250,400,image = self.img) #把图像放到画布,默认放置中心点
        self.canvas.create_text(250, 100, text='语音识别', font=('宋体', 40))

        # 创建标题标签
        # Label(self.window, bg='royalblue', text='语音识别', font=('宋体', 40), fg='white').pack(pady=90)  # 上下间隔100
        # 创建文本框
        self.content = Text(self.window,width = 22,height = 5,font=('宋体',20))
        self.content.place(x = 100, y =200)
        # 创建按钮
        Button(self.window,width = 10,text = '语音转文字',font=('宋体',20),fg='white',
               command = lambda :self.StoT(),bg = 'dodgerblue',activebackground = 'black',
               activeforeground = 'white').place(x = 100, y =600)  #activebackground 设置按键按下有变化 activebforeground设置前景色
        # Button(self.window, width = 5,text='识别', font=('宋体', 20), fg='white',
        #        command=self.jumpweb2, bg='dodgerblue', activebackground='black',
        #        activeforeground='white').place(x = 200, y =600)
        Button(self.window, width = 10,text='文字转语音', font=('宋体', 20), fg='white',
               command=lambda :self.say(), bg='dodgerblue', activebackground='black',
               activeforeground='white').place(x = 260, y =600)
        Button(self.window, width=21,text='返回', font=('宋体', 20), fg='white',
               command=lambda :self.back(), bg='dodgerblue', activebackground='black',
               activeforeground='white').place(x = 100, y =650)
        Button(self.window, width=5, text='清空', font=('宋体', 20), fg='white',
               command=lambda: self.delete_text(), bg='dodgerblue', activebackground='black',
               activeforeground='white').place(x=300, y=350)
        self.window.mainloop(0)

    def delete_text(self):
        self.content.delete(0.0,END)
    def insert_text(self,text):
        self.content.insert('insert',text)


    def get_adio(sec=0):
        p = pyaudio.PyAudio()
        stream = p.open(format=pyaudio.paInt16,
                        channels=1,
                        rate=16000,
                        input=True,
                        frames_per_buffer=1024)
        wf = wave.open('test.wav', 'wb')
        wf.setnchannels(1)
        wf.setsampwidth(p.get_sample_size(pyaudio.paInt16))
        wf.setframerate(16000)
        print('开始说话')
        stopflag = 0
        conflag = 0
        while True:
            data = stream.read(1024)
            rt_data = np.frombuffer(data, np.dtype('<i2'))
            fft_temp_data = fftpack.fft(rt_data, rt_data.size, overwrite_x=True)
            fft_data = np.abs(fft_temp_data)[0:fft_temp_data.size // 2 + 1]
            # print(sum(fft_data) // len (fft_data))
            # 判断麦克风是否停止,判断说话是否结束,#麦克风阀值,默认7000
            if sum(fft_data) // len(fft_data) > 7000:
                conflag += 1
            else:
                stopflag += 1
            oneSecond = int(16000 / 1024)
            if stopflag + conflag > oneSecond:  # 如果两种情况的次数超过一帧的大小
                if stopflag > oneSecond // 3 * 2:  # 其中无声的部分超过一帧的2/3,则停止
                    break
                else:
                    stopflag = 0
                    conflag = 0
            wf.writeframes(data)
        print('停止说话')
        stream.stop_stream()
        stream.close()
        p.terminate()
        wf.close()
        return 'test.wav'
    def say(self):
        engine = pyttsx3.init()
        engine.say(self.content.get(0.0, END))
        engine.runAndWait()

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

    def back(self):
        self.window.destroy()

AsrPage()

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

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

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-11-12 19:35:31  更:2021-11-12 19:36:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 6:08:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码