flask5+baidu+tuling + 语音合成识别nlp httpx js处理录音

flask+day92+人工智能初识

替代

耳朵 = 麦克风 = 语音识别 ASR

嘴巴 = 扬声器 = 语音合成 TTS Text To Speech

眼睛 = 摄像头 = 图像识别 IR

思考 = 逻辑处理 = 自然语言处理 NLP Natural Language Processing

if else ....   用自然语言处理,用模型计算相似度

AI做什么?

大数据和人工智能之间的小关系 (没关系)

但是,机器学习需要样本数据,从大数据中来

小猪佩奇(![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\qqpyimg1563238652.gif))第一眼是小猪的采集率达到90%

爬虫 == 数据采集

文字识别 扣除文字, 然后通用翻译 做出一个字典来(两个接口)

错误的把(抄的东西错了,能不能认真一点)

function loginGc() {
    var username = document.getElementById('username').value;
    ws  = new WebSocket('ws://192.168.16.90:9534/my_socket/'+username);
    ws.onmessage = function (eventMessage) {
        console.log(eventMessage.data);
        str_obj = JSON.parse(eventMessage.data);
        var p = document.createElement('p');
        p.innerText = str_obj.from_user + ': '+ str_obj.chat;              // chat 是自己发自己获得的数据
        document.getElementById('chat_list').appendChild(p);
    };
}



function send_msg() {
    var content = document.getElementById('content').value;
    var username = document.getElementById('username').value;
    var sendStr = {
        from_user : username ,
        chat : content
    };
    ws.send(JSON.stringify(sendStr));
}

16k采样率(声波采集的越多,越清晰) 16 位深 pcm (不压缩 ,识别) 解析更好,更清晰了,wav (不压缩,pcm编码)更大了,

语音识别不超过60s

dev_pid 识别普通话、川普。。。

电脑上面的两个点: 一个是麦克风,一个是灯

语音合成步骤

进入百度智能云,登录管理控制台

新建项目,

https://ai.baidu.com/docs#/ASR-Online-Python-SDK/top 技术文档

from aip import AipSpeech

""" 你的 APPID AK SK """
APP_ID = '16815965'
API_KEY = 'uGdZBUTL05BvFPQ4wd4IsRWl'
SECRET_KEY = 'qHbEWHlivTKtn7lQrT1bcMWZfsuvlNeE'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

# 读取文件
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

# 识别本地文件
res = client.asr(get_file_content('audio.pcm'), 'pcm', 16000, {
    'dev_pid': 1536,
})

result  = client.synthesis('''面朝大海,春暖花开
作者:海子
从明天起,做一个幸福的人,
喂马,劈柴,周游世界;
从明天起,关心粮食和蔬菜,
我有一所房子,面朝大海,春暖花开;

从明天起,和每一个亲人通信,
告诉他们我的幸福;
那幸福的闪电告诉我的,
我将告诉每一个人;

给每一条河每一座山取一个温暖的名字,
陌生人,我也为你祝福;
愿你有一个灿烂的前程,
愿你有情人终成眷属;
愿你在尘世获得幸福;
我只愿面朝大海,春暖花开;''', 'zh', 1, {
    'vol': 5, 'per':3, 'spd':5, 'pit':5
})

前端报这个错误,但是错误是后端的。

ws.send(JSON.stringify(sendStr));	

错误位置

# msg = json.loads(user_socket.receive())
msg = user_socket.receive()

为什么不用json,也难怪send前端会出错,这里receive出错了,

刚开始,前后两端都应该有错,但是我那个前后端都不报错,却不正常显示的是哪里的错误呢?

就是这个。 msg = json.loads(user_socket.receive())

数据传不过去。

数据

user_socket.receive()		{"from_user":"agettweatwet","chat":"aetatewatetawe"} 							<class 'str'>
json.loads(user_socket.receive())  {'from_user': 'aaetawe', 'chat': 'atetwet'}  <class 'dict'>
usocket.send(msg)		  send是发送字符串
上午的错误
var p = document.createElement('p');

写成 document.getElementById('p');

发送两下,接收到一下的错误

