成人激情在线一区二区,天天操天天爽天天舔天天操一操,极品人妻少妇诱惑日本,美女视频黄A视频全免费,国产成人综合在线观看,国产成:a人亚洲y品,亚洲国产久久久一区二区三区,成人日韩一区二区在线观看,天天搞天天做天天操天天要

小程序模板網(wǎng)

微信小程序語音識別服務搭建全過程解析(https api開放,支持新接口mp3錄音、老

發(fā)布時間:2018-01-04 12:06 所屬欄目:小程序開發(fā)教程

重要事項

目前本文中提到的API已支持微信小程序錄音文件格式:silk v3、mp3。
注:微信小程序開發(fā)工具上的錄音不論是新接口還是老接口,都是webm/base64格式,雖然后輟名是silk(或mp3),但不是真正的silk v3(或mp3)格式的,打開看頭部是 data:audio/webm;base64, 開頭的。
為了便于調(diào)試,2017年9月份時我補邏輯給支持上了,但是:我在2017年11月份發(fā)現(xiàn)原有的webm/base格式又不支持了。
api服務器端代碼沒有動過,跟蹤查過,目前僅發(fā)現(xiàn)在2017年10月份之前用微信小程序開發(fā)工具錄的文件,還是可以支持的,在10月份之后的文件,就不支持了,具體什么原因只能問老馬家的人了。
結(jié)論是:調(diào)用我本文中提到的兩個接口,只能用真機做測試,不能用電腦錄音來測試語音識別了。

重要事項
想要用我這個API,務必先去cn.olami.ai申請appKey和appSecret,然后將appKey告知我,我加進支持列表方可調(diào)用,二者缺一不可。文末有將有調(diào)用此文提到的API服務的案例以及源碼分享文章鏈接。

調(diào)用案例:“遙知之”智能小秘,歡迎掃碼體驗:
小程序碼小

 

為什么做?

前不久剛發(fā)布了一個智能生活信息查詢的小助手“遙知之”,可惜只能手動輸入來玩,這一點體驗很不好,因為微信小程序錄音是silk格式的,現(xiàn)在主要的語音識別接口都不支持。

在網(wǎng)上搜了下相應的功能,也只有php做的開源代碼實現(xiàn)的silk轉(zhuǎn)wav的服務器代碼,首先我不熟悉PHP,其次也不知道后期有沒有維護,干脆自己做一個tomcat + java版的,權(quán)當學習娛樂一下。

怎么做?

準備環(huán)境

先需要有一個支持https的服務器,我目前用的服務器是阿里云秒殺的免費最低配置的服務器,預裝的ubuntu16.04 LTS版,然后自己搗鼓一下,配置上了https,具體是用 nginx + let's encrypt + tomcat來提供的https的API。這里不詳細介紹,感興趣的自己研究下。

需要一個silk解碼器,網(wǎng)上有一牛在2015年年初曾經(jīng)發(fā)貼討論過這個話題:silk v3 編碼的音頻怎么轉(zhuǎn)換成 wav 或 mp3 之類的?

而且此牛后面有持續(xù)研究,提供了開源的silk_v3_decoder項目,具體見:kn007大牛的silk_v3_decoder

對了,開源項目是github上的,服務器上裝個git,這不用額外再說明了吧。

搭建服務步驟

下載silk-v3-decoder

基本就是在服務器上找個目錄,把大牛kn007的項目下載下來。

root@alijod:/home/jod/wechat_app# mkdir download
root@alijod:/home/jod/wechat_app# cd download/
root@alijod:/home/jod/wechat_app/download# git clone https://github.com/kn007/silk-v3-decoder.git
Cloning into 'silk-v3-decoder'...
remote: Counting objects: 634, done.
remote: Total 634 (delta 0), reused 0 (delta 0), pack-reused 634
Receiving objects: 100% (634/634), 72.79 MiB | 9.50 MiB/s, done.
Resolving deltas: 100% (352/352), done.
Checking connectivity... done.
root@alijod:/home/jod/wechat_app/download# ll
total 12
drwxr-xr-x 3 root root 4096 Sep 18 10:11 ./
drwxr-xr-x 7 root root 4096 Sep 18 10:11 ../
drwxr-xr-x 5 root root 4096 Sep 18 10:11 silk-v3-decoder/
root@alijod:/home/jod/wechat_app/download# ls silk-v3-decoder/
converter_beta.sh  converter.sh  LICENSE  README.md  silk  windows

看上述目錄,其實只用到了silk這個目錄,和converter.sh這個腳本。silk目錄中的C代碼需要gcc編譯,converter.sh腳本需要修改一下,后續(xù)都會提。

編譯silk_v3_decoder

根據(jù)https://github.com/kn007/silk-v3-decoder上的README,用上這個工具,需要gcc和ffmpeg,gcc是在編譯silk時執(zhí)行make時用到的(普及一下小白),ffmpeg其實是腳本里要用的,與編譯無關(guān)。事實是,ffmpeg在整個服務搭建過程確實不是必備的,后文將有針對這個額外說明,只是本人偷懶,暫時不想再深入研究了。

gcc的環(huán)境,如果沒有安裝,自己網(wǎng)搜吧,這里不扯了,直接進入正題:

root@alijod:/home/jod/wechat_app/download# cd silk-v3-decoder/silk/
root@alijod:/home/jod/wechat_app/download/silk-v3-decoder/silk# ll
total 32
drwxr-xr-x 5 root root  4096 Sep 18 10:11 ./
drwxr-xr-x 5 root root  4096 Sep 18 10:11 ../
drwxr-xr-x 2 root root  4096 Sep 18 10:11 interface/
-rw-r--r-- 1 root root  3278 Sep 18 10:11 Makefile
drwxr-xr-x 2 root root 12288 Sep 18 10:11 src/
drwxr-xr-x 2 root root  4096 Sep 18 10:11 test/
root@alijod:/home/jod/wechat_app/download/silk-v3-decoder/silk# make
…………
…………(這里是一大段編譯過程日志)
…………
a - src/SKP_Silk_scale_vector.o
gcc -c -Wall -enable-threads -O3   -Iinterface -Isrc -Itest  -o test/Decoder.o test/Decoder.c
test/Decoder.c: In function ‘main’:
test/Decoder.c:187:9: warning: ignoring return value of ‘fread’, declared with attribute warn_unused_result [-Wunused-result]
         fread(header_buf, sizeof(char), 1, bitInFile);
         ^
g++  -L./ test/Decoder.o -lSKP_SILK_SDK -o decoder
root@alijod:/home/jod/wechat_app/download/silk-v3-decoder/silk# ls
decoder  interface  libSKP_SILK_SDK.a  Makefile  src  test
root@alijod:/home/jod/wechat_app/download/silk-v3-decoder/silk# 

可以看到,上面編譯過程中,最后出現(xiàn)了一個warning,不過沒關(guān)系,ls查一下,第一個“decoder”就是我們要用的binary啦,有它就證明編譯成功了。

測試silk_v3_decoder功能

接下來就要驗證一下編出來的這個能不能用了。
根據(jù)https://github.com/kn007/silk-v3-decoder上的README,摘下來一段:

sh converter.sh silk_v3_file/input_folder output_format/output_folder flag(format)

比如轉(zhuǎn)換一個文件,使用:

sh converter.sh 33921FF3774A773BB193B6FD4AD7C33E.slk mp3

注意:其中33921FF3774A773BB193B6FD4AD7C33E.slk是要轉(zhuǎn)換的文件,而mp3是最終轉(zhuǎn)換后輸出的格式。

參考上面那個例子就好了,腳本參數(shù)只有兩個,一個是源文件相對或絕對路徑,另一個是目標格式。
也就是說上述命令會將33921FF3774A773BB193B6FD4AD7C33E.slk(注意,例子里是slk后輟,你自己在獲取微信小程序錄音重命名時如果是.silk,別疑惑了,linux環(huán)境文件后輟名是沒有實際意義的,感興趣自己網(wǎng)搜,to小白)轉(zhuǎn)碼成33921FF3774A773BB193B6FD4AD7C33E.mp3。

沒有silk源文件?別急,我準備了個silk_v3錄音文件,附帶著轉(zhuǎn)出來的mp3一起放在我服務器上了,需要的可以去下載(右擊后另存即可,mp3可以在線播放,silk播放不了,直接單擊會“403”):
微信小程序原始錄音文件:sample.silk
converter.sh腳本轉(zhuǎn)碼后的文件:sample.mp3

附上我轉(zhuǎn)碼的操作過程:

root@alijod:/home/jod/wechat_app/download/silk-v3-decoder# ll
total 48
drwxr-xr-x 5 root root 4096 Sep 18 10:43 ./
drwxr-xr-x 3 root root 4096 Sep 18 10:11 ../
-rw-r--r-- 1 root root 4131 Sep 18 10:11 converter_beta.sh
-rw-r--r-- 1 root root 3639 Sep 18 10:11 converter.sh
drwxr-xr-x 8 root root 4096 Sep 18 10:11 .git/
-rw-r--r-- 1 root root 1076 Sep 18 10:11 LICENSE
-rw-r--r-- 1 root root 3582 Sep 18 10:11 README.md
-rw-r----- 1 root root 6188 Sep 18 10:43 sample.silk
drwxr-xr-x 5 root root 4096 Sep 18 10:26 silk/
drwxr-xr-x 3 root root 4096 Sep 18 10:11 windows/
root@alijod:/home/jod/wechat_app/download/silk-v3-decoder# 
root@alijod:/home/jod/wechat_app/download/silk-v3-decoder# 
root@alijod:/home/jod/wechat_app/download/silk-v3-decoder# sh converter.sh sample.silk mp3
-e [OK] Convert sample.silk To sample.mp3 Finish.
root@alijod:/home/jod/wechat_app/download/silk-v3-decoder# ll
total 68
drwxr-xr-x 5 root root  4096 Sep 18 10:43 ./
drwxr-xr-x 3 root root  4096 Sep 18 10:11 ../
-rw-r--r-- 1 root root  4131 Sep 18 10:11 converter_beta.sh
-rw-r--r-- 1 root root  3639 Sep 18 10:11 converter.sh
drwxr-xr-x 8 root root  4096 Sep 18 10:11 .git/
-rw-r--r-- 1 root root  1076 Sep 18 10:11 LICENSE
-rw-r--r-- 1 root root  3582 Sep 18 10:11 README.md
-rw-r--r-- 1 root root 17709 Sep 18 10:43 sample.mp3
-rw-r----- 1 root root  6188 Sep 18 10:43 sample.silk
drwxr-xr-x 5 root root  4096 Sep 18 10:26 silk/
drwxr-xr-x 3 root root  4096 Sep 18 10:11 windows/

關(guān)于converter.sh腳本

vim打開converter.sh腳本,顯示一下行號(vim中輸入":set nu"后回車,我為小白操心不少),想要簡單使用,其實只需要關(guān)注最后面這一段,如果想要深入研究,最好是把腳本完整過程搞懂。

 82 $cur_dir/silk/decoder "$1" "$1.pcm" > /dev/null 2>&1
 83 if [ ! -f "$1.pcm" ]; then
 84         ffmpeg -y -i "$1" "${1%.*}.$2" > /dev/null 2>&1 &
 85         ffmpeg_pid=$!
 86         while kill -0 "$ffmpeg_pid"; do sleep 1; done > /dev/null 2>&1
 87         [ -f "${1%.*}.$2" ]&&echo -e "${GREEN}[OK]${RESET} Convert $1 to ${1%.*}.$2 success, ${YELLOW}but not a silk v3 encoded file.${RESET}"&&exit
 88         echo -e "${YELLOW}[Warning]${RESET} Convert $1 false, maybe not a silk v3 encoded file."&&exit
 89 fi
 90 ##ffmpeg -y -f s16le -ar 24000 -ac 1 -i "$1.pcm" "${1%.*}.$2" > /dev/null 2>&1
 91 ffmpeg -y -f s16le -ar 12000 -ac 2 -i "$1.pcm" -f wav -ar 16000 -ac 1 "${1%.*}.$2" > /dev/null 2>&1
 92 ffmpeg_pid=$!
 93 while kill -0 "$ffmpeg_pid"; do sleep 1; done > /dev/null 2>&1
 94 rm "$1.pcm"
 95 [ ! -f "${1%.*}.$2" ]&&echo -e "${YELLOW}[Warning]${RESET} Convert $1 false, maybe ffmpeg no format handler for $2."&&exit
 96 echo -e "${GREEN}[OK]${RESET} Convert $1 To ${1%.*}.$2 Finish."
 97 exit

其實關(guān)鍵的兩行也就是Line 82和Line 90。第82行就是調(diào)用我們上文編出來的decoder解碼silk_v3文件,第90行是將silk_v3文件解碼出來的raw data數(shù)據(jù)轉(zhuǎn)成相應格式。

這里額外說明一下我跟這兩行的幾個插曲:

插曲一:speex壓縮

我做這個SILK語音識別服務的起初目的是讓我的“遙知之”支持語音輸入功能,“遙知之”上用的OLAMI接口也有語音識別,而且研究了一下他們的JAVA SDK和在線文檔,從在線文檔(OLAMI 文檔中心->語音識別接口文檔->“支持的音頻格式”)上看是支持wav格式,另外支持speex壓縮。

wav格式文件是很占空間的(相當于PCM原始采樣數(shù)據(jù)未經(jīng)壓縮的,加了一個文件頭),如下圖所示(可能實際speex壓縮的效果會更好一點):
pcm, silk, speex格式文件占空間比較圖

如果將數(shù)據(jù)通過speex壓縮,就只需要腳本中的第62行,就不用依賴ffmpeg去轉(zhuǎn)碼也可以直接省流量上傳到OLAMI語音識別服務器了。這里就是為什么我前面說到,ffmpeg并不是此服務搭建中必備之原因。

如果通過speex會大大降低傳輸效率,于是期間我有花蠻長時間在研究如何將pcm數(shù)據(jù)轉(zhuǎn)成speex的,比如怎么調(diào)用c代碼實現(xiàn)的speex的編碼(java下通過JNI調(diào)用speex的encoder,研究未果,放棄了這個方案),后來又找了jspeex(java版的speex codec)等等,后面因有另一個省事方案,這里用jspeex的方案就中斷未深入研究了,其實應該是行的通的。

在QQ群(群號:656580961)里提了一下,熱心的群主“黃眉毛”說olami java sdk里默認是將wav或pcm通過speex壓縮傳輸?shù)模@樣一來,我只需要將wav或pcm對接olami java sdk就可以實現(xiàn)“省流量”傳輸?shù)給lami語音識別服務器了。這就是我最終采用的省事方案。

