1. 程式人生 > >智能聊天騷操作

智能聊天騷操作

code var button 返回結果 打印 實現 kit all 語音識別

準備階段:

1.FFmpeg:  #J將音頻格式轉化為pcm格式

鏈接:https://pan.baidu.com/s/1jonSAa_TG2XuaJEy3iTmHg

密碼:w6hk

2.baidu-aip:


pip install baidu-aip

3.圖靈機器人

http://www.tuling123.com/

終於進入主題了,此篇是人工智能應用的重點,只用現成的技術不做底層算法,也是讓初級程序員快速進入人工智能行業的捷徑

目前市面上主流的AI技術提供公司有很多,比如百度,阿裏,騰訊,主做語音的科大訊飛,做只能問答的圖靈機器人等等

這些公司投入了很大一部分財力物力人力將底層封裝,提供應用接口給我們,尤其是百度,完全免費的接口

既然百度這麽仗義,咱們就不要浪費掉怎麽好的資源,從百度AI入手,開啟人工智能之旅

開啟人工智能技術的大門 : http://ai.baidu.com/

技術分享圖片

看看我大百度的AI大法,這些技術全部都是封裝好的接口,看著就爽

接下來咱們就一步一步的操作一下

首先進入控制臺,註冊一個百度的賬號(百度賬號通用)

技術分享圖片

開通一下我們百度AI開放平臺的授權

然後找到已開通服務中的百度語音

技術分享圖片

走到這裏,想必已經知道咱們要從語音入手了,語音識別和語音合成

打開百度語音,進入語音應用管理界面,創建一個新的應用 技術分享圖片

創建語音應用App

技術分享圖片

就可以創建應用了,回到應用列表我們可以看到已創建的應用了

技術分享圖片

這裏面有三個值 AppID , API Key , Secret Key 記住可以從這裏面看到 , 在之後的學習中我們會用到

好了 百度語音的應用已經創建完成了 接下來 我會用Python 代碼作為實例進行應用及講解

一.安裝百度的人工智能SDK:

首先咱們要 pip install baidu-aip 安裝一個百度人工智能開放平臺的Python SDK實在是太方便了,這也是為什麽我們選擇百度人工智能的最大原因

安裝完成之後就來測試一下:

技術分享圖片

在工程目錄下,就可以看到 s1.mp3 這個文件了,來聽一聽

技術分享圖片

上面咱們測試了一個語音合成的例子,那麽就從語音合成開始入手

2.語音合成:

技術上,代碼上任何的疑惑,都可以從官方文檔中得到答案

baidu-aip Python SDK 語音合成技術文檔 : https://ai.baidu.com/docs#/TTS-Online-Python-SDK/top

剛才我們做了一個語音合成的例子,就用這個例子來展開說明

先來看第一段代碼

技術分享圖片

這是與百度進行一次加密校驗 , 認證你是合法用戶 合法的應用

AipSpeech 是百度語音的客戶端 認證成功之後,客戶端將被開啟,這裏的client 就是已經開啟的百度語音的客戶端了

再來看第二段代碼:

技術分享圖片

技術分享圖片

用百度語音客戶端中的synthesis方法,並提供相關參數

成功可以得到音頻文件,失敗則返回一段錯誤信息

重點看一下 synthesis 這個方法 , 從 https://ai.baidu.com/docs#/TTS-Online-Python-SDK/top 來獲得答案吧

從參數入手分析:

技術分享圖片

按照這些參數,從新發起一個語音合成

技術分享圖片

這次聲音是不是與一點點蘿莉了呢?

這都是語音語調的作用 0 - 9 其實就是 禦姐音 - 蘿莉音

這就是人工智能中的語音合成技術,調用百度的SDK,只用了5分鐘,完成了1年的開發量,哈哈哈哈

3.語音識別:

哎,每次到這裏,我都默默無語淚兩行,聲音這個東西格式太多樣化了,如果要想讓百度的SDK識別咱們的音頻文件,就要想辦法轉變成百度SDK可以識別的格式PCM

目前DragonFire已知可以實現自動化轉換格式並且屢試不爽的工具 : FFmpeg 這個工具的下載地址是 : 鏈接:https://pan.baidu.com/s/1jonSAa_TG2XuaJEy3iTmHg 密碼:w6hk

FFmpeg 環境變量配置:

首先你要解壓縮,然後找到bin目錄,我的目錄是 C:\ffmpeg\bin

技術分享圖片

然後 以 windows 10 為例,配置環境變量

技術分享圖片

技術分享圖片

如果沒搞明白的話,我也沒有辦法了,這麽清晰這麽明白

嘗試一下,是否配置成功

技術分享圖片

看到這個界面就算配置成功了,配置成功有什麽用呢, 這個工具可以將wav wma mp3 等音頻文件轉換為 pcm 無壓縮音頻文件

做一個測試,首先要打開windows的錄音機,錄制一段音頻(說普通話)

現在假設錄制的音頻文件的名字為 audio.wav 放置在 D:\DragonFireAudio\

然後我們用命令行對這個 audio.wav 進行pcm格式的轉換然後得到 audio.pcm

命令是 : ffmpeg -y -i audio.wav -acodec pcm_s16le -f s16le -ac 1 -ar 16000 audio.pcm

技術分享圖片

然後打開目錄就可以看到pcm文件了

技術分享圖片

pcm文件已經得到了,趕緊進入正題吧

百度語音識別SDK的應用:

