flask5+baidu+tuling + 語音合成識別nlp httpx js處理錄音

flask+day92+人工智能初識

替代

耳朵 = 麥克風 = 語音識別 ASRjavascript

嘴巴 = 揚聲器 = 語音合成 TTS Text To Speechhtml

眼睛 = 攝像頭 = 圖像識別 IR前端

思考 = 邏輯處理 = 天然語言處理 NLP Natural Language Processingvue

if else ....   用天然語言處理,用模型計算類似度

AI作什麼?

大數據和人工智能之間的小關係 (不要緊)java

可是,機器學習須要樣本數據,從大數據中來jquery

小豬佩奇(img)第一眼是小豬的採集率達到90%git

爬蟲 == 數據採集github

文字識別 扣除文字, 而後通用翻譯 作出一個字典來(兩個接口)web

錯誤的把(抄的東西錯了,能不能認真一點)ajax

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;
                }
            })
        });
相關文章
相關標籤/搜索