插曲二:采樣率不適配

發(fā)現(xiàn)通過微信小程序端錄音出來的silk v3文件,經(jīng)過kn007的converter.sh轉(zhuǎn)出來的wav文件,再送到olami語音識別接口,發(fā)現(xiàn)識別效果很糟,把wav文件拿出來聽聽,似乎也正常。

這時候想起來腳本中PCM轉(zhuǎn)wav是按24K轉(zhuǎn)的,轉(zhuǎn)出來的WAV應該是24K的,而olami語音識別端支持的是16K(訊飛還支持8K的),可能是這個采樣率不一致導致的識別率差,網(wǎng)搜了一下,還真有前人碰到過相同問題,參見此文文中提到的“誤打誤撞”那一段:從微信中提取語音文件,并轉(zhuǎn)換成文字的全自動化解決方案 ,他的誤打誤撞的原理應該是小程序錄音就是雙通道12K的,然后ffmpeg額外指定一下參數(shù)將雙通道12K的數(shù)據(jù)流轉(zhuǎn)成16K的wav。

好了,離不開ffmpeg了,需要它幫著轉(zhuǎn)采樣率呀,speex壓縮又不負責解決采樣率轉(zhuǎn)換的問題。
重要的事說三遍:在原始腳本的基礎上,修改一下第90行:
重要的事說三遍:在原始腳本的基礎上,修改一下第90行:
重要的事說三遍:在原始腳本的基礎上,修改一下第90行:

ffmpeg -y -f s16le -ar 12000 -ac 2 -i "$1.pcm" -f wav -ar 16000 -ac 1 "${1%.*}.$2" > /dev/null 2>&1

插曲三:假silk(或mp3)真webm/base64格式

在使用微信小程序開發(fā)工具模擬手機做調(diào)試時,錄音文件不能被silk和ffmpeg轉(zhuǎn),vim打開一看,頭部是“data:audio/webm;base64,”。

由此引伸出一個現(xiàn)象:微信小程序的錄音不全是silk v3(或mp3)格式,其中還有剛剛提到的webm/base64的,好像還有AMR格式的,聽kn007大神說還有混淆格式,也就是那種一個文件含多種格式混合的,也不知道為什么會有這種情況。

關(guān)于webm/base64格式,kn007的回復是,base64 decoder然后直接ffmpeg轉(zhuǎn),于是我分兩步實現(xiàn):
第一步:用java代碼做base64 decoder,再將文件寫到 xxx.webm文件中,這部分簡單,可參考微信小程序 錄音文件格式silk 坑那樣做即可。
第二步:再調(diào)用ffmpeg命令直接轉(zhuǎn)碼成wav,主要是調(diào)用一下下述轉(zhuǎn)碼命令轉(zhuǎn)成16K的WAV:

ffmpeg -i "$1" -f wav -ar 16000 -ac 1 "${1%.*}.$2" > /dev/null 2>&1

其中調(diào)用ffmpeg命令容易出現(xiàn)失敗,原因之一可能會是文件讀寫權(quán)限不足,原因之二可能會是調(diào)用ffmpeg后,需要等ffmpeg進程消失,即轉(zhuǎn)碼任務完成,才退出。 覺得我個人碰到的問題應該是原因之二導致的,因為我確實是將/usr/bin/ffmpeg設置成了777權(quán)限,還是會轉(zhuǎn)失敗,將調(diào)ffmpeg命令的部分在腳本中實現(xiàn),并且加上kn007大神converter.sh中那樣的等待ffmpeg完成的部分,就搞定了。