除了receive()接收外,我还print(msg,type(msg),type(json.loads(user_socket.receive()))) 也得接收

错误:全局变量 而不是局部变量

根本原因:是对代码逻辑不懂,上课没认真听

全局变量写成了局部变量,因为又var 了,在局部函数里。

Uncaught TypeError: Cannot read property 'send' of null

正确的send和不显示的send?

正确的send错误的

错误原因

    ws.onmessage = function (eventMessage) {
    console.log(eventMessage.data);
    var p = document.createElement('p');
    p.innerText = eventMessage.data;
    document.getElementById('chat_list').appendChild(p);
    };

正确写法

    ws.onmessage = function (eventMessage) {
    console.log(eventMessage.data);
    str_obj = JSON.parse(eventMessage.data);
    var p = document.createElement('p');
     p.innerText = str_obj.from_user +" : "+str_obj.chat;
    document.getElementById('chat_list').appendChild(p);
    };
 

function loginGc() {
    var username = document.getElementById('username').value;
    var ws = new WebSocket('ws://192.168.16.90:9534/my_socket/'+username);
    ws.onmessage = function (eventMessage) {
    console.log(eventMessage.data);
    str_obj = JSON.parse(eventMessage.data);
    var p = document.createElement('p');
    p.innerText = str_obj.from_user + ' + ' +str_obj.chat;
    document.getElementById('chat_list').appendChild(p);
    };

}
 
 

对比区别:

错误

send 就有了 颜色了 全局变量 ,

var ws = new WebSocket('ws://192.168.16.90:9534/my_socket/'+username); 这样写的话,在函数里面是 局部变量,所以,另一个函数里没法用

结果:

结果

检查代码工具

https://blog.csdn.net/xiemanR/article/details/73378962

http://www.matools.com/embed/compare

peiqishuo

爬虫 数据分析 路飞学城 cmdb 所有的视频都找大哥要 最后要讲go(5天,学过,就是加分项) elasitc(和运维沾点边)(后面讲) 还有测试,(时间少,也要来) (测试开发:都是人肉测试,所以会开发的竞争力很强,会个函数就挺好的(退而求其次,有后端的工程师,然后可以转))

细节根据 一步一步推出来

crm 这种系统独立自主完成, 达到就业标准了。

缺练,自己设计表结构,自己加权限,自己能够处理下来

看着这个网站,能把这个东西做出来 cms(大哥做了,一步一步,) 周末每次一课 路飞

简易版的博客 基于md的 ckedit (不会) 引入js 就可以了 (相当于今日头条,有人发布,有人看)

做了之后,可以自己搭博客

模块化, 组件都有了, (自己能写的能用的) 之后搭起组件来,成了一个系统。 自己写的话,很长时间,而且容易出错

rbac 单拿出来,另写一个名,写个文档,打包成一个包,上传到github上, 然后别人用了,之后就可以在简历上写下,开源系统

代码能用到别的地方上,自己的设计的。 开源。不合适的地方再改。 很多博客园的人,开源项目,被别人下载,被别人fork,

村长(这个人对技术比较痴迷,)周末 可能会将 vue django-resform 简单 的 可能会做文件调查的 , 还有路飞学城 dif vue 都用django 可以串联起来 前后端分离

到公司里,用rbac 的很好了,很多都是用if else 。 为什么权限的做的很好,思想是什么?

项目 : 你做过什么项目 (peiqi 根据django-admin 改了一个,比admin好用多了,然后 4期到9期(但是很多人没写,不多))

django 缓存 信号 读写分离还没讲 staic组件

录音机录太麻烦了

所以, 用web 录音 js 录音 在https 火狐暂时录音

支持原生js , (jquery的都不能用了)

<script type='application/javascript'>

document的作用域

说什么 回什么可以实现了

但是 让他唱首歌,问爱因斯坦是谁都不能实现

uuid4 是什么 缓存那里讲的 每次都是不同的

回答的问题都能回答下来,但是说的话覆盖了,也用uuid,不覆盖

简单的问答: 缺少 回答

my_nlp 缺少 图灵机器人

错误:

{'error_code': 6, 'error_msg': 'No permission to access data'} (错误代码没弄下来) 原因没开启NLP 掉的接口中 ,默认是语音合成和 语音是被

错误:

只显示一个应用了 是在一个特定的应用列表里

FAQ(语音识别)错误

FileNotFoundError: [Errno 2] No such file or directory: 'audio.pcm'

文件类型不对(去通过FFmpeg转换 cmd ffmpeg os.system执行命令)

os 里面的 system命令使用来执行cmd命令的

安装: 把tools 里的 ffmpeg 的bin 目录地址写到环境变量里

环境变量和pycharm加载:

当第一次打开pycharm时,就已经加载了环境变量里的所有,修改了,不会去检测重复加载(浪费),所以,要重启 : 重启需要都吧所有pycharm的进程都关了,不能只关闭这个项目,(重新加载)

ffmpeg
'ffmpeg' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

。。。 : 实在不行,操作正确,但是不起作用之时,我选择了重启电脑

ASR语音识别程序

from aip import AipSpeech
import os
""" 你的 APPID AK SK """
APP_ID = '16815965'
API_KEY = 'uGdZBUTL05BvFPQ4wd4IsRWl'
SECRET_KEY = 'qHbEWHlivTKtn7lQrT1bcMWZfsuvlNeE'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

# 转视频格式并且 读取文件
def get_file_content(filePath):
    cmd_str = f'ffmpeg -y  -i {filePath}  -acodec pcm_s16le -f s16le -ac 1 -ar 16000 {filePath}.pcm'
    os.system(cmd_str)
    with open(f'{filePath}.pcm', 'rb') as fp:
        return fp.read()

# 识别本地文件
res = client.asr(get_file_content('1.wma'), 'pcm', 16000, {
    'dev_pid': 1536,
})
print(res)				



{'corpus_no': '6714250808127389373', 'err_msg': 'success.', 'err_no': 0, 'result': ['你叫什么名字'], 'sn': '637873824161563283337'}

faq 语音转文字 问答

from aip import AipSpeech
import os
""" 你的 APPID AK SK """
APP_ID = '16815965'
API_KEY = 'uGdZBUTL05BvFPQ4wd4IsRWl'
SECRET_KEY = 'qHbEWHlivTKtn7lQrT1bcMWZfsuvlNeE'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

#  转一下pcm文件 并 读取文件   
def get_file_content(filePath):
    cmd_str = f'ffmpeg -y  -i {filePath}  -acodec pcm_s16le -f s16le -ac 1 -ar 16000 {filePath}.pcm'
    os.system(cmd_str)
    with open(f'{filePath}.pcm', 'rb') as fp:
        return fp.read()

# # 识别本地文件     函数里有视频转pcm
res = client.asr(get_file_content('auido.wav'), 'pcm', 16000, {
    'dev_pid': 1536,
})

Q = res.get('result')[0]					#得到内容
print('Q:--------->文件内容:',Q)

 
A = '我不知道你在say what'	  			 #如果说话,那么回答
if Q =='你的名字叫什么':
    A = 'big baby'

result  = client.synthesis(A, 'zh', 1, {
    'vol': 5, 'per':4, 'spd':5, 'pit':4
})

# 识别正确返回语音二进制 错误则返回dict 参照下面错误码	(写入回答)
if not isinstance(result, dict):
    with open('Answer.mp3', 'wb') as f:
        f.write(result)

或者判断条件 改成 nlp的 (如果他支持NLP)

Q = res.get('result')[0]
print('Q:--------->文件内容:',Q)	

A = '我不知道你在say what'
res = client1.simnet("你的名字是什么", Q)
print(res.get('score'))

if res.get('score') > 0.58:			
    A = 'big baby'

调用图灵返回

from goto_tuling import go_tl
else:
    A = go_tl(Q)
图灵机器人程序
import requests
def go_tl(Q):
    data = {
        "perception": {
            "inputText": {
                "text": Q
            }
        },
        "userInfo": {
            "apiKey": "f9a56b016eb344ecbfacdac05fcb74f0",
            "userId": "123"
        }
    }
    res = requests.post('http://openapi.tuling123.com/openapi/api/v2',json=data)	#调用接口
    res_dict = res.json()   	# 换成json模式
    return res_dict.get("results")[0].get("values").get("text")  # 返回信息

