1.簡陋版web智能玩具html
FAQ.py文件python
import os from aip import AipSpeech, AipNlp from uuid import uuid4 """ 你的 APPID AK SK """ APP_ID = '16027160' API_KEY = 'uzx4SWZuimPqbE4LvxYScEhi' SECRET_KEY = '3HBy8yi11ID9T4yyxkADuGYOGyavxPdG' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) client_nlp = AipNlp(APP_ID, API_KEY, SECRET_KEY) # 語音識別,將你輸入的文字轉化爲語音 def AI_voice(file): filename=f'{uuid4()}.mp3' result = client.synthesis(file, 'zh', 1, { 'spd': 5, 'vol': 5, 'pit': 5, 'per': 2 }) if not isinstance(result, dict): with open(filename, 'wb') as f: f.write(result) return filename # 語音合成,經過語音生成文字,在這裏只是讀出文字,並無寫出來,下面這一步纔是將語音中的文字return出來 def get_file_content(file): os.system(f"ffmpeg -y -i {file} -acodec pcm_s16le -f s16le -ac 1 -ar 16000 {file}.pcm") with open(f'{file}.pcm', 'rb') as fp: return fp.read() # 返回的是你語音中的消息 def voice_content(file): result = client.asr(get_file_content(file), 'pcm', 16000, { 'dev_pid': 1536, }) # print(result.get('result')[0]) return result.get('result')[0] def goto_tl(text, uid): URL = "http://openapi.tuling123.com/openapi/api/v2" import requests data = { "perception": { "inputText": { "text": "你叫什麼名字" } }, "userInfo": { "apiKey": "be41cf8596a24aec95b0e86be895cfa9", "userId": "123" } } data["perception"]["inputText"]["text"] = text data["userInfo"]["userId"] = uid res = requests.post(URL, json=data) return res.json().get("results")[0].get("values").get("text")
WebToy.html文件內容以下:mysql
import os from aip import AipSpeech, AipNlp from uuid import uuid4 """ 你的 APPID AK SK """
#圖靈機器人 APP_ID = '16027160' API_KEY = 'uzx4SWZuimPqbE4LvxYScEhi' SECRET_KEY = '3HBy8yi11ID9T4yyxkADuGYOGyavxPdG' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) client_nlp = AipNlp(APP_ID, API_KEY, SECRET_KEY) # 語音識別,將你輸入的文字轉化爲語音 def AI_voice(file): filename=f'{uuid4()}.mp3' result = client.synthesis(file, 'zh', 1, { 'spd': 5, 'vol': 5, 'pit': 5, 'per': 2 }) if not isinstance(result, dict): with open(filename, 'wb') as f: f.write(result) return filename # 語音合成,經過語音生成文字,在這裏只是讀出文字,並無寫出來,下面這一步纔是將語音中的文字return出來 def get_file_content(file): os.system(f"ffmpeg -y -i {file} -acodec pcm_s16le -f s16le -ac 1 -ar 16000 {file}.pcm") with open(f'{file}.pcm', 'rb') as fp: return fp.read() # 返回的是你語音中的消息 def voice_content(file): result = client.asr(get_file_content(file), 'pcm', 16000, { 'dev_pid': 1536, }) return result.get('result')[0] def goto_tl(text, uid): URL = "http://openapi.tuling123.com/openapi/api/v2" import requests data = { "perception": { "inputText": { "text": "你叫什麼名字" } }, "userInfo": { "apiKey": "be41cf8596a24aec95b0e86be895cfa9", "userId": "123" } } data["perception"]["inputText"]["text"] = text data["userInfo"]["userId"] = uid res = requests.post(URL, json=data) return res.json().get("results")[0].get("values").get("text")
webtoy.py文件內容以下:web
from flask import Flask, render_template, request, jsonify, send_file from uuid import uuid4 # 這個是導入的一串數字,惟一的 from flask_cors import CORS from day07.FAQ import AI_voice, goto_tl, voice_content, client_nlp app = Flask(__name__) #跨域請求 CORS(app) @app.route('/') def WebToy(): return render_template('WebToy.html') @app.route("/uploader",methods=["POST","GET"]) def uploader(): filename = f"{uuid4()}.wav" file = request.files.get("reco") file.save(filename) text = voice_content(filename) # 天然語言處理 LowB score = client_nlp.simnet("你叫什麼名字", text).get("score") print(score) if score >= 0.75: filename = AI_voice("個人名字叫嘻嘻") else: answer = goto_tl(text, "qiaoxiaoqiang") filename = AI_voice(answer) return jsonify({"code":0,"msg":"文件上傳成功","filename":filename}) @app.route('/getaudio/<filename>') def getaudio(filename): return send_file(filename) if __name__ == '__main__': app.run('0.0.0.0', 5000, debug=True)
2.MongoDB初識正則表達式
在啓動mongoDB前,先配置環境變量 ,安裝後找到bin目錄(包含mongod.exe和mongo.exe)redis
MongoDB的默認服務端口爲27017 ,redis的默認端口爲6379,mysql的默認端口爲3306sql
1.啓動MongoDB服務 mongodb
mongod -dbpath D:\data\db mongod -dbpath 數據庫的存放路徑 -install 安裝Windows服務 -remove 卸載Windows服務
2.客戶端的鏈接數據庫
推薦使用mongodb自帶的客戶端 -mongo
show databases 查看本地磁盤數據庫
use dbname 切換到當前使用的數據庫
db 查看當前使用的數據庫
show tables 查看當前數據庫存放在磁盤上的數據表
use 不存在的數據庫 - 建立了數據庫 ,當前建立的數據庫沒有存放在磁盤中json
數據庫中沒有users數據庫,若是使用了 use users命令,他會在內存中建立一個users的數據庫
db.tablename 不存在的表名 - 建立數據表 當前數據表沒有存放在磁盤中
經過前面建立的數據庫,use 不存在的表名,若是你在後面再表中添加了數據,那麼這個表和內容都存放到了磁盤中
概念: - 使用了不存在的對象即建立了該對象 - 不限制數據結構
使用第三方客戶端 : --圖形化工具 -NoSQLBooster4MongoDB for windows for mac
3.MongoDB的增刪改查
添加數據:
db.tablename.insert({'key':'value'}) 官方推薦的寫法: #在圖形化客戶端和數據庫中是這個寫法 db.table.insertOne({'key':'value'}) db.table.insertMany({k1:v1},{k2:v2},,{k3:v3}) #在pycharm中的寫法爲 db.tablename.insert_one({}) db.tablename.insert_many({},{},{})
刪除數據:
db.tablename.remove({k:v}) db.tablename.remove({age:34}) #刪除全部age=34的數據 官方推薦的寫法: #數據庫和圖形化操做寫法 db.tablename.deleteOne() #刪除符合條件的第一條數據 db.tablename.deleteMany() # 刪除符合條件的全部數據 #在pycharm中的寫法爲 db.tablename.delete_one({}) db.tablename.delete_many({},{},{})
更新數據:
#查詢出name爲xx的數據,將符合條件的一條數據進行修改 db.tablename.update({name:'xx'},{$set:{age:23}}) $set -set修改器 強制替換覆蓋 官方推薦寫法 #數據庫和圖形化操做的寫法 #更新符合條件的第一條數據,第一條數據就是你第一個插入的數據 db.tablename.updateOne({k1:v1},{$set:{k2:v2}}) #更新符合條件的全部數據 db.tablename.updateMany({k1:v1},{$set:{k2:v2}}) pycharm寫法 db.tablename.update_one({},{}) db.tablename.update_many({},{}) array(數組,列表) + object(字典) :db.tablename.updateOne({cp.name:'裝X'},{$set:{cp.$.score:'100'}}) #此處cp.$.score,$的意思爲前面查詢出的索引
查詢操做:
db.filename.find() #查詢全部數據 db.user.find({name:xixi}) #查詢出name爲xixi的數據 #查詢符合條件的一條數據 db.tablename.findOne({k:v})
4.MongoDB的數據類型
ObjectId :Documents 自動生成的 _id _id:ObjectId("5cb69a23815ea7295f8bad43") 自動生成的 json數據中不包含ObjectId類型 id類型uuid String: 字符串,必須是utf-8 Boolean:布爾值,true 或者false (這裏有坑哦~在咱們大Python中 True False 首字母大寫) Integer:整數 (Int32 Int64 大家就知道有個Int就好了,通常咱們用Int32) Double:浮點數 (沒有float類型,全部小數都是Double) Arrays:數組或者列表,多個值存儲到一個鍵 (list哦,大Python中的List哦) Object:深度<=4 若是你學過Python的話,那麼這個概念特別好理解,就是Python中的字典,這個數據類型就是字典 Null:空數據類型 , 一個特殊的概念,None Null Timestamp:時間戳 一般不用這個數據類型 若是存儲時間 Double Date:存儲當前日期或時間unix時間格式 (咱們通常不用這個Date類型,時間戳能夠秒殺一切時間類型)
5.數學比較符
$lt : 小於 √ $lte: 小於等於 √ $gt : 大於 √ $gte: 大於等於 √ $ne : 不等於 $eq or 冒號 : 等於
6.查詢關鍵字
array數據類型會自動遍歷 $in 或者等於相同字段 db.filename.fiind({age:{$in:[19,109]}}) #就是age=19或age=109的數據 $or 或者等於不一樣字段 db.filename.find({$or:[{age:19},{age:109}] }) #也是age=19或age=109的數據,與$in不一樣之處在於 ,$in寫的必須是相同的字段,而$or能夠寫不一樣的字段 $and or 逗號 -- 並列條件 $all --Array 數據類型 子集查詢 db.filename.find({hobby:{$all : [ '玉鳳','玉霞' ]}})
7.$字符特殊用法:
存儲符合條件的元素的下標索引
用於修改字段
8.修改器
$set -- set修改器 強制替換覆蓋 $unset -- 強制刪除字段 $inc -- 引用增長 #就至關於我查詢出的數據進行增長,沒有減,若是想實現減的操做,加負的便可 array操做: $push 至關於append 在array中追加 $pushAll 至關於extend 在array中追加列表中的全部元素 $pull 至關於remove 在array中刪除一個元素 $pullAll 在array中刪除一堆元素 $pop 至關於pop 刪除第一個 -1 或 最後一個 1 的值
9. sort(排序) skip(跳過) limit(選取條目)
sort 排序
#找到name爲xixi的數據,根據age排序 db.filename.find({name:xixi}).sort({age:18}) #找到name爲xixi的數據,根據age排序,若是age有相同的,再根據birthday倒序排序 db.filename.find({name:xixi}).sort({age:18,birthday:-1})
skip 跳過
#找到name爲xixi的數據,而後根據插入順序跳過第一條 db.filename.find(name:xixi).skip(1)
limit 選取條目
#找到name爲xixi的數據,根據插入順序選取出3條數據展現 db.filename.find({name:xixi}).limit(3)
sort,limit,skip是有執行順序的
先排序(sort),在跳過(skip),最後顯示條目(limit)
分頁
(page-1)*num db.filename.find({name:xixi}).skip((page-1)*num).limit(num)
10.pymongo
*************************
11.MongoDB偷換的概念
MySql MongoDB DataBase DataBase Table Collection Colunm Field Row Dcouments
mongodb優化
(1) 文檔中的_id鍵推薦使用默認值,禁止向_id中保存自定義的值。 解讀: MongoDB文檔中都會有一個「_id」鍵,默認是個ObjectID對象(標識符中包含時間戳、機器ID、進程ID和計數器)。MongoDB在指定_id與不指定_id插入時 速度相差很大,指定_id會減慢插入的速率。 (2) 推薦使用短字段名。 解讀:與關係型數據庫不一樣,MongoDB集合中的每個文檔都須要存儲字段名,長字段名會須要更多的存儲空間。 (3) MongoDB索引能夠提升文檔的查詢、更新、刪除、排序操做,因此結合業務需求,適當建立索引。 (4) 每一個索引都會佔用一些空間,而且致使插入操做的資源消耗,所以,建議每一個集合的索引數儘可能控制在5個之內。 (5) 對於包含多個鍵的查詢,建立包含這些鍵的複合索引是個不錯的解決方案。複合索引的鍵值順序很重要,理解索引最左前綴原則。 解讀:例如在test集合上建立組合索引{a:1,b:1,c:1}。執行如下7個查詢語句: db.test.find({a:」hello」}) // 1 db.test.find({b:」sogo」, a:」hello」}) // 2 db.test.find({a:」hello」,b:」sogo」, c:」666」}) // 3 db.test.find({c:」666」, a:」hello」}) // 4 db.test.find({b:」sogo」, c:」666」}) // 5 db.test.find({b:」sogo」 }) // 6 db.test.find({c:」666」}) // 7 以上查詢語句可能走索引的是一、二、三、4 查詢應包含最左索引字段,以索引建立順序爲準,與查詢字段順序無關。 最少索引覆蓋最多查詢。 (6) TTL 索引(time-to-live index,具備生命週期的索引),使用TTL索引能夠將超時時間的文檔老化,一個文檔到達老化的程度以後就會被刪除。 解讀:建立TTL的索引必須是日期類型。TTL索引是一種單字段索引,不能是複合索引。TTL刪除文檔後臺線程每60s移除失效文檔。不支持定長集合。 (7) 須要在集合中某字段建立索引,但集合中大量的文檔不包含此鍵值時,建議建立稀疏索引。 解讀:索引默認是密集型的,這意味着,即便文檔的索引字段缺失,在索引中也存在着一個對應關係。在稀疏索引中,只有包含了索引鍵值的文檔纔會出現。 (8) 建立文本索引時字段指定text,而不是1或者-1。每一個集合只有一個文本索引,可是它能夠爲任意多個字段創建索引。 解讀:文本搜索速度快不少,推薦使用文本索引替代對集合文檔的多字段的低效查詢。 (9) 使用findOne在數據庫中查詢匹配多個項目,它就會在天然排序文件集合中返回第一個項目。若是須要返回多個文檔,則使用find方法。 (10) 若是查詢無需返回整個文檔或只是用來判斷鍵值是否存在,能夠經過投影(映射)來限制返回字段,減小網絡流量和客戶端的內存使用。 解讀:既能夠經過設置{key:1}來顯式指定返回的字段,也能夠設置{key:0}指定須要排除的字段。 (11) 除了前綴樣式查詢,正則表達式查詢不能使用索引,執行的時間比大多數選擇器更長,應節制性地使用它們。 (12) 在聚合運算中,$要在match要在$group前面,經過$前置,能夠減小match前置,能夠減小$ group 操做符要處理的文檔數量。 (13) 經過操做符對文檔進行修改,一般能夠得到更好的性能,由於,不須要往返服務器來獲取並修改文檔數據,能夠在序列化和傳輸數據上花費更少的時間。 (14) 批量插入(batchInsert)能夠減小數據向服務器的提交次數,提升性能。可是批量提交的BSON Size不超過48MB。 (15) 禁止一次取出太多的數據進行排序,MongoDB目前支持對32M之內的結果集進行排序。若是須要排序,請儘可能限制結果集中的數據量。 (16) 查詢中的某些$操做符可能會致使性能低下,如操做符可能會致使性能低下,如$ne,$,not,$exists,$nin,$or儘可能在業務中不要使用。 a) $exist:由於鬆散的文檔結構致使查詢必須遍歷每個文檔; b) $ne:若是當取反的值爲大多數,則會掃描整個索引; c) $not:可能會致使查詢優化器不知道應當使用哪一個索引,因此會常常退化爲全表掃描; d) $nin:全表掃描; e) \$有多個條件就會查詢多少次,最後合併結果集,應該考慮裝換爲or:有多個條件就會查詢多少次,最後合併結果集,應該考慮裝換爲$in。 (17) 固定集合能夠用於記錄日誌,其插入數據更快,能夠實如今插入數據時,淘汰最先的數據。需求分析和設計時,可考慮此特性,即提升了性能,有省去了刪除動做。 解讀:固定集合須要顯式建立,指定Size的大小,還可以指定文檔的數量。集合無論先達到哪個限制,以後插入的新文檔都會把最老的文檔移出。 (18) 集合中文檔的數據量會影響查詢性能,爲保持適量,須要按期歸檔。