為了讓腳本更通用,我將上述解決采樣率不匹配的問題,修改后的腳本基礎上,又添加了對webm格式的單獨ffmpeg轉(zhuǎn)碼支持(通過判斷傳入第1個參數(shù)的后輟是否是webm來判斷是不是直接ffmpeg轉(zhuǎn)碼然后exit,簡單粗暴并且高效?。┐蟾旁谀_本的上方添加下面這一段:

SOURCE_FILE_SUFFIX=${1##*.}
echo -e "XXXX SOURCE_FILE_SUFFIX:${SOURCE_FILE_SUFFIX}"
if [[ "${SOURCE_FILE_SUFFIX}" == "webm" || "${SOURCE_FILE_SUFFIX}" == "mp3" ]]; then
        ## if webm, ffmpeg it directly. webm/base64 had been base64 decode on api.happycxz.com already.
        ## if mp3, ffmpeg it directly. mp3 do not need to decode, can be convert to wav directly.
        echo -e "begin to ffmpeg $2 from webm now..."
        ##ffmpeg -i "$1" -f wav -ar 16000 -ac 1 "${1%.*}.$2" > ffmpeg.cxz.log 2>&1
        ffmpeg -i "$1" -f wav -ar 16000 -ac 1 "${1%.*}.$2" > /dev/null 2>&1
        ##ffmpeg -i "$1" -f wav "${1%.*}.$2" > /dev/null 2>&1
        ffmpeg_pid=$!
        while kill -0 "$ffmpeg_pid"; do sleep 1; done > /dev/null 2>&1
        [ ! -f "${1%.*}.$2" ]&&echo -e "${YELLOW}[Warning]${RESET} Convert $1 false, maybe ffmpeg no format handler for $2."&&exit
        echo -e "${GREEN}[OK]${RESET} Convert $1 To ${1%.*}.$2 Finish."
        exit
else
        echo -e "begin to silk decoder flow..."
        ## if not webm, follows default silk decoder road.
fi

(注:以上腳本片斷在2017.11.09更新了mp3部分支持,因為小程序錄音新接口已經(jīng)支持mp3格式錄音,錄音文件直接經(jīng)ffmpeg轉(zhuǎn)wav即可)

至此,converter_cxz.sh修改結(jié)束。

搭建web服務及主要代碼說明

前面相當于評估可行性,基本驗證了從小程序錄音文件 xx.silk 到語音識別API能認的數(shù)據(jù)或文件格式,這條路走通了,接下來就是堆JAVA代碼實現(xiàn)細節(jié)部分了。

創(chuàng)建sprinMVC工程

大概的工程目錄結(jié)構(gòu)如下:
這里寫圖片描述

com.happycxz.controller中有兩個controller:
第1個,AdditionalController.java是用來查服務器狀態(tài)和在線更新數(shù)據(jù)用的,可忽略。
第2個,OlamiController.java是對接微信小程序silk文件上傳API接口的,代碼如下:

package com.happycxz.controller;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.security.NoSuchAlgorithmException;
import java.util.Map;  
  
import javax.servlet.ServletException;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import javax.servlet.http.Part;

import org.springframework.stereotype.Controller;  
import org.springframework.util.StringUtils;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RequestParam;  
import org.springframework.web.bind.annotation.ResponseBody;

import com.happycxz.olami.AsrAdditionInfo;
import com.happycxz.olami.OlamiEntityFactory;
import com.happycxz.olami.SdkEntity;
import com.happycxz.utils.Configuration;
import com.happycxz.utils.Util;
import com.sun.org.apache.xml.internal.security.utils.Base64;  

/** 
 * olami與微信小程序 接口相關(guān)對接
 * @author Jod
 */
@Controller  
@RequestMapping("/olami")  
public class OlamiController {
    
    //保存linux shell命令字符串
    private static final String SHELL_CMD = Configuration.getInstance().getValue("local.shell.cmd", "sh /YOUR_PATH/silk-v3-decoder/converter_cxz.sh %s wav");

    //保存silk_v3, mp3和wav文件的目錄,放在web目錄、或一個指定的絕對目錄下 
    private static final String localFilePath = Configuration.getInstance().getValue("local.file.path", "/YOUR/LOCAL/VOICE/PATH/");;  
    
    static {
        Util.p("OlamiController base SHELL_CMD:" + SHELL_CMD);
        Util.p("OlamiController base localFilePath:" + localFilePath);
    }

    @RequestMapping(value="/asr", produces="plain/text; charset=UTF-8")  
    public @ResponseBody String asrUploadFile(HttpServletRequest request, HttpServletResponse response, @RequestParam Map<String, Object> p)  
            throws ServletException, IOException {  
        return processBase(request, p, false);
    }  
   
    @RequestMapping(value="/mp3asr", produces="plain/text; charset=UTF-8")  
    public @ResponseBody String asrUploadFileMp3(HttpServletRequest request, HttpServletResponse response, @RequestParam Map<String, Object> p)  
            throws ServletException, IOException {
        return processBase(request, p, true);
    }
    
    
    public String processBase(HttpServletRequest request, @RequestParam Map<String, Object> p, boolean isMp3)  
            throws ServletException, IOException {  

        AsrAdditionInfo additionInfo = new AsrAdditionInfo(p);
        if (additionInfo.getErrCode() != 0) {
            //參數(shù)不合法,或者appKey沒有在支持列表中備錄
            return Util.JsonResult(String.valueOf(additionInfo.getErrCode()), additionInfo.getErrMsg());  
        }
        
        String localPathToday = localFilePath + getSrcFmt(isMp3) + File.separator + Util.getDateStr() + File.separator;
        // 如果文件存放路徑不存在,則mkdir一個  
        File fileSaveDir = new File(localPathToday);  
        if (!fileSaveDir.exists()) {  
            fileSaveDir.mkdirs();  
        }
  
        int count = 1;
        String asrResult = "";
        for (Part part : request.getParts()) {  
            String fileName_origin = extractFileName(part);
            //這里必須要用原始文件名是否為空來判斷,因為part列表是所有數(shù)據(jù),前三個被formdata占了,對應文件名其實是空
            if(!StringUtils.isEmpty(fileName_origin)) {
                Util.p("originFileName[" + count + "]:" + fileName_origin);
                String fileName = additionInfo.getVoiceFileName(isMp3);
                //DEBUG on windows, add temp path preffix to local D: to preserve part.write exception.
                //String recFile = "D:" + localPathToday + fileName;
                String recFile = localPathToday + fileName;
                Util.p("recFileName[" + count + "]:" + recFile);

                part.write(recFile);

                if (webmBase64Decode2Wav(recFile)) {
                    //support webm/base64 in webmBase64Decode2Wav(), wxapp develop IDE record format. 
                    //even if the suffix is xx.silk(wx.startRecord generate) or xx.mp3(wx.getRecorderManager generate)
                    //if webm base64 format , and xxxx.webm file is temporary created, xxxx.wav was last be converted.
                } else {
                    // run script to convert silk_v3 or mp3 to wav
                    Util.RunShell2Wav(SHELL_CMD, recFile);
                }
                
                // get wave file path and name, prepare for olami asr
                String waveFile = DotMp3OrDotSilk2DotOther(recFile, "wav");
                Util.p("OlamiController.asrUploadFile() waveFile:" + waveFile);
                
                if (new File(waveFile).exists() == false) {
                    Util.w("OlamiController.asrUploadFile() wav file[" + waveFile + "] not exist!", null);
                    return Util.JsonResult("80", "convert " + getSrcFmt(isMp3) + " to wav failed, NOW NOT SUPPORT WXAPP DEVELOP RECORD because it is not " + getSrcFmt(isMp3) + " format. anyother reason please tell QQ:404499164."); 
                }
                
                try {
                    SdkEntity entity = OlamiEntityFactory.createEntity(additionInfo.getAppKey(), additionInfo.getAppSecret(), additionInfo.getUserId());
                    asrResult = entity.getSpeechResult(waveFile);
                    Util.p("OlamiController.asrUploadFile() asrResult:" + asrResult);
                } catch (NoSuchAlgorithmException | InterruptedException e) {
                    Util.w("OlamiController.asrUploadFile() asr NoSuchAlgorithmException or InterruptedException", e);
                } catch (FileNotFoundException e) {
                    Util.w("OlamiController.asrUploadFile() asr FileNotFoundException", e);
                    return Util.JsonResult("80", "convert " + getSrcFmt(isMp3) + " to wav failed, NOW NOT SUPPORT WXAPP DEVELOP RECORD because it is not " + getSrcFmt(isMp3) + " format. anyother reason please tell QQ:404499164."); 
                } catch (Exception e) {
                    Util.w("OlamiController.asrUploadFile() asr Exception", e);
                }
            }
            count++;
        }
        
        //防止數(shù)據(jù)傳遞亂碼
        //response.setContentType("application/json;charset=UTF-8");

        return Util.JsonResult("0", "olami asr success!", asrResult);  
    }
    
    private static String getSrcFmt(boolean isMp3) {
        return (isMp3 ? "mp3":"silk_v3");
    }
    
    /**
     * 將  xxxxx.silk 文件名轉(zhuǎn) xxxx.wav
     * @param silkName
     * @param otherSubFix
     * @return
     */
    private static String DotMp3OrDotSilk2DotOther(String recName, String otherSubFix) {
        int removeByte = 4;
        if (recName.endsWith("silk")) {
            removeByte = 4;
        } else if (recName.endsWith("slk") || recName.endsWith("mp3")) {
            removeByte = 3;
        }
        return recName.substring(0, recName.length()-removeByte) + otherSubFix;
    }
    
    /** 
     * 從content-disposition頭中獲取源文件名 
     *  
     * content-disposition頭的格式如下: 
     * form-data; name="dataFile"; filename="PHOTO.JPG" 
     *  
     * @param part 
     * @return 
     */
    private String extractFileName(Part part) {  
        String contentDisp = part.getHeader("content-disposition");  
        String[] items = contentDisp.split(";");  
        for (String s : items) {  
            if (s.trim().startsWith("filename")) {  
                return s.substring(s.indexOf("=") + 2, s.length()-1);  
            }  
        }  
        return "";  
    }


    /**
     * 通過filePath內(nèi)容判斷是否是webm/base64格式,如果是,先decode base64后,再直接ffmpeg轉(zhuǎn)wav,
     * 如果不是,返回false丟給外層繼續(xù)當作silk v3去解
     * @param filePath
     * @return
     */
    public static boolean webmBase64Decode2Wav(String filePath) {
        boolean isWebm = false;
        try {
            String encoding = "utf-8";
            File file = new File(filePath);
            // 判斷文件是否存在
            if ((file.isFile() == false) || (file.exists() == false)) {
                Util.w("webmBase64Decode2Wav() no file[" + filePath + "] exist.", null);
            }
            
            StringBuilder lineTxt = new StringBuilder();
            String line = null;
            try (
            InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);
            BufferedReader bufferedReader = new BufferedReader(read);) {
                while ((line = bufferedReader.readLine()) != null) {
                    lineTxt.append(line);
                }
                read.close();
            } catch (Exception e) {
                Util.w("webmBase64Decode2Wav() exception0:", e);
                return isWebm;
            }
            
            String oldData = lineTxt.toString();
            if (oldData.startsWith("data:audio/webm;base64,") == false) {
                Util.d("webmBase64Decode2Wav() file[" + filePath + "] is not webm, or already decoded." );
                return isWebm;
            }
            
            isWebm = true;
            oldData = oldData.replace("data:audio/webm;base64,", "");
            String webmFileName = DotMp3OrDotSilk2DotOther(filePath, "webm");
            try {

                File webmFile = new File(webmFileName);
                byte[] bt = Base64.decode(oldData);
                FileOutputStream in = new FileOutputStream(webmFile);
                try {
                    in.write(bt, 0, bt.length);
                    in.close();
                } catch (IOException e) {
                    Util.w("webmBase64Decode2Wav() exception1:", e);
                    return isWebm;
                }
            } catch (FileNotFoundException e) {
                Util.w("webmBase64Decode2Wav() exception2:", e);
                return isWebm;
            }
            
            // run cmd to convert webm to wav
            Util.RunShell2Wav(SHELL_CMD, webmFileName);
        } catch (Exception e) {
            Util.w("webmBase64Decode2Wav() exception3:", e);
            return isWebm;
        }
        
        return isWebm;
    }
    
    public static void main(String[] args) {
        webmBase64Decode2Wav("D:\\secureCRT_RZSZ\\1505716415538_f7d98081-4d21-3b40-a7df-e56c046a784d_b4118cd178064b45b7c8f1242bcde31f.silk");
    }
} 

利用springMVC的注解,很方便的實現(xiàn)API功能,主要看這個asrUploadFile方法,參數(shù)包括request和response之外,還有一個Map結(jié)構(gòu)的p,這個p是用來接收formdata的,即上傳錄音文件時附帶的信息。
我這里強制了必須上傳appKey、appSecret以及userId,因為我是直接對接的olami開放平臺的接口。

大概的流程是(懶的畫流程圖了,直接看上面代碼,很容易看明白的):

  1. 接收p中上傳的appKey、appSecret以及userId這三個必選參數(shù)
  2. 接收request中的Parts,獲取原始silk格式文件及對應的上傳文件名
    這里面其實是包括file和formdata的,這里還掉進一個坑過,想著不需要調(diào)用“extractFileName”來拿原始文件名,直接收以請求,隨機生成一個文件名保存了得了,事實是,通過“extractFileName”拿文件名,當文件名為""或null時,這時候是formdata,不是文件,強制保存成文件肯定就出問題了(調(diào)試時發(fā)現(xiàn)有些錄音文件里只有一個很短的數(shù)字字母組成的字符串,就是這個原因)。
  3. 將文件另取個名字保存到服務器指定目錄
    為什么要另存文件名:微信小程序上傳的錄音文件統(tǒng)一是wx-file.silk,不像小程序開發(fā)工具上錄音那樣文件名隨機生成。
  4. 這里有個額外判斷第3步中保存的xxx.silk是不是webm/base64格式的,如果是,就直接base64 decoder后保存文件 xxx.webm,然后調(diào)用converter_cxz.sh將webm格式的文件轉(zhuǎn)碼成xxx.wav的,走完流程或異常都跳過下一步,直接到第6步。如果不是webm/base64格式的,返回false,繼續(xù)走下一步。
  5. 調(diào)用silk_v3_decoder中的腳本(這里是上文提到的修改之后的腳本,我給重命名converter_cxz.sh了)轉(zhuǎn)xxx.wav
  6. 通過原來的silk文件全路徑,計算出wav文件全路徑
  7. 通過上一步得到的wav文件全路徑,以及appKey、appSecret以及userId這三個參數(shù),生成一個SdkEntity實體,調(diào)用getSpeechResult接口獲取語音識別和語義處理的結(jié)果
  8. 組織輸出結(jié)果返回。

com.happycxz.olami中有四個文件:
第1個,AsrAdditionInfo.java是用來檢查https請求中formdata必選的三個參數(shù)是否都上傳了,是否合法。
這里我額外做了個限制,除了在olami平臺上申請的appKey和appSecret之外,appKey還要額外告知我,我在支持列表中加上才可以用,避免被攻擊了大家都沒法用,沒辦法,小窩帶寬有限。

第2個,OlamiEntityFactory.java是做一個SdkEntity的緩存,如果formdata中上傳的userId不一樣,這個緩存就沒用了:(

第3個,OlamiKeyManager.java是配合第一個文件做appKey限制管理的。

第4個,SdkEntity.java是對接olami接口的部分,主要是從olami java sdk sample代碼中拷出來改改的。代碼如下:

package com.happycxz.olami;


import java.io.IOException;
import java.security.NoSuchAlgorithmException;

import com.google.gson.Gson;
import com.happycxz.utils.Util;

import ai.olami.cloudService.APIConfiguration;
import ai.olami.cloudService.APIResponse;
import ai.olami.cloudService.CookieSet;
import ai.olami.cloudService.SpeechRecognizer;
import ai.olami.cloudService.SpeechResult;
import ai.olami.nli.NLIResult;
import ai.olami.util.GsonFactory;

public class SdkEntity {
    
    //indicate simplified input
    private static int localizeOption = APIConfiguration.LOCALIZE_OPTION_SIMPLIFIED_CHINESE;
    // * Replace the audio type you want to analyze with this variable.
    
    private static int audioType = SpeechRecognizer.AUDIO_TYPE_PCM_WAVE;
    //private static int audioType = SpeechRecognizer.AUDIO_TYPE_PCM_RAW;

    // * Replace FALSE with this variable if your test file is not final audio. 
    private static boolean isTheLastAudio = true;
    
    private APIConfiguration config = null;
    
    //configure text recognizer
    SpeechRecognizer recoginzer = null; 
    // * Prepare to send audio by a new task identifier.
    //CookieSet cookie = new CookieSet();
    
    // json string for print pretty
    private static Gson jsonDump = GsonFactory.getDebugGson(false);
    // normal json string
    private static Gson mGson = GsonFactory.getNormalGson();

    public SdkEntity(String appKey, String appSecret, String userId) {
        Util.d("new SdkEntity() start.  appKey:" + appKey + ", appSecret: " + appSecret + ", userId: " + userId);
        try {
            config = new APIConfiguration(appKey, appSecret, localizeOption);
            recoginzer = new SpeechRecognizer(config);
            recoginzer.setEndUserIdentifier(userId);
            recoginzer.setTimeout(10000);
            recoginzer.setAudioType(audioType);
        } catch (Exception e) {
            Util.w("new SdkEntity() exception", e);
        }
        Util.d("new SdkEntity() done");
    }
    
    public String getSpeechResult(String inputFilePath) throws NoSuchAlgorithmException, IOException, InterruptedException {
        String lastResult = "";
        
        Util.d("SdkEntity.getSpeechResult() inputFilePath:" + inputFilePath);
        
        CookieSet cookie = new CookieSet();
        
        // * Start sending audio.
        APIResponse response = recoginzer.uploadAudio(cookie, inputFilePath, audioType, isTheLastAudio);
        //
        // You can also send audio data from a buffer (in bytes).
        //
        // For Example :
        // ===================================================================
        // byte[] audioBuffer = Files.readAllBytes(Paths.get(inputFilePath));
        // APIResponse response = recoginzer.uploadAudio(cookie, audioBuffer, audioType, isTheLastAudio);
        // ===================================================================
        //
        Util.d("\nOriginal Response : " + response.toString());
        Util.d("\n---------- dump ----------\n");
        Util.d(jsonDump.toJson(response));
        Util.d("\n--------------------------\n");

        //四種結(jié)果,full最完整,seg, nli, asr只包括那一部分
        String full = "", seg = "", nli = "", asr = "";
        // Check request status.
        if (response.ok()) {
            // Now we can try to get recognition result.
            Util.d("\n[Get Speech Result] =====================");
            while (true) {
                Thread.sleep(500);
                // * Get result by the task identifier you used for audio upload.
                Util.d("\nRequest CookieSet[" + cookie.getUniqueID() + "] speech result...");
                response = recoginzer.requestRecognitionWithAll(cookie);
                Util.d("\nOriginal Response : " + response.toString());
                Util.d("\n---------- dump ----------\n");
                Util.d(jsonDump.toJson(response));
                Util.d("\n--------------------------\n");
                // Check request status.
                if (response.ok() && response.hasData()) {
                    full = mGson.toJson(response.getData());
                    // * Check to see if the recognition has been completed.
                    SpeechResult sttResult = response.getData().getSpeechResult();
                    if (sttResult.complete()) {
                        // * Get speech-to-text result
                        Util.p("* STT Result : " + sttResult.getResult());
                        asr = mGson.toJson(sttResult);
                        // * Check to see if the recognition has be
                        // Because we used requestRecognitionWithAll()
                        // So we should be able to get more results.
                        // --- Like the Word Segmentation.
                        if (response.getData().hasWordSegmentation()) {
                            String[] ws = response.getData().getWordSegmentation();
                            for (int i = 0; i < ws.length; i++) {
                                Util.d("* Word[" + i + "] " + ws[i]);
                            }
                            seg = response.getData().getWordSegmentationSingleString();
                        }
                        // --- Or the NLI results.
                        if (response.getData().hasNLIResults()) {
                            NLIResult[] nliResults = response.getData().getNLIResults();
                            nli = mGson.toJson(nliResults);
                        }
                        // * Done.
                        break;
                    } else {
                        // The recognition is still in progress.
                        // But we can still get immediate recognition results.
                        Util.d("* STT Result [Not yet completed] ");
                        Util.d(" --> " + sttResult.getResult());
                    }
                }
            }
        } else {
            // Error
            Util.w("* Error! Code : " + response.getErrorCode(), null);
            Util.w(response.getErrorMessage(), null);
        }
        
        lastResult = full;
        
        Util.d("\n===========================================\n");
        return lastResult;
    }
    
    public static void main(String[] args) throws NoSuchAlgorithmException, IOException, InterruptedException {
        Util.p("SdkEntity.main() start...");
        int argLen = args.length;
        
        Util.d("SdkEntity.main() args.length[" + argLen + "]:");
        for (String arg : args) {
            Util.d("SpeexPcm.main() arg[" + arg + "]");
        }

        new SdkEntity("b4118cd178064b45b7c8f1242bcde31f", "7908028332a64e47b8336d71ad3ce9ab", "abdd").getSpeechResult(args[0]);
        Util.p("SdkEntity.main() end...");
    }
}

com.happycxz.olami中有兩個文件,是使用到的一些util、讀配置文件、系統(tǒng)日志等部分。

另外WEB-INFO/lib中加載olami的java sdk,如圖:
這里寫圖片描述

另外,額外附上一張olami-java-client-1.0.1-source.jar中關(guān)于默認采用speex壓縮的源碼部分:
這里寫圖片描述

怎么用

老接口(錄音為silk格式的,通過wx.startRecord錄音的)調(diào)用:https://api.happycxz.com/wxapp/silk2asr

新接口(錄音為mp3格式的,通過wx.getRecorderManager錄音的)調(diào)用:https://api.happycxz.com/wxapp/mp32asr
(注:如果調(diào)用新接口,要求小程序端錄音配置成:sampleRate: 16000, numberOfChannels: 1, encodeBitRate: 48000, format: 'mp3')

formdata必選參數(shù)(以上兩個接口均適用):
|參數(shù) | 是否必選| 說明 |
|---------|---------|---------------|
|appKey |是 |從olami.cn上申請的key|
|appSecret|是 |從olami.cn上申請的secret|
|userId |是 |用戶的唯一標識,比如手機號,或唯一性的ID,或IMEI號之類的|

返回數(shù)據(jù)res.data就是olami開放平臺返回結(jié)果完全一致,未經(jīng)修改,具體參考他們在線文檔:
olami開放平臺的API接口返回數(shù)據(jù)格式

大概的是 seg字段是語音識別分段結(jié)果,asr是語音識別結(jié)果,nli是語義或語義處理的結(jié)果。小程序的開發(fā)工具上沒法DEBUG,就沒辦法截一段例子說明了。

調(diào)用案例:“遙知之”智能小秘

小程序碼小
歡迎掃碼試用。這一版支持語音識別,博客還沒來得及更新,稍后我會把相關(guān)代碼在這個文章“我的微信小程序支持語音識別啦!“遙知之”不再裝聾”中分享出來,主要是分享一下微信小程序里如何上傳SILK錄音部分以及如何解析olami返回的語音識別和語義處理結(jié)果的代碼。

最后閑話

服務端工程的代碼分享:
本文所有源碼對應碼云鏈接:https://gitee.com/happycxz/silk2asr
本文所有源碼對應github鏈接:https://github.com/happycxz/silk2asr

如果有不明白的都可以在本博客文章后面留言,也歡迎大家指正文中的理解或文字描述錯誤或不清楚的部分,我將及時更正,避免帶人跳坑。

需要用這個接口的,appKey可以在我的個人博客留言或私信告訴我,我加進我的白名單你才可以用。


易優(yōu)小程序(企業(yè)版)+靈活api+前后代碼開源 碼云倉庫:starfork
本文地址:http://m.chqfk.com/wxmini/doc/course/18380.html 復制鏈接 如需定制請聯(lián)系易優(yōu)客服咨詢: 點擊咨詢
在線客服
易小優(yōu)
轉(zhuǎn)人工 ×
Av资源站中文字幕| 久久躁夜夜躁日日躁狠狠躁| 漂亮人妻被强制中出| 99riav国产尤物蜜臀精品| 国产老熟女高潮在线播放| 国产成人午夜精品视频| 中文字幕精品av在线观看| 日韩成人在线电影,| 亚洲熟妇av一区二区蜜桃第1集| 亚洲国产成人在线观看网址| 自拍第一页免费视频| 国产盗摄女子私密保健视频| 女人扒开逼逼让男人操| 在线观看小视频国产| 公一区二区三区高清99| 亚洲人体艺术二区三区视频| 久久三级片一区二区毛片| 人妻天天爽夜夜爽麻豆av| 麻豆一区二区大豆行情| 亚洲一区二区三区邪恶成人| 亚洲精品乱码久久观看网| 亚洲欧美伦理一区二区| 欧美黄色免费在线网站| 色吊最新在线视频免费观看| 一区二区三区精品在线免费视频| 播放灌醉水嫩大学生国内精品 | 浪荡人妻共32部分黑人| 天天操天天摸天天摸| 女抽插流出张开淫水视频| 制服丝袜诱惑综合网| 欧美精品综合第一页| 中文字幕av网址大全| 欧美激情在线观看新地址| av大片在线观看免费| 亚洲美女乱1区2区3区| 欧美在线一区日韩国产| julia 人妻中文字幕| 女人扒开逼逼让男人操| 91精品人妻中文字幕| 亚洲欧洲另类小说图片| 日韩欧美在线不卡一区二区三区| 国产精品亚洲综合视频| 视频在线播放一区二区| 国产精品久久久久白浆| 国产又粗又长又硬又猛又黄的视频| 自拍偷拍 中文字幕 日韩| 高清日本欧美亚洲视频| 久久人人爽人人爽人人亚洲| 福利视频在线免费观看伦理| 天天操天天日天天啪| 精品视频在线视频精品| 天天色天天爱天天日| 爆操性感美女性色av| 一区二区三区四区免费福利视频| 男人的坤插进女人的屁股里的视频| 美女av网站在线观看| 亚洲成av中文字幕| 青青草精品视频在线免费观看| 欧洲日韩视频一区二区三区| 程嘉美日本全部三级| 国产精品午夜在线观看| 少妇的激情夜夜爽爽爽爽爽| 亚洲av性色在线观看黄色| 99久久999久久久hd| 人人妻人人妻人人妻人人妻人人人| 亚洲另类欧美在线观看| 丰满的女教师bd视频| 午夜三级影片免费播放| 国产剧情swag在线观看| 欧美激情性做爰视频| 91精品午夜呻吟xxxx | 一级女人色又黄毛片女人 | 可以在线观看的黄色网页| 手机视频在线观看99精品视频| 成人3d动漫一区二区三区91| 国产av人人夜夜澡人人爽下载 | 日韩av中文字幕乱码| 十八禁视频一区二区三区四区| 国产精品一品二区三区日韩| 67194久久一区二区| 熟女一区二区三区四区五区视频| 国产半推半就精品强推视频| 三级三级三级日本99| 欧美142p极品服务| 中国熟妇丰满大乳大屁股 | 国产c片免费观看| 91国内精品视频在线| 亚洲视频免费观看不卡| 国产精品福利免费视频不卡| 真人同房直接做视频免费| 亚洲成年人三级电影| 色就色欧美亚洲αv| 99久久99久久免费精品蜜臀| 国产盗摄女子私密保健视频| 青青草成人免费电影| 婷婷视频在线观看一区的| 亚洲欧美另类激情综合区动漫| 色一伊人区二区亚洲最大| 超碰人人澡人人碰人人| 青青操在线视频精品| 日韩国产亚洲在线视频| 午夜三级影片免费播放| 亚洲欧美动漫卡通 另类| 999久久久精品精品| 中国福利在线黄色片| 一级女人色又黄毛片女人| 亚洲欧美另类图片88| 在线视频 国产 日韩 欧美| av一av一av中文字幕| 98资源站精品视频在线观看| 人妻少妇精品视频专区vr| 午夜性色福利视频自拍偷拍 | 欧美一级黄片视频免费| 国产高清在线免费视频| 亚洲视频综合在线播放| 96人妻一区=区三区| 91人妻人人做人人爽九色全集| 无人码一区二区三区视频| av中文字幕在线播放| 欧美日韩综合在线免费观看| 在线高清视频你懂得| 狠狠操操操操操操操操操操| 88888欧美精品久久久| 亚洲一区二区综合网| 一区二区三区在线中国| 自拍第一页免费视频| 在线免费看亚洲精品少妇69式| 2020精品国产自在现线官网| 狂野黑人性猛交xxxxxx| 要看tv在线观看欧美日韩| 亚洲欧美另类图片88| 亚洲天堂一二三四在线播放| 日本免费播放一区二区三区| 999在线精品视频观看| 99精品视频中文字幕| 亚洲综合久久综合网| 国产极品尤物粉嫩泬在线观看| 免费熟女精品一区二区三区| 天天色天天干天天操| 日韩欧美在线不卡一区二区三区| 亚洲天堂男人的天堂av| 99久久夜色精品国产亚洲软件| 黑人系列哪个最猛番号| 极品国模sm镣铐调教| 国产老熟女高潮在线播放| 青春草在线视频播放免费观看网站 | 黄片免费观看久久av| 91免费观看国产精品| 新超碰97在线观看| 亚洲一区二区视频在线免费观看| 中文字幕不卡av在线播放| 天天日天天看天天摸| 久久久激情视频网站| 天天色天天干天天操| 天天射天天日天天干天天舔| 日本性少妇xxxx| 在线视频一视频二视频三| 亚洲欧美区二区三区| 熟女免费在线观看视频| 欧洲日韩视频一区二区三区| 亚洲免费国产在线日韩| 婷婷视频在线观看一区的| 新婚人妻聚会被中出| 日韩精品高清免费视频| 俄罗斯第一次处破女| 蜜桃av在线网址观看| av蜜桃网在线观看| av网址大全在线播放| 中国熟妇丰满大乳大屁股| 国产精品啪啪啪免费网站| 日本免费啪啪啪啪啪啪啪啪啪啪| 色综合久久加勒比高清剧情| 色欲天天天久久久综合| 97电视剧在线观看免费完整版| 3D美女高跟鞋插穴| 日本高清插阴视频免费| 91高清免费观看在线| 日日夜夜夜操天天干| 亚洲天堂av插插插| 天天日天天色天天搞| 天天操天天湿天天干| 二亚洲女同性同志熟女| 日日躁夜夜躁狠狠久久av| 人人妻在线视频97| 日韩性爱视频无码三级片| 亚洲av综合久久久久久| 亚洲国产日韩a在线欧美2020| 亚洲图片,自拍偷拍| 中文字幕亚洲日韩第一页| 亚洲国产aⅴ成人精品无吗| 人妻寝取少妇乱中文字幕| 91jk麻豆美女丝袜诱惑| 亚洲情品中文字幕人妻久久久边| 中国熟妇丰满大乳大屁股| 亚洲伊人av 综合福利| 1777中文字幕字幕在线播放| 国产1区2区在线视频| 99riav国产尤物蜜臀精品| 隔壁老王国产在线观看| 九九热在线这里只有精品| 在线观看国产视频99| 亚洲一级免费av黄色打炮片| 93乱子伦国产乱子伦| 成人免费视频国产免费麻豆下| 亚洲女同性同志熟女女同| 在线观看国产影片| 大鸡巴操的好爽好舒服啊视频| 亚洲国产成人在线观看网址| 婷婷亚洲综合在线五月天| 日韩av一区二区三区久久| 在线视频无码理论片| 日韩破处精品在线观看| 日本a爱视频二区三区| 中文字幕不卡av在线播放| av中文字幕高清在线| 国产精品爽黄69天堂ai蜜乳| 在线视频 国产 日韩 欧美| 熟女一区二区三区四区五区视频| av男人免费的天堂| 超碰超碰超碰超碰超碰情侣| 国产黑色丝袜视频在线观看下| 91表用白丝脚帮我脚交| 国产黑色丝袜视频在线观看下| 精品少妇人妻av免费久久胖妇| 国内人人人妻狠狠狠操操| 亚洲国产图片小说一区二区| av网址大全在线播放| 2012在线国语中文字幕| 亚洲欧美 在线视频| 欧美激情在线观看一区| 天天大香蕉一区二区三区| 亚洲成年人三级电影| 国产又黄又粗又硬又大又猛的视频| 日本 久久久 香蕉| 国产欧美日韩经典一区| 筱田优在线播放一区二区三区| 免费一级黄色片麻豆系列| 香蕉影视在线观看av最新| 日韩精品一区二区三区中文精 | 天天插天天色天天透| 操人妻免费视频观看| 韩国美女主播福利视频| 亚洲精品少妇久久久久久| 国产av综合av国产精品| av在线操亚洲图片| 亚洲欧美另类激情综合区动漫| 美女极品美女福利视频在线| 自拍第一页免费视频| 中文字幕黄色av网址| 亚洲 网友 在线 观看| 欧洲av,亚洲av| 99久久999久久久hd| 偷拍自拍 中文字幕| 国产综合av免费观看| 欧美黄色免费在线网站| 国产综合av一区二区| 91免费观看国产精品| 成人性生交大免费三人| 激情综合网激情俺她去| 免费在线观看视频色播| 日韩三级中文字幕熟女| 天天干天天日天天超| 好男人资源在线视频观看社区| fc2精品成人免费观看| 黄片免费观看久久av| 日韩毛片综合在线观看网站| 成人麻豆免费视频精品区| 韩国美女主播福利视频| 自拍偷拍 中文字幕 日韩| 一区二区三区四区免费福利视频| 香蕉久久av一区二区三区四区| 亚洲国产日韩欧美高清片vr| 97超级碰最新在线视频| 日韩美女精品一在线观看| 日本系列变态另类一区二区三区| 国产视频在线精品视频| 亚洲精品**不卡在线播he| 日本黄页网络站免费| 日韩伦理一区二区三区有码| 亚洲国内自拍愉拍影音先锋| 色就色欧美亚洲αv| 免费直接观看的麻豆黄色| 日本av毛片在线播放| 日韩资源在线中文字幕| 91在线免费观看成人| 美女被弄高潮喷水91视频9| 人妻久久免费视频中文字幕| 国产又粗又长又黄视频| suv精品一区二区6| 成人福利电影免费网址| 国产三级av在线免费观看| 国产半推半就精品强推视频| 在线精品亚洲区一区二区| 天天日……天天操……天天喷| 婷婷视频在线观看一区的| 亚洲va欧美va人人爽午夜 | 午夜性色福利视频自拍偷拍| 少妇的激情夜夜爽爽爽爽爽| 国产绿帽人妻精品系列| 成人免费视频国产免费麻豆下| 大肉大捧一进一出免费视频网址| 男女啪啪啪网站入口| 天天日天天色天天搞| 国产av在线一区二区| 起碰97视频在线播放| 欧美视频一区二区三区在线观看| 天天色天天爱天天舔| 亚洲中文字幕在线成人| 人人妻人人妻人人妻人人妻人人人| 在线观看国产视频99| 美女极品美女福利视频在线| 亚洲av永久久久久久久蜜桃| 欧美精品黑人粗大破除| 变态另类97人妻av| 日韩毛片综合在线观看网站| 伊人精品在线大香蕉| 天天天天拍天天天天天天| 久久99精品久久久久久小说| 播放灌醉水嫩大学生国内精品| 在线看片1024你懂得| 阿v视频在线观看免费播放| 亚洲综合另类小说色区色噜噜,| 91久久香蕉国产熟女| 丰满雪白人妻人爽16av精品| 久久久久久久国产精品人妻| 一区二区三区欧美高清| 二根鸡巴日一个穴视频| av色哟哟国产精品| 成年女人毛片免费在线播放| heyzo久久综合色88| 97超碰在线come| 在线视频 国产 日韩 欧美| 日韩高清av一区二区三区| 蜜臀 av一区二区| 在线91精品亚洲网站精品成人| 欧美图色 亚洲图色| av大片在线观看免费| 999热这里只有精品视频| 丝袜制服 亚洲 国产 91| 人妻天天爽夜夜爽麻豆av| 久久久久久久久毛片精品奶炮| 欧美熟妇搡bbbb水蜜桃| 丰满人妻被猛烈进入中文字幕四川| 欧美xxxx视频在线| 男女精品久久久久久久久久| 国产av大全网站天堂| 亚洲一区二区视频在线免费观看| 欧美日韩无卡一二三区| 免费成视频人免费91| 亚洲精品一区二区三区新线路| 手机在线免费视频一区二区三区| 93乱子伦国产乱子伦| 国产精品自拍亚洲春色| 好男人资源在线视频观看社区| 国产成人女人毛毛片视频| 午夜剧场欧美一区二区| 1777中文字幕字幕在线播放| 人操美女操美女操美女| 中国熟妇丰满大乳大屁股 | 97免费人妻超碰97在线| 部长侵犯人妻一区二区三区| 自拍偷拍 中文字幕 日韩| 港台经典一级成人免费av| 欧美,偷拍,另类,综合| 国产福利中文字幕导航| 91精品国产自产在线大长腿| 精品成人午夜免费看| 99久久夜色精品国产亚洲软件| 免费高清视频在线观看不卡男男| 真人同房直接做视频免费| 欧洲野外激情性视频| 搡四十路e五十路熟女av| 精品人人妻人人澡人人爽| 无套内谢少妇高潮毛片免费看| 欧美激情性4一级完整版| av大片在线观看免费| 免费成人中文字幕电影| 99精品国产自在现线观看| 教资是不是人人都可以考| 久久久激情视频网站| 欧美日韩国产在线观看了| 熟女免费在线观看视频 | 乱一区二区三区在线播放| 黄色免费2b网页18岁有声音| 97久久精品熟女超碰| 欧美精品乱码久久久久久| 97色婷婷久久99国产视频| 成年大片40分钟免费视频播放| ai给视频自动加字幕| 67194久久一区二区| 国产九九视频在线观看| www国产精品久久久久久| 98资源站精品视频在线观看| 狠狠操操操操操操操操操操| 福利一区二区在线视频| 嗯嗯嗯啊啊啊不要好爽视频| 人妻熟妇丰满不伦一区二区三区| 青青操在线视频精品| 天天射天天日天天干天天舔| 国产老熟女高潮在线播放| 欧美精品乱码久久久久久| 久久精品国产亚洲av视瓶 | 午夜男女激情福利视频| 极品人妻vide0sss人妻| 大香蕉97精品一区二区三区 | 日本少妇人妻久久中文| 97人妻碰碰碰久久久| 天天干天天日天天超| 操日本裸体美女骚逼| 97超级碰最新在线视频| 4455vw在线观看| 挺进老妇的肉91九色| 亚洲欧美 在线视频| 欧美一区,二区三区高清视频| 在线免费观看欧美激情视频| 亚洲欧美在线色图动态图| 国产伦精品三区精品国偷自产在线| 日韩av一区二区三区久久| 国产极品尤物粉嫩泬在线观看| 日本老熟妇色狠狠一区| 亚洲人成亚洲人成在线观看com| av手机在线免费播放| 成人3d动漫一区二区三区91| 国产成人一区二区三区久| 人妻熟一区二区三区四区不卡| 一区二区三区四区免费福利视频| 亚洲一级免费av黄色打炮片| 91亚洲情色在线播放| 国产又粗又长又黄视频| 新超碰97在线观看| 黑人熟女一区二区三区| 亚洲中文字幕在线成人| 老鸭窝最新网址在线| 超碰人妻中文字幕在线| 免费在线国产观看av| 98视频在线免费观看| 国产熟女一区二区三区四| av国产在线观看网站| 国产情侣激情在线对白| 免费观看视频一区,二区,三区 | 另类图片亚洲图区第一页| 亚洲一区二区视频在线免费观看| 亚洲精品久久久久久久久久蜜桃| 亚洲视频 中文字幕 人妻| 偷拍自拍视频图片免费| 亚洲少妇av在线播放| 最新日韩成人毛片在线| 97免费人妻超碰97在线| 欧美142p极品服务| 国产精品午夜在线观看| 草草影院黄色在线观看| 91国内精品视频在线| 91福利精品一区二区| 天天天天拍天天天天天天| 人妻天天操avxx| 成人免费视频国产免费麻豆下| 久久精品国产9久久综合| 国产传媒网址在线观看| 新婚人妻聚会被中出| 亚洲三级伦理在线播放| 午夜福利久久久国产视频| 黄色av免费下载软件| 国产又黄又粗又硬又大又猛的视频 | 丰满人妻被猛烈进入中文字幕四川| 国产剧情星空无限传媒| 在线观看成人激情av| 97国产婷婷在线观看| 欧美成人免费观看黄片| 欧美在线一区日韩国产| 爆操嫩逼黑丝袜美女小骚逼| 福利视频国产在线在线观看| 欧美丝袜熟女日韩亚洲| 欧美激情在线观看新地址 | 亚洲情品中文字幕人妻久久久边| 人妻中文字幕不卡av观看| 免费在线观看国产成人大片| 欧美 亚洲 激情 自拍| 天天操天天操天天干天天| 美女的逼让男人桶的视频| 91色porny 在线播放| 99久久99久久免费精品蜜臀| 国产又黄又粗又硬又大又猛的视频| 欧美亚洲国产校园春色| 亚洲欧洲美洲无码在线| 2022AV天堂免费在线观看| 在线视频无码理论片| 中文字幕久久精品亚洲乱码| 性色av一区二区三区观看| 日韩国产亚洲在线视频| 久久草大香蕉在线视频| 国产又黄又粗又硬又大又猛的视频 | 日韩不伦高清一区二区三区| 久操视频精品在线观看| 日韩美女精品一在线观看| 精品久久久久aⅴ一区二区| 亚洲欧美另类图片88| 操女人下阴黄色一级视频| 久国产一二三区四区乱码2021| 蜜桃一区二区17c| 黄色 成年人 免费观看| 人妻a∨在线中文字幕| 午夜在线小视频在线观看| 久久草大香蕉在线视频| 欧美一区视频不卡高清| 国产精品黄色自拍视频| 午夜福利精品视频在线观看| 91人妻精品动漫一区二区三区| 亚洲欧美国产其他二区| av网址在线观看日韩| 中文有码一区二区三区| 亚洲另类熟女国产精品老| 一区二区三区欧美日韩电影| 大鸡巴操的好爽好舒服啊视频| 嗯~啊~好舒服在线观看| 99精品国产自在现线观看| 91大屁股人妻porn| 国产一线女人天堂av| 可以在线观看的黄色网页| 欧美av色香蕉一区二区小说| 色男人的天堂一区二区三区| 老师让我插进去69AV| 午夜剧场欧美一区二区| 偷拍自拍视频图片免费| 丰满的女教师bd视频| 91福利国产成人精品| 欧美黑人天天干夜夜操| 国产a v一区二区三区香蕉| 亚洲三级这里只有精品| 亚洲精品1234区在线看 | 人妻熟妇丰满不伦一区二区三区| 适合黄黑皮的显白发色| 国自产拍偷拍福利精品免费观看| 成人黄色大全在线观看| 99热6在线播放免费| 伊人情人综合成人久久网小说| 欧洲日韩视频一区二区三区| 欧美 亚洲 激情 自拍| 欧美日韩aaaaa级黄片视频| 午夜性色福利视频自拍偷拍 | 亚洲欧美另类图片88| 伦人伦xxxx国语对白| 77777蜜臀精品久久综合| 一级女人色又黄毛片女人| 污污污视频在线观看91| 隔壁老王国产在线观看| 99久久精品免费看蜜桃的推荐词| 91 chinese 在线播放| 偷窥老熟女久久久av| 99,九九,久久精品| 99热6在线播放免费| 适合黄黑皮的显白发色| 日韩美女精品一在线观看| 国产三级伦理在线观看| 亚洲国产日韩欧美高清片vr| 久久99精品国产99久久6尤| 操女人下阴黄色一级视频| 中文字幕精品av在线观看| 天天色天天操综合网| 超碰人妻中文字幕在线| 自拍偷拍 中文字幕 日韩| 欧美综合一区二区三区| 大香蕉大香蕉在线播放| 91精品午夜呻吟xxxx| 免费成人中文字幕电影| 亚洲精品一区二区三区新线路| 麻豆一区二区大豆行情| 99久久香蕉国产线看| 黄色性网站免费观看| 亚洲图色熟女五月天| 青青操在线视频精品| 2020中文字幕在线播放| 天天日天天看天天摸| 人妻中文字幕不卡av观看| 欧美一级操逼啊啊啊哦哦哦| 销魂少妇一区二区视频| 成人午夜伦理在线观看| 国产精品黄色自拍视频| 无人码一区二区三区视频| 亚洲 欧美在线视频| 久久精品国产二区AV无码| 福利一区二区在线视频| 不卡一区二区啪啪视频| www国产精品久久久久久| 玖玖玖精品视频在线观看| 亚洲视频 中文字幕 人妻| 欧洲日本亚洲一区二区| 涩涩网站在线观看视频| 麻豆精品午夜福利在线| 五月天丁香婷久久爱| 男女精品久久久久久久久久| 国模视频写真一区二区| 色一伊人区二区亚洲最大| 啪啪啪免费亚洲精品网站| 要看tv在线观看欧美日韩| 亚洲主要位于五带中的什么带?| 二根鸡巴日一个穴视频| 人妻精品久久久久中文字幕19| 五月天开心激情深爱激情| 天天碰天天摸人人看| 亚洲另类欧美在线观看| 日韩不伦高清一区二区三区| 九九热在线这里只有精品| 亚洲精品1234区在线看 | 老鸭窝在线视频国产| 熟女一区二区三区四区五区视频| 要看tv在线观看欧美日韩| 成人免费视频国产免费麻豆下| 色欲天天天久久久综合| 在线播放国产免费av| 亚洲人成亚洲人成在线观看com| 亚洲中文有码一区二区| 三上悠亚和黑人665番号| 狂野黑人性猛交xxxxxx| 国产精品自拍亚洲春色| 一区二区三区精品视频| 93乱子伦国产乱子伦| 欧美福利视频一二三| 可以直接在线观看的一区| 亚洲综合欧美熟一区| 成人教育 在线学习| 亚洲av永久久久久久久蜜桃| 五月激情四射丁香婷婷激情四射| 男生的天堂亚洲男人| 亚洲天堂 校园春色| 国产黑色丝袜视频在线观看下| 在线视频一视频二视频三| 国产欧美日韩一区91| av网址大全在线播放| 天天操天天湿天天干| 欧美黑人性色黄在线视频| 亚洲熟妇色在线观看| 98资源站精品视频在线观看| 可以免费看啪啪啪的网站| 久久精品在线观看免费视频| 草逼美女逼话多的视频出水| 99麻豆精品国产自产在线观看| 四川操bb操bb操b| 偷窥中国丰满多毛老熟女| 欧美 日韩 中文 字幕| 日本不卡少妇视频在线观看| yy111111少妇蜜桃| 可以免费看啪啪啪的网站| 亚洲欧美日韩偷窥自拍| 99久久99久久免费精品蜜臀| 天天干天天日天天超| 亚洲高清中文字幕在线的| 精品岛国产熟女人妻欲求不满| 精品成人午夜免费看| 亚洲小说区图片另类春色| 丝袜美腿国产在线观看| 免费直接观看的麻豆黄色| 99久久精品国产欧美一区二区| 亚洲视频 中文字幕 人妻| 午夜在线小视频在线观看| 91高清免费观看在线| 色欲天天天久久久综合| 精品无人区高清免费看| 综合另类小说欧美另类图片| 日本黄页网络站免费| 狠狠操操操操操操操操操操| 免费在线观看国产成人大片| 9色自拍视频在线观看| 色男人的天堂一区二区三区| 夜夜骑加勒比天天操| 一区二区三区在线 日韩| 99久久精品美女高潮喷水| 青娱乐青青草丁香婷婷| 五月天中文字幕剧情在线| 亚洲国内自拍愉拍影音先锋| 亚洲欧洲另类小说图片| 在线观看小视频国产| 人人咪咪一区二区三区| 欧美 日韩 中文 字幕| 最大最全av中文字幕网| 办公室被吃奶好爽在线观看视频 | 中文字幕永久在线一区二区| 中文字幕永久在线一区二区| 偷窥中国丰满多毛老熟女| 嗯嗯嗯啊啊啊不要好爽视频| 青青操视频在线免费| 浪荡人妻共32部分黑人| 风间由美亚洲一区二区三区| 福利视频国产在线在线观看| 日韩精品一区二区三区中文精| 亚洲欧美日韩不卡人妻中文字幕| 国产伊人 av 自拍| 国产91精品久久久久高潮| 一区二区三区欧美日韩电影| 午夜网在线观看视频| 天天干天天日天天超| 欧美中文字幕综合在线| 99久久免费国产特黄| 人妻 日韩精品免费| 91av国产在线观看| 亚洲综合欧美熟一区| 美女草草影院在线观看视频| 日韩一区二区视频在线看| 91亚洲国产成人久久| 可以直接在线观看的一区| 五月婷婷丁香花激情网| 亚洲精品国偷自产久色| 农村女人91熟女熟妇| 国产成人女人毛毛片视频| 白峰美羽在线观看av| 亚洲av网站在线免费观看| 欧美丝袜熟女日韩亚洲| 自拍分享国产亚洲欧美| 国产中文字幕在线免费播放 | 久久草大香蕉在线视频| 欧美一级特黄aaaaaa片| 亚洲av永久久久久久久蜜桃 | 五月天免费在线观看| 手机视频在线观看99精品视频 | 部长侵犯人妻一区二区三区| 超碰在线观看97视频| 日韩伦理一区二区三区有码| 天堂网作爱视频在线播放| 国产精品视频白浆免费网站| 五月婷婷综合大香蕉五月天| 高清日本wwwcom| 欧美一级操逼啊啊啊哦哦哦| 少妇美女大极品内射| 亚洲欧洲自拍他拍av| 国产一线女人天堂av| 久久久激情视频网站| 97超碰在线视频观看| 极品人妻vide0sss人妻| 最新天堂一区二区三区| 色吊最新在线视频免费观看| 未满18禁止入内免费视频| 亚洲熟妇色在线观看| av在线手机免费观看| 天天操天天日天天啪| 在线手机免费观看视频| 超碰chaopeng 国产| 久久久国产视频91| 日韩中文字幕免费大片| 欧美美女视频在线免费看| 啪啪在线视频免费观看| 国产白丝美女在线网站| 天天射天天日天天干天天舔| 96h久久国产激情| 福利一区二区在线视频| 午夜老司机福利一二三区| 国产美女遭高潮免费视频| 富二代av一区二区| 女人被男人阳具抽插的呻吟视频 | aaa222男人天堂| 91国内精品视频在线| 白峰美羽在线观看av| 国产三级伦理在线观看| 色婷婷久久久久av| 丰满人妻被猛烈进入中文字幕四川| 欧美成人免费观看黄片| 日韩无码成人电影一区二区| 在线播放 国产 真实| 97精品国产高清在线| 久久久久久久国产精品人妻| av在线播放网站资源| 日本五十路六十路中出| 青青草原亚洲精品在线观看| 国产成人午夜精品视频| 人妻中文字幕不卡av观看| 色淫骚色色色色色色美女| 精品欧美一亚洲精品午夜| 自拍分享国产亚洲欧美| 91精品在线播放hd| 大黑鸡巴 狂插 欧亚小嫩逼| 日本黄色操碌缬巴| 91精品久久久久久婷婷高清| 国产熟女一区二区三区四| 先锋资源在线观看国产精品| 欧洲日本亚洲一区二区 | 五月天开心激情深爱激情| 午夜性色福利视频自拍偷拍 | 亚洲欧美伦理一区二区| 国产av综合av国产精品| japanese五十路熟女熟妇| 青青操成人免费在线视频| 98久久久久98久久久久| 东游记中文字幕版哪里可以看到| 亚洲精品少妇久久久久久| 欧洲av,亚洲av| 久久亚洲日本精品视频| 亚洲性趣老熟妇高清| av一区二区三区蜜臀| 播放灌醉水嫩大学生国内精品| 亚洲天堂 校园春色| 91久久香蕉国产熟女| 成人黄色大全在线观看| fc2精品成人免费观看| 亚洲国产精品日日夜夜| 日韩高清视频在线播放| 久久人人爽人人爽人人亚洲| 综合久久天天搞天天]| 97偷偷碰在线视频| 国产一线女人天堂av| 日本老熟妇色狠狠一区| 亚洲熟妇色在线观看| 欧美在线免费污污视频| 内射一对幼嫩无毛妹| 超级碰碰碰97免费视频97| 国产又黄又粗又硬又大又猛的视频| 成人大片精品在线观看| 人妻熟妇丰满不伦一区二区三区| 91精品在线播放hd| 亚洲性趣老熟妇高清| 蜜臀 av一区二区| 久久三级片一区二区毛片| 亚洲,自拍,中文,另类| 青青草手机视频在线观看| 亚洲久久久久久久久久久久久久 | 都市激情校园春色av| 亚洲av福利片久久久久| 天天操夜夜爽夜夜操| 亚洲永久av午夜福利| 欧美成人a v在线| 精品视频在线视频精品| 色婷婷亚洲久久97成人| 十八禁视频一区二区三区四区| av 激情 开心 五月| 瑟瑟的网站在线观看| 狠狠躁日日躁夜夜躁2| 十八禁视频一区二区三区四区 | 成人午夜伦理在线观看| 公一区二区三区高清99| av中文字幕高清在线| 国产精品欧美日韩久久久免费观看 | 日本一区二区不卡电影| 久久视频十八岁亚洲精品久久视频| 一区二区三区在线中国| 亚洲国产精彩中文乱码av| 美女主播大奶子黄瓜插逼| 欧美美女视频在线免费看| 亚洲自拍偷拍清纯唯美| 免费无码专区毛片高潮喷水| 国产成人a一区二区| 新婚人妻聚会被中出| 婷婷爱在线视频精品| 青青视频青青成人免费| 国产在线视频国产资源| 国产精品福利免费视频不卡| 久操视频精品在线观看| 在线观看免费黄片欧美| 亚洲男人天堂111117av| 天天干天天日天天超| 午夜性色福利视频自拍偷拍| 97超碰在线cao| 欧美黑人抱着强干视频| 91高清免费观看在线| 在线视频 国产 日韩 欧美| Av资源站中文字幕| 亚洲日本欧洲一区二区| 成人av影视一区在线观看| 97精品国产高清在线| 日韩av免费福利在线观看| 男人把女人捅爽动漫| 成人一级黄色片免费看| 亚洲欧洲另类小说图片| 成年人中文字幕视频网| 操日本裸体美女骚逼| 77777蜜臀精品久久综合| 欧美日韩无卡一二三区| 超碰在线97人人草| 欧美xxxx视频在线| 麻豆一区二区大豆行情| av精选一区二区久久| 东京热av在线播放| 一区二区三区四区不卡在线观看 | 日本很黄很黄的动态视频| 激情 亚洲 精品视频| 在线人妻视频网站免费| 国产亚洲精品电影aa在线观看| 老司机免费福利视频网| 亚洲精品少妇蜜桃久久久| 超碰超碰超碰超碰超碰情侣| 男人的天堂av最新| 青娱乐精品视频在线免费观看| 日韩一区二区视频在线看| 99久久夜色精品国产亚洲软件 | 久久久久久久国产精品人妻| 丝袜美腿国产在线观看| 在线观看免费a亚洲| 中文一区二区三区精品视频| 亚洲一区二区三区免费| 深夜亚洲精品免费福利你懂的| 微拍一区二区在线观看| 黄色 成年人 免费观看| 国产黑色丝袜视频在线观看下| 适合黄黑皮的显白发色| 五月天开心激情深爱激情| 免费观看视频一区二区三区| av手机在线免费播放| 99精品视频中文字幕| av一区二区二十四小时| 精品一区二区三区在线免费播放| 亚洲性趣老熟妇高清| 夜夜骑加勒比天天操| 色综合久久加勒比高清剧情| 日韩最新视频在线播放| 欧美福利视频一二三| 97超碰在线视频观看| 福利视频国产在线在线观看| heyzo久久综合色88| 欧美142p极品服务| 青青操成人免费在线视频| 久久综合色——久久综合色88| 亚洲欧美伦理一区二区| mm在线视频观看免费观看| 天天干夜夜操日日操| 色综合久久加勒比高清剧情| 国产欧美精品va在线观看| 亚洲av一区视频在线观看| 日本熟妇丰满厨房55| 国产乱子伦一区=区三区| 欧美精品综合第一页| 日本公与妇电影三级| 日韩最新视频在线播放| 在线观看国产精品123| 熟女一区二区三区四区五区视频 | 91麻豆精品国产91久久久平台| 中文字幕日本一本二本三区| 偷拍自拍 中文字幕| 小少妇被大鸡巴操手机在播放| 亚洲国产精品国自产拍a∨| 在线高清视频你懂得| 亚洲欧美另类激情综合区动漫| 亚洲人人妻一区二区三区| 美女av网站在线观看| 欧美va久久久噜噜噜久久| 欧美成年性精品三级网站| 国产原创成人av剧情在线播放| 未满18禁止入内免费视频| 91大神视频在线观看视频| 91精品人妻一区二区三区水蜜桃| 亚洲国产中文字幕在线视频| 内射一对幼嫩无毛妹| 国产美女高清免费av| 婷婷视频在线观看一区的| 日韩美女精品一在线观看| 青春草在线视频播放免费观看网站| 99,九九,久久精品| 亚洲国产精品av久久久| 青青草青青草成人免费公开| 成人大片精品在线观看| 日韩精品在线播放视频成年人| 99久久999久久久hd| 嗯嗯嗯啊啊啊不要好爽视频| 最大最全av中文字幕网| 色视频免费在线观看视频| 97人妻碰碰碰久久久| 欧美一级黄片视频免费| 亚洲人体艺术二区三区视频| 99精品私筹模特大尺度视频| 丁香激情五月天综合网| 隔壁老王国产在线观看| 午夜精品不卡视频在线观看| 美女的逼让男人桶的视频| 国产精品视频白浆免费网站| av鲁丝一区鲁丝二区鲁丝四区| 999在线视频一区二区三区| 欧美日韩综合在线免费观看| 午夜老司机福利一二三区| 爆操嫩逼黑丝袜美女小骚逼| 蜜桃视频18在线观看| 欧洲日本亚洲一区二区| av鲁丝一区鲁丝二区鲁丝四区| 亚洲av性色在线观看黄色| 一区二区三区精品在线免费视频| 五月天免费在线观看| 在线理论国产高清在线| 黄色 成年人 免费观看| 老司机免费福利视频网| 天堂av在线中文在线新版| 在线免费看亚洲精品少妇69式| xfplay亚洲资源| 国内精品久久久久久久999| 2020中文字幕在线播放| 亚洲欧美动漫卡通 另类| 黄色中文字幕在线观看| 日本熟妇丰满厨房55| 黄色性网站免费观看| 阿v视频在线观看免费播放| 国产av综合av国产精品| 欧美一区二区三区乱轮| 蜜桃av在线网址观看| 欧美日韩国产综合不卡| 亚洲日本欧洲一区二区| 免费阿v视频在线播放| 国产日视频在线观看| 国产传媒中文字幕在线| 久久91精品国产91久久分享| 99精品国产免费久久久久久| 亚洲女同性同志熟女女同| 久久亚洲伊人99精品影院| 国产精品自拍亚洲春色| 久久精品国产亚洲av视瓶 | 香蕉影视在线观看av最新| 久久精品国产亚洲a| 男人天堂新在线电影| 最大最全av中文字幕网| 在线中文字幕综合一区 | 国产成人女人毛毛片视频| 中文字幕国产电影在线观看| 日本av都是真做吗| 怡红院精彩视频在线观看| 久久人人爽人人爽人人亚洲| 激情 亚洲 精品视频| 国产精品久久久久精品蜜月| 亚洲欧美一区二区精华液| 干 白虎 少妇 嫩 逼 视频| 人妻 日韩精品免费| 欧美激情自拍2020| 日本黄色操碌缬巴| 亚洲国产日韩欧美在线观看| 男生的天堂亚洲男人| 久草免费资源视频在线观看| 色婷婷亚洲久久97成人| 人人咪咪一区二区三区| 久久少妇精品一区二区免费| 国产黑色丝袜视频在线观看下| 在线精品亚洲区一区二区| 在线91精品亚洲网站精品成人| 宝贝把腿张开让我添| 亚洲精品乱码久久观看网| 亚洲国产图片小说一区二区| 性色av成年在线观看| 日本熟妇wxw日本人妻| 男人插女人逼app| 港台经典一级成人免费av| 亚洲欧美区二区三区| 青青草精品视频在线免费观看| 亚洲av永久久久久久久蜜桃 | 黑人精品一区a一二区b| 性感的人妻在线观看| 国产黑色丝袜视频在线观看下| 日本 久久久 香蕉| 人操美女操美女操美女| 九九热在线这里只有精品| 久久精品国产9久久综合| 在线小视频,你懂的| 女人被男人阳具抽插的呻吟视频| 老司机免费福利视频网| 港台经典一级成人免费av| japanese五十路熟女熟妇| 久久精品视频全部视频在线| av男人天堂精品久久| 综合久久天天搞天天]| 国产成人一区二区三区久| 精品国产污污免费网站aⅴ17| 国产a v一区二区三区香蕉| 日本黄页网络站免费| 欧美xxxx视频在线| 欧美视频在线观看18| 97色 国产精品综合| 色噜噜在线综合亚洲欧美| 亚洲中文有码一区二区| 国产熟女一区二区三区四| 青青草成人免费电影| 欧美一区二区三区乱轮| 阿v视频在线观看免费播放| 亚洲国产日韩欧美高清片vr| 欧美一级特黄aaaaaa片| av网址大全在线播放| 久久精品亚洲国产一区二区| 一区二区三区国产精选在线播放| 国产日韩欧美精品久久久一区二区| 日韩国产亚洲在线视频| 国产又大又粗又硬又爽视频| 五月婷婷综合大香蕉五月天| 美女极品美女福利视频在线| 十八禁视频一区二区三区四区| 欧美一级特黄aaaaaa片| 日韩国产亚洲在线视频| 91大屁股人妻porn| 伦人伦xxxx国语对白| 91大屁股人妻porn| av在线播放网站资源| 亚洲人成青青操免费观看| 寂寞少妇一区二区三区| 99热6在线播放免费| 免费观看视频一区二区三区| 视频在线播放一区二区| 亚洲国产精品av久久久| 在线观看免费黄片欧美| 四川操bb操bb操b| 久久久国产视频91| 国产情侣激情在线对白| 国产视频精品在线免费观看| 色婷婷久久久久av| 微拍一区二区在线观看| 26uuu天堂在线青青在线视频| 色就色欧美亚洲αv| 人妻熟妇丰满不伦一区二区三区| 性感的人妻在线观看| 五月色婷婷在线视频| 天天操天天摸天天摸| 美女 激情 欧美 日韩| 亚洲精品 国产成人| 在线91精品亚洲网站精品成人| 办公室被吃奶好爽在线观看视频| 中文一区二区三区精品视频| 亚洲视频 中文字幕 人妻| 东京热av在线播放| 日本老熟妇色狠狠一区| 欧美精品日韩第一页| 日韩高清视频在线播放| 国产美女视频在线播放| 美女诱惑福利在线视频| 东京热av在线播放| 色综合久久激情综合久久| 天天爱天天日天天干天天做| 国产精品一品二区三区日韩| 国产剧情免费在线观看| 欧美激情在线观看新地址| 欧美激情性4一级完整版| 成年大片40分钟免费视频播放| 四川操bb操bb操b| 成人午夜影视在线观看| 人妻少妇偷人视频一| 91福利国产成人精品| 日本v片 中文字幕| 久久精品国产亚洲a| 青青青青青青青青草青青| 26uuu天堂在线青青在线视频| 五月天亚洲精品综合网| 96h久久国产激情| 99国产精品免费视频观看a| 日本熟妇wxw日本人妻| 一区二区三区精品在线免费视频| 婷婷视频在线观看一区的| 国产又粗又长又硬又猛又黄的视频 | 精品人妻一区三区三区| 人妻熟女一区二区aⅴ佐佐木明希| 欧美一级黄片视频免费| 999热这里只有精品视频| 超碰人人澡人人碰人人| 色吊最新在线视频免费观看| 亚洲欧美伦理一区二区| 伊人大香线蕉亚洲五月天| 国产精品黄色自拍视频| 91久久精品视频91| 久久躁夜夜躁日日躁狠狠躁| 欧美一级特黄aaaaaa片| 2018免费天天干夜夜操| 免费人妻av一区二区| 激情综合网激情俺她去| 真人同房直接做视频免费| 蜜桃aⅴ噜噜一区二区三区网址| 福利一区二区在线视频| 隔壁老王国产在线观看| 1717精品视频在线观看| 北条麻妃制服丝袜在线播放| 婷婷丁香花综合激情五月天| 成人麻豆免费视频精品区 | 亚洲图片一区偷拍自拍| 天天干天天日天天超| 亚洲精品成人原创视频| 国产欧美日韩一区91| 中文一区二区三区精品视频| 丝袜美腿国产在线观看| 可以免费看啪啪啪的网站| 人人咪咪一区二区三区| 日本少妇精品bbwbbw| 亚洲永久av午夜福利| www久久久久久久99| 国产成人午夜精品视频| 亚洲欧洲美洲无码在线| 国产原创成人av剧情在线播放| 欧美激情在线观看新地址| 色淫骚色色色色色色美女| 天天天天拍天天天天天天| 国产又粗又长又硬又猛又黄的视频 | 黄色av日韩免费在线观看| 亚洲国产欧美日韩国产| 国产一线女人天堂av| 亚洲国产精品av久久久| 青青操在线视频精品| 综合另类小说欧美另类图片| 青青操在线视频精品| 亚洲少妇av在线播放| 天天操天天射天天综合网| 九月丁香婷婷中文字幕| 男人的天堂av最新| 亚洲国产日韩欧美在线观看 | 偷拍自拍视频图片免费| 日韩精品高清免费视频| 欧美成人免费观看黄片| 人操美女操美女操美女| 熟女人妻人妻のhd| 东游记中文字幕版哪里可以看到|