机器说的话,也可以识别的啊:

Q:--------->文件内容: 面朝大海春暖花开作者海子铜陵天气说一个幸福的人喂马劈柴周游世界从明天起关心粮食和蔬菜我有一所房子面朝大海春暖花开崇明天气和每一个亲人通信告诉他们我的幸福那幸福的闪电告诉我的我将告诉每一个人给每一条河每一座山取一个温暖的名字陌生人我也为你祝福你有一个灿烂的前程愿你有情人终成眷属愿你在尘世获得幸福我只愿面朝大海春暖花开			

TTS语音合成程序

from aip import AipSpeech

""" 你的 APPID AK SK """
APP_ID = '16815965'
API_KEY = 'uGdZBUTL05BvFPQ4wd4IsRWl'
SECRET_KEY = 'qHbEWHlivTKtn7lQrT1bcMWZfsuvlNeE'

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
result  = client.synthesis('你的名字叫什么', 'zh', 1, {
    'vol': 5, 'per':3, 'spd':5, 'pit':5
})


# 识别正确返回语音二进制 错误则返回dict 参照下面错误码
if not isinstance(result, dict):
    with open('mn.pcm', 'wb') as f:
        f.write(result)

3 相似度
from aip import AipNlp

APP_ID = '16815965'
API_KEY = 'uGdZBUTL05BvFPQ4wd4IsRWl'
SECRET_KEY = 'qHbEWHlivTKtn7lQrT1bcMWZfsuvlNeE'
client = AipNlp(APP_ID, API_KEY, SECRET_KEY)

text1 = "你叫什么名字"
text2 = "你的名字叫什么"
""" 调用短文本相似度 """
res = client.simnet("名字2", "名字1")

print(res)
操作不舒服,却一直不改变的

浏览器一直是google搜索,每次都得另起页面。通过老师视频,然后恍然,setting设置成百度。

点击播放音频的代码 html

之前段啊

</head>
<body>
<audio controls autoplay id="music">
    <button onclick="get_music()">点我</button>
</audio>

</body>

<script type='application/javascript'>
function get_music() {
    // 给audio标签的src属性赋值
     var my_audio = document.getElementById('music');
    my_audio.src = 'https://fdfs.xmcdn.com/group13/M03/1F/6B/wKgDXVV6TO-ivqNQAAwaBkl9SK4828.m4a'
}

</script>
</html>

js控制代码太复杂

代码webtoy.html

 
<p>
    <button onclick="start_reco()">开始录音</button>
</p>
<p>
    <button onclick="ai_reco()" style="background-color: cornflowerblue">发送语音指令</button>
</p>
</body>
<script type="application/javascript" src="/static/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="/static/Recorder.js"></script>
<script type="application/javascript">
    var reco = null;
    var serv = "http://192.168.16.90:9527";
    var audio_context = new AudioContext();//音频内容对象
    navigator.getUserMedia = (navigator.getUserMedia ||
        navigator.webkitGetUserMedia ||
        navigator.mozGetUserMedia ||
        navigator.msGetUserMedia);

    navigator.getUserMedia({audio: true}, create_stream, function (err) {
        console.log(err)
    });

    function create_stream(user_media) {
        var stream_input = audio_context.createMediaStreamSource(user_media);
        reco = new Recorder(stream_input);
    }


    function start_reco() {
        reco.record();
    }

    function ai_reco() {
        reco.stop();

        reco.exportWAV(function (wav_file) {
            console.log(wav_file);
            var formdata = new FormData(); // form 表单 {key:value}
            formdata.append("reco", wav_file); // form input type="file"
            $.ajax({
                url: serv + "/ai_uploader",
                type: 'post',
                processData: false,
                contentType: false,
                data: formdata,
                dataType: 'json',
                success: function (data) {
                    console.log(data);
                    document.getElementById("player").src = serv + "/get_chat/" + data.filename;
                }
            })
        });

        reco.clear();
    }

</script>
</html>