技術分享圖片

前提是你的audio.pcm 要與你當前的文件在同一個目錄,還是分段看一下代碼

技術分享圖片

讀取文件的內容,file_context 是 audio.pcm 文件打開的二進制流

技術分享圖片

asr函數需要四個參數,第四個參數可以忽略,自有默認值,參照一下這些參數是做什麽的

第一個參數: speech 音頻文件流 建立包含語音內容的Buffer對象, 語音文件的格式,pcm 或者 wav 或者 amr。(雖說支持這麽多格式,但是只有pcm的支持是最好的)

第二個參數: format 文件的格式,包括pcm(不壓縮)、wav、amr (雖說支持這麽多格式,但是只有pcm的支持是最好的)

第三個參數: rate 音頻文件采樣率 如果使用剛剛的FFmpeg的命令轉換的,你的pcm文件就是16000

第四個參數: dev_pid 音頻文件語言id 默認1537(普通話 輸入法模型)

技術分享圖片

再來看下一段代碼,打印返回結果:

技術分享圖片

成功的dict中 result 就是我們要的識別文本

失敗的dict中 err_no 就是我們要的錯誤編碼,錯誤編碼代表什麽呢?

技術分享圖片

如果err_no不是0的話,就參照一下錯誤碼表

4.圖靈機器人

  1.註冊完成之後,創建圖靈機器人

技術分享圖片

  2.創建機器人

技術分享圖片

  3.根據個人的愛好,配置機器人

技術分享圖片

  4.看文檔,開始操作啦

技術分享圖片 技術分享圖片

利用flask來實現智能聊天工具

視圖代碼:

技術分享圖片
from flask import Flask,render_template,request,jsonify,send_file
from uuid import uuid4
import s3
app = Flask(__name__)

@app.route("/")
def index():
    return render_template("index.html")

@app.route("/ai",methods=["POST"])
def ai():
    audio = request.files.get("record")
    filename = f"{uuid4()}.wav"
    audio.save(filename)

    q_text = s3.audio2text(filename)

    a_text = s3.to_tuling(q_text)

    a_file = s3.text2audio(a_text)

    return jsonify({"filename":a_file})

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

if __name__ == __main__:
    app.run("0.0.0.0",9527,debug=True)
視圖代碼

封裝的方法:s3.py

技術分享圖片
from aip import AipSpeech,AipNlp
import time
import os
""" 你的 APPID AK SK """
APP_ID = 15425824
API_KEY = RehZ5e87dXwhaXZFLGGc3kuK
SECRET_KEY = xSrsYgF3GFaMvAGsq1YBeTzfP7gTULQ8 

nlp =  AipNlp(APP_ID, API_KEY, SECRET_KEY)
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

# 讀取文件
#經錄音格式轉換為pcm格式
def get_file_content(filePath):
    os.system(f"ffmpeg -y  -i {filePath}  -acodec pcm_s16le -f s16le -ac 1 -ar 16000 {filePath}.pcm")
    with open(f"{filePath}.pcm", rb) as fp:
        return fp.read()


def audio2text(filepath):
    # 識別本地文件
    res = client.asr(get_file_content(filepath), pcm, 16000, {
        dev_pid: 1536,
    })
    print(res.get("result")[0])
    return res.get("result")[0]


def text2audio(text):
    filename = f"{time.time()}.mp3"
    result = client.synthesis(text, zh, 1, {
        vol: 5,
        per: 4,
    })

    # 識別正確返回語音二進制 錯誤則返回dict 參照下面錯誤碼
    if not isinstance(result, dict):
        with open(filename, wb) as f:
            f.write(result)

    return filename


def to_tuling(text):
    import requests
    args = {
        "reqType": 0,
        "perception": {
            "inputText": {
                "text": text
            },
        },
        "userInfo": {
            "apiKey": "eaccea98ef1a4fd2bc5e0cff6d0972c7",
            "userId": "111"
        }
    }
    url = "http://openapi.tuling123.com/openapi/api/v2"
    res = requests.post(url, json=args)
    text = res.json().get("results")[0].get("values").get("text")
    return text
封裝的方法

前端代碼:

技術分享圖片
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<audio controls autoplay id="player"></audio>
<p>
    <button onclick="start_reco()" style="background-color: yellow">錄制語音指令</button>
</p>
<p>
    <button onclick="stop_reco_audio()" style="background-color: blue">發送語音指令</button>
</p>
</body>
<!--<script type="application/javascript" src="/static/Recorder.js"></script>-->
<script type="application/javascript" src="https://cdn.bootcss.com/recorderjs/0.1.0/recorder.js"></script>
<script type="text/javascript" src="/static/jQuery3.1.1.js"></script>

<script type="text/javascript">
    var reco = null;
    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 stop_reco_audio() {
        reco.stop();
        send_audio();
        reco.clear();
    }


    function send_audio() {
        reco.exportWAV(function (wav_file) {
            var formdata = new FormData();
            formdata.append("record", wav_file);
            console.log(formdata);
            $.ajax({
                url: "http://192.168.13.32:9527/ai",
                type: post,
                processData: false,
                contentType: false,
                data: formdata,
                dataType: json,
                success: function (data) {
                    document.getElementById("player").src ="http://192.168.13.32:9527/get_audio/" + data.filename
                }
            });

        })
    }



</script>
</html>
前端代碼

大功告成!

技術分享圖片

智能聊天騷操作