报错信息:HTML 文档的字符编码未声明。如果该文件包含 US-ASCII 范围之外的字符,该文件将在某些浏览器配置中呈现为乱码。页面的字符编码必须在文档或传输协议层声明。

app.py

from flask import Flask, render_template, request, send_file
from my_ai import audio2text, my_nlp, text2audio

app = Flask(__name__)
app.debug=True

@app.route("/ai")
def ai():
    return render_template("webToy.html")
from uuid import uuid4

@app.route("/ai_uploader",methods=["gET","Post"])
def ai_uploader():
    my_reco_file = request.files.get("reco")

    reco_file_name = f"{uuid4()}.wav"

    my_reco_file.save(reco_file_name)
    Q = audio2text(reco_file_name)
    A = my_nlp(Q)
    filename = text2audio(A)

    return {"filename":filename}

@app.route("/get_chat/<filename>")
def get_chat(filename):
    return send_file(filename)


if __name__ == '__main__':
    app.run("0.0.0.0",9527)


转化的 my_ai.py

from my_ai_config import NLP_CLIENT,SPEECH_CLIENT,VIOCE
from utils import get_file_content

def audio2text(file_path):
    file_context = get_file_content(file_path)
    res = SPEECH_CLIENT.asr(file_context,"pcm",16000,{"dev_pid":1536})
    return res.get("result")[0]
def my_nlp(Q):
    A="我还是个宝宝,我不知道你在说什么,疑车无据!"
    # 我们的逻辑处理
    return A
from uuid import uuid4

def text2audio(A):
    res = SPEECH_CLIENT.synthesis(A,"zh",1,VIOCE)
    file_name = f"{uuid4()}.mp3"
    if type(res) == dict:
        pass
    with open(file_name,"wb") as f:
        f.write(res)
    return file_name

配置的my_ai_config.py

from aip import AipSpeech, AipNlp

""" 你的 APPID AK SK """
APP_ID = '16815061'
API_KEY = 'G9k256n6aeMRnfvS1paws50x'
SECRET_KEY = 'nCbbF44iUp6QrNvSgcYW0eo2EKKl4cvR'

SPEECH_CLIENT = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
NLP_CLIENT = AipNlp(APP_ID, API_KEY, SECRET_KEY)

VIOCE={
    'vol': 5,
    "spd": 4,
    "pit": 5,
    "per": 4
}

转化pcm的 utils.py

import os

# 转换PCM并且读取文件内容并返回
def get_file_content(filePath):
    cmd_str = f"ffmpeg -y -i {filePath} -acodec pcm_s16le -f s16le -ac 1 -ar 16000 {filePath}.pcm"

    os.system(cmd_str)
    with open(f"{filePath}.pcm", 'rb') as fp:
        return fp.read()
主逻辑。py
@app.route("/ai_uploader",methods=["gET","Post"])
def ai_uploader():
    my_reco_file = request.files.get("reco")

    reco_file_name = f"{uuid4()}.wav"

    my_reco_file.save(reco_file_name)
    Q = audio2text(reco_file_name)
    A = my_nlp(Q)
    filename = text2audio(A)

    return {"filename":filename}

@app.route("/get_chat/<filename>")
def get_chat(filename):
    return send_file(filename)


主逻辑。html
 navigator.getUserMedia({audio: true}, create_stream, function (err) {
        console.log(err)
    });

    function create_stream(user_media) {
        var stream_input = audio_context.createMediaStreamSource(user_media);
        reco = new Recorder(stream_input);
    }


    function start_reco() {
        reco.record();
    }

    function ai_reco() {
        reco.stop();

        reco.exportWAV(function (wav_file) {
            console.log(wav_file);
            var formdata = new FormData(); // form 表单 {key:value}
            formdata.append("reco", wav_file); // form input type="file"
            $.ajax({
                url: serv + "/ai_uploader",
                type: 'post',
                processData: false,
                contentType: false,
                data: formdata,
                dataType: 'json',
                success: function (data) {
                    console.log(data);
                    document.getElementById("player").src = serv + "/get_chat/" + data.filename;
                }
            })
        });
posted @ 2019-07-16 22:18  learnacode  阅读(661)  评论(0编辑  收藏  举报