精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

混元開(kāi)源之力:Spring-Ai-hunyuan 項(xiàng)目功能升級(jí)與實(shí)戰(zhàn)體驗(yàn)

人工智能
對(duì)于前端開(kāi)發(fā)者來(lái)說(shuō),流式問(wèn)答(SSE)可以非常方便地實(shí)現(xiàn)實(shí)時(shí)聊天功能,而思考鏈的集成則讓聊天更具智能化和邏輯性。雖然目前圖片生成還未完全對(duì)接,但語(yǔ)音轉(zhuǎn)文本和文本轉(zhuǎn)語(yǔ)音的功能已非常完善,提供了兩種方式(本地文件和 URL)來(lái)處理音頻數(shù)據(jù)。

今天咱們繼續(xù)聊聊 spring-ai-hunyuan 這個(gè)項(xiàng)目。上次我們兼容了 spring-ai 的 1.0.0 正式版本之后,就暫時(shí)放了一陣子,沒(méi)怎么動(dòng)。最近倒是收到不少小伙伴反饋,說(shuō)混元的思考鏈功能為什么不返回結(jié)果。其實(shí),混元官方那邊提供的兼容 OpenAI 的方案,本質(zhì)上就是幫大家能快速接入,方便快捷,但也難免會(huì)有一些高級(jí)特性或者參數(shù)沒(méi)辦法支持。就算官方給了參數(shù),也未必能直接用上。

942f4b5f09c95c39554398f80f251538942f4b5f09c95c39554398f80f251538

所以最近我就抽時(shí)間重新開(kāi)發(fā)了一下,專(zhuān)門(mén)把思考鏈的集成做了進(jìn)來(lái)。同時(shí)順帶把 ASR(語(yǔ)音識(shí)別)和 TTS(語(yǔ)音合成)功能也加進(jìn)去了,這樣一來(lái),基本上跟文字生成相關(guān)的場(chǎng)景都給覆蓋了,功能更加完整了。

項(xiàng)目的源碼開(kāi)源在這兒,感興趣的小伙伴可以直接去看看: https://github.com/StudiousXiaoYu/spring-ai-hunyuan

目前我還沒(méi)寫(xiě)出詳細(xì)的實(shí)戰(zhàn)案例教程,不過(guò)今天先給大家簡(jiǎn)單介紹一下,方便大家能快速上手。所有的案例源碼也已經(jīng)全部開(kāi)源了,大家可以直接 clone 到本地跑起來(lái)試試: https://github.com/StudiousXiaoYu/spring-ai-hunyuan-example

項(xiàng)目集成

首先,咱們需要在 pom.xml 文件中集成相應(yīng)的依賴。只需要將以下依賴添加到你的 pom.xml 中就可以了:

<dependency>
    <groupId>io.github.studiousxiaoyu</groupId>
    <artifactId>spring-ai-starter-model-hunyuan</artifactId>
    <version>${spring-ai-hunyuan.version}</version>
</dependency>

好的,這樣就搞定了,挺簡(jiǎn)單的。現(xiàn)在我們已經(jīng)開(kāi)發(fā)到1.0.0.2版本了,除了混元生文功能外,還加入了思考鏈、文本轉(zhuǎn)語(yǔ)音、語(yǔ)音轉(zhuǎn)文本等功能。接下來(lái),我們需要在配置文件里加上你騰訊云的秘鑰信息,具體內(nèi)容如下:

spring.ai.hunyuan.secret-id=${HUNYUAN_SECRET_ID}
spring.ai.hunyuan.secret-key=${HUNYUAN_SECRET_KEY}

申請(qǐng)地址如下:https://console.cloud.tencent.com/cam/capi

你直接新建秘鑰即可。

d33326c09c1f19d4d6ca7fe78599375dd33326c09c1f19d4d6ca7fe78599375d

場(chǎng)景演示

沒(méi)錯(cuò),經(jīng)過(guò)這些步驟后,我們就具備了所有必要的條件,可以直接用 SpringAI 混元框架來(lái)對(duì)接混元,進(jìn)行企業(yè)級(jí)開(kāi)發(fā)了。這樣一來(lái),開(kāi)發(fā)流程會(huì)更加順暢,功能也能更好地滿足企業(yè)需求,效率會(huì)大大提升。

模型注入

首先,我們需要將本章節(jié)需要用到的所有模型先注入進(jìn)來(lái)。這里簡(jiǎn)單介紹下。

private final ChatClient chatClient;

private final HunYuanAudioTranscriptionModel audioTranscriptionModel;

private final HunYuanAudioTextToVoiceModel textToVoiceModel;

public ChatClientExample(ChatModel chatModel, HunYuanAudioTranscriptionModel audioTranscriptionModel, HunYuanAudioTextToVoiceModel textToVoiceModel) {
    this.chatClient = ChatClient.builder(chatModel).defaultAdvisors(new SimpleLoggerAdvisor()).build();
    this.audioTranscriptionModel = audioTranscriptionModel;
    this.textToVoiceModel = textToVoiceModel;
}

這里使用的聊天模型默認(rèn)是hunyuan-pro,語(yǔ)音轉(zhuǎn)文本則用的是一句話識(shí)別接口,具體使用的模型是16k_zh-PY(支持中英粵三種語(yǔ)言)。需要注意的是,這個(gè)接口有一些限制,比如音頻時(shí)長(zhǎng)不能超過(guò)60秒,文件大小不能超過(guò)3MB。之所以選擇這個(gè)接口,是因?yàn)槟壳罢Z(yǔ)音轉(zhuǎn)文本技術(shù)主要集中在日常對(duì)話類(lèi)應(yīng)用,像大數(shù)據(jù)分析這種場(chǎng)景還沒(méi)有廣泛涉及,所以暫時(shí)是采用這個(gè)接口。如果你有疑問(wèn),可以參考一下官方文檔鏈接:點(diǎn)擊查看文檔。

至于文本轉(zhuǎn)語(yǔ)音,我們用的是101001(情感女聲),你可以查看音色列表來(lái)了解更多:點(diǎn)擊查看音色列表,如果需要更多信息,也可以參考這里:點(diǎn)擊查看詳細(xì)文檔。

如果你想調(diào)整模型的參數(shù),完全可以在配置文件中做修改。我已經(jīng)把參數(shù)配置開(kāi)放出來(lái),常見(jiàn)的參數(shù)如下:

#聊天模型切換
spring.ai.hunyuan.chat.options.model=
#語(yǔ)音轉(zhuǎn)文本模型切換
spring.ai.hunyuan.audio.transcription.options.engSerViceType=
#文本轉(zhuǎn)語(yǔ)音模型切換
spring.ai.hunyuan.audio.tts.options.voiceType=

這只是其中的一個(gè)小例子,實(shí)際上官方提供的所有請(qǐng)求參數(shù)都被封裝在每個(gè)模型配置的 option 里面。如果你想了解更詳細(xì)的內(nèi)容,可以直接去看看官方文檔,或者你也可以查看我寫(xiě)的源碼,都會(huì)有很清楚的說(shuō)明。

基礎(chǔ)聊天

先來(lái)看下最基礎(chǔ)的生文操作,直接使用spring ai的官方示例即可。

對(duì)話

這里直接看下阻塞問(wèn)答和流式問(wèn)答,代碼如下:

@PostMapping("/chat")
public String chat(@RequestParam("userInput")  String userInput) {
    String content = this.chatClient.prompt()
            .user(userInput)
            .call()
            .content();
    log.info("content: {}", content);
    return content;
}

@GetMapping("/chat-stream")
public Flux<ServerSentEvent<String>> chatStream(@RequestParam("userInput") String userInput) {
    return chatClient.prompt()
            .user(userInput)
            .stream()
            .content() // 獲取原始Flux<String>
            .map(content -> ServerSentEvent.<String>builder() // 封裝為SSE事件
                    .data(content)
                    .build());
}

因?yàn)槲覀儾捎昧肆魇絾?wèn)答的方式,通常最喜歡用前端通過(guò)SSE(Server-Sent Events)來(lái)實(shí)現(xiàn)。所以在這個(gè)地方,我也直接返回了ServerSentEvent,這樣方便前端對(duì)接。這里雖然沒(méi)有展示具體的頁(yè)面,但示例項(xiàng)目中已經(jīng)集成了Swagger文檔,你可以簡(jiǎn)單瀏覽一下,看看效果如何。

f5ee0d824ce45c4ad8d409a2cef3e5b2f5ee0d824ce45c4ad8d409a2cef3e5b2

結(jié)構(gòu)化對(duì)象

另外一個(gè)要說(shuō)的點(diǎn)是結(jié)構(gòu)化對(duì)象的兼容性,簡(jiǎn)單來(lái)說(shuō)就是系統(tǒng)能不能返回 Java 對(duì)象的信息。接下來(lái)我們看一下具體的代碼:

@GetMapping("/ai-Entity")
public ActorFilms aiEntity() {
    ActorFilms actorFilms = chatClient.prompt()
            .user("Generate the filmography for a random actor.")
            .call()
            .entity(ActorFilms.class);
    return actorFilms;
}

/**
 *當(dāng)前用戶輸入后,返回列表實(shí)體類(lèi)型的回答,ParameterizedTypeReference是一個(gè)泛型,用于指定返回的類(lèi)型。
 * @return List<ActorFilms>
 */
@GetMapping("/ai-EntityList")
List<ActorFilms> generationByEntityList() {
    List<ActorFilms> actorFilms = chatClient.prompt()
            .user("Generate the filmography of 5 movies for Tom Hanks and Bill Murray.")
            .call()
            .entity(new ParameterizedTypeReference<List<ActorFilms>>() {
            });
    return actorFilms;
}

public record ActorFilms(String actor, List<String> movies) {
}

這個(gè)例子里,我們用了兩種不同的情況:一種是普通的單一類(lèi)型,另外一種是數(shù)組類(lèi)型。當(dāng)然,其實(shí)其他類(lèi)型的Map結(jié)構(gòu)也是支持的。不過(guò),能不能正常運(yùn)行,最終還是取決于模型的能力,看它是否支持這些結(jié)構(gòu)。

目前我用的hunyuan-pro模型還沒(méi)有報(bào)錯(cuò)。從返回的結(jié)果來(lái)看,大體上是沒(méi)問(wèn)題的,具體效果可以參考下面的截圖:

0bf0976f53f5cfc0617a6190f5fd2d5f0bf0976f53f5cfc0617a6190f5fd2d5f

函數(shù)調(diào)用

另外,關(guān)于函數(shù)調(diào)用的部分,我們會(huì)提前準(zhǔn)備好一些寫(xiě)好的方法,并且把這些方法的參數(shù)暴露出來(lái),供大模型調(diào)用。先讓我們看看代碼是怎么寫(xiě)的吧。

@PostMapping("/ai-function")
String functionGenerationByText(@RequestParam("userInput")  String userInput) {
    HunYuanChatOptions options = new HunYuanChatOptions();
    options.setModel("hunyuan-functioncall");
    String content = this.chatClient
            .prompt()
            .options(options)
            .user(userInput)
            .tools(new DateTimeTools())
            .call()
            .content();
    log.info("content: {}", content);
    return content;
}

public class DateTimeTools {

    @Tool(description = "Get the current date and time in the user's timezone")
    String getCurrentDateTime() {
        String currentDateTime = LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();
        log.info("getCurrentDateTime:{}",currentDateTime);
        return currentDateTime;
    }

}

我這里簡(jiǎn)單展示了一下如何獲取當(dāng)前日期的工具,代碼沒(méi)有加入任何輸入?yún)?shù),主要就是看看它能否正常工作。順便提一下,我在代碼里指定了當(dāng)前使用的模型。之前的配置是換全局模型,但在這里,你只需要替換當(dāng)前對(duì)話中使用的模型就行了。因?yàn)槲覀冃枰袚Q到一個(gè)支持函數(shù)調(diào)用的大模型。

最后演示如下,如圖所示:

745f6cb93a52a727a7b6ea7d119afa27745f6cb93a52a727a7b6ea7d119afa27

思考鏈

新集成的思考鏈來(lái)了,簡(jiǎn)單來(lái)說(shuō),就是通過(guò)檢查大模型返回的數(shù)據(jù),看里面有沒(méi)有包含‘思考’的內(nèi)容。不過(guò)要注意,并不是所有的大模型都有這個(gè)功能,只有部分模型才會(huì)有類(lèi)似的思考內(nèi)容。代碼如下:

@PostMapping("/chat-think")
public String think(@RequestParam("userInput")  String userInput) {
    HunYuanChatOptions options = new HunYuanChatOptions();
    options.setModel("hunyuan-a13b");
    options.setEnableThinking(true);
    ChatResponse chatResponse = this.chatClient.prompt()
            .user(userInput)
            .options(options)
            .call().chatResponse();
    HunYuanAssistantMessage output = (HunYuanAssistantMessage) chatResponse.getResult().getOutput();
    String think = output.getReasoningContent();
    String text = output.getText();
    log.info("think: {}", think);
    log.info("text: {}", text);
    return text;
}

@PostMapping("/stream-think")
public Flux<ServerSentEvent<String>> streamThink (@RequestParam("userInput") String userInput){
    HunYuanChatOptions options = new HunYuanChatOptions();
    options.setModel("hunyuan-a13b");
    options.setEnableThinking(true);
    Flux<ServerSentEvent<String>> chatResponse = this.chatClient.prompt()
            .user(userInput)
            .options(options)
            .stream()
            .chatResponse()
            .map(content -> (HunYuanAssistantMessage) content.getResult().getOutput())
            .map(content -> {
                String think = content.getReasoningContent();
                String text = content.getText();

                StreamResponse streamResponse;
                if (think != null && !think.isEmpty()) {
                    streamResponse = new StreamResponse("thinking", think);
                } else {
                    streamResponse = new StreamResponse("answer", text);
                }
                return ServerSentEvent.<String>builder()
                        .data(JSONUtil.toJsonStr(streamResponse))
                        .build();
            });
    return chatResponse;
}

@Data
@NoArgsConstructor
public class StreamResponse {
    @JsonProperty("type")
    private String type;
    
    @JsonProperty("content")
    private String content;
    
    public StreamResponse(String type, String content) {
        this.type = type;
        this.content = content;
    }
}

同樣的,我這邊也寫(xiě)了兩種方案,一個(gè)是阻塞式的,另一個(gè)是流式返回內(nèi)容的。因?yàn)槟壳癝pring AI還沒(méi)有統(tǒng)一的思考鏈返回字段,所以如果你想要獲取思考鏈的內(nèi)容,得先把返回的信息類(lèi)轉(zhuǎn)換成我自己定義的信息類(lèi),才能提取出這些數(shù)據(jù)。而且還需要注意的是,你得設(shè)置enableThinking的值才行。

接下來(lái)我們來(lái)看一下效果,像圖上展示的那樣。

a6018743ab6eb5b5b8bf1bc53e9f6f91a6018743ab6eb5b5b8bf1bc53e9f6f91

因?yàn)槲抑荒芊祷氐焦潭ǖ淖侄卫铮匀绻阈枰粤魇降姆绞将@取思考鏈的話,你得先定義一個(gè)格式,方便前端去截取數(shù)據(jù)。我這邊已經(jīng)幫你定義好了,當(dāng)前的返回樣式就是這樣的,如圖所示。

30f8225c0de95f5d9c710830532188e030f8225c0de95f5d9c710830532188e0

通過(guò)type值,前端就可以方便的定義標(biāo)簽里的值了。

圖片理解

目前大模型已經(jīng)可以支持圖片理解了,但它暫時(shí)不能直接通過(guò)文字生成圖片,這其實(shí)是另外一個(gè)功能,需要單獨(dú)進(jìn)行對(duì)接。目前這個(gè)部分還沒(méi)有對(duì)接完成。以下是相關(guān)的代碼:

@PostMapping("/chatWithPic")
public String chatWithPic(@RequestParam("userInput")  String userInput) {
    var imageData = new ClassPathResource("/img.png");
    var userMessage = UserMessage.builder()
            .text(userInput)
            .media(List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)))
            .build();
    var hunyuanChatOptions = HunYuanChatOptions.builder().model("hunyuan-turbos-vision").build();
    String content = this.chatClient.prompt(new Prompt(userMessage, hunyuanChatOptions))
            .call()
            .content();
    log.info("content: {}", content);
    return content;
}

//https://cloudcache.tencent-cloud.com/qcloud/ui/portal-set/build/About/images/bg-product-series_87d.png
@PostMapping("/chatWithPicUrl")
public String chatWithPicUrl(@RequestParam("url")  String url,@RequestParam("userInput")  String userInput) throws MalformedURLException {
    var imageData = new UrlResource(url);
    var userMessage = UserMessage.builder()
            .text(userInput)
            .media(List.of(Media.builder()
                    .mimeType(MimeTypeUtils.IMAGE_PNG)
                    .data(url)
                    .build()
            ))
            .build();
    var hunyuanChatOptions = HunYuanChatOptions.builder().model("hunyuan-t1-vision").build();
    String content = this.chatClient.prompt(new Prompt(userMessage, hunyuanChatOptions))
            .call()
            .content();
    log.info("content: {}", content);
    return content;
}

目前我們支持兩種方式來(lái)上傳圖片,一種是直接使用本地圖片,另一種是通過(guò)在線的 URL 圖片都可以。不過(guò)呢,這樣的話,我們需要先構(gòu)建一些用戶信息,不能再像以前那樣只傳個(gè)簡(jiǎn)單的文本就能搞定了。咱們先看看效果如何吧。

a110fd3f0f5b845ba8d379f0b673e577a110fd3f0f5b845ba8d379f0b673e577

本地文件我也放在了案例項(xiàng)目中,你可以直接查看,和這個(gè)url的圖片是一致的。

語(yǔ)音轉(zhuǎn)文本

具體的注意事項(xiàng)前面已經(jīng)說(shuō)了,我們這里直接使用即可。代碼如下:

//https://output.lemonfox.ai/wikipedia_ai.mp3
@PostMapping("/audio2textByUrl")
public String audio2textByUrl(@RequestParam("url")  String url) throws MalformedURLException {
    Resource resource = new UrlResource(url);
    String call = audioTranscriptionModel.call(resource);
    log.info("text: {}", call);
    return call;
}

@PostMapping("/audio2textByPath")
public String audio2textByPath(){
    Resource resource = new ClassPathResource("/speech/speech1.mp3");
    String call = audioTranscriptionModel.call(resource);
    log.info("text: {}", call);
    return call;
}

好的,這里有兩種方式可以選擇,一種是用本地文件,另一種是用在線 URL。官方推薦使用騰訊云 COS 來(lái)存儲(chǔ)音頻并生成 URL 后提交請(qǐng)求,這樣做有幾個(gè)好處:首先,它會(huì)走內(nèi)網(wǎng)來(lái)下載音頻,能顯著減少請(qǐng)求的延遲;其次,使用這種方式不會(huì)產(chǎn)生外網(wǎng)流量費(fèi)用,也能幫助節(jié)省成本。

當(dāng)然,最后還是看你個(gè)人的需求和實(shí)際情況啦。效果如圖所示:

2c8b0e2c553555fa85fe9c78d2e7b8372c8b0e2c553555fa85fe9c78d2e7b837

文本轉(zhuǎn)語(yǔ)音

這部分也是已經(jīng)集成完畢,直接一行代碼即可完成調(diào)用,所有配置變動(dòng)都可以寫(xiě)到配置中,代碼如下:

@PostMapping("/text2audio")
public byte[] text2audio(@RequestParam("userInput")  String userInput) throws MalformedURLException {
    byte[] call = textToVoiceModel.call(userInput);
    FileUtil.writeBytes(call, "D:/output.mp3");
    return call;
}

前端其實(shí)可以直接讀取音頻流,然后用一個(gè) <audio> 標(biāo)簽來(lái)播放。我這邊后臺(tái)是直接生成的 MP3 文件,主要是為了測(cè)試文件是否能正常播放。經(jīng)過(guò)測(cè)試,結(jié)果一切正常,播放效果也沒(méi)問(wèn)題。

小結(jié)

這次更新的 spring-ai-hunyuan 項(xiàng)目在功能上做了不少增強(qiáng),特別是在思考鏈、語(yǔ)音識(shí)別(ASR)和語(yǔ)音合成(TTS)方面。之前由于兼容性問(wèn)題,一些高級(jí)功能可能無(wú)法完全支持,而現(xiàn)在這些問(wèn)題已經(jīng)得到解決。新的版本 1.0.0.2 增加了這些功能,增強(qiáng)了項(xiàng)目的整體能力,特別是在與文本生成相關(guān)的場(chǎng)景中,用戶可以更加順暢地進(jìn)行開(kāi)發(fā)。

首先,項(xiàng)目源碼已經(jīng)開(kāi)源,大家可以直接從 GitHub 上查看,甚至根據(jù)提供的案例源碼快速上手。集成方面,也提供了簡(jiǎn)單易用的依賴配置和騰訊云秘鑰設(shè)置,幫助開(kāi)發(fā)者迅速搭建起開(kāi)發(fā)環(huán)境。

在實(shí)際功能上,這個(gè)版本加入了思考鏈、文本轉(zhuǎn)語(yǔ)音、語(yǔ)音轉(zhuǎn)文本等模塊,能夠讓開(kāi)發(fā)者更加方便地調(diào)用大模型進(jìn)行文本和語(yǔ)音的處理。對(duì)于語(yǔ)音識(shí)別和合成,使用騰訊云的接口能更好地處理音頻文件(如語(yǔ)音轉(zhuǎn)文字和文字轉(zhuǎn)語(yǔ)音)。另外,思考鏈功能的加入,更是讓模型能在生成回答的同時(shí),帶上思考過(guò)程,提升了交互的自然度。

具體到代碼實(shí)現(xiàn)上,項(xiàng)目的集成和配置都非常直觀,基本只需在 pom.xml 添加依賴、配置好秘鑰,并調(diào)整一些參數(shù)設(shè)置,就能實(shí)現(xiàn)各種功能。最基本的功能包括基于用戶輸入的聊天對(duì)話,支持流式和阻塞式問(wèn)答。而在結(jié)構(gòu)化對(duì)象的處理上,項(xiàng)目支持將聊天內(nèi)容轉(zhuǎn)換成 Java 對(duì)象格式返回,非常適合數(shù)據(jù)驅(qū)動(dòng)的應(yīng)用場(chǎng)景。

對(duì)于前端開(kāi)發(fā)者來(lái)說(shuō),流式問(wèn)答(SSE)可以非常方便地實(shí)現(xiàn)實(shí)時(shí)聊天功能,而思考鏈的集成則讓聊天更具智能化和邏輯性。雖然目前圖片生成還未完全對(duì)接,但語(yǔ)音轉(zhuǎn)文本和文本轉(zhuǎn)語(yǔ)音的功能已非常完善,提供了兩種方式(本地文件和 URL)來(lái)處理音頻數(shù)據(jù)。

責(zé)任編輯:武曉燕 來(lái)源: 靈墨AI探索室
相關(guān)推薦

2024-11-06 09:47:00

2025-03-18 14:17:57

騰訊AI3D

2025-05-08 02:10:00

SpringAIAPI

2024-06-21 11:44:17

2025-02-14 09:21:04

2025-06-30 09:04:00

2024-05-22 18:10:38

2025-08-14 18:23:20

AI視頻生成工具

2025-09-17 09:43:26

2023-09-06 18:25:32

2024-06-06 14:27:21

2024-05-30 16:28:38

2022-12-13 08:29:06

ChatGPT開(kāi)源項(xiàng)目

2025-06-11 02:13:00

ChromeAI多模態(tài)

2023-10-26 15:38:03

混元大模型騰訊

2009-10-22 15:27:16

EclipseNetBeansIntelliJ

2025-06-23 11:50:06

2017-04-27 17:50:40

諸葛io數(shù)據(jù)分析

2025-09-15 14:44:09

AI模型訓(xùn)練
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

中国男女全黄大片| 国产情侣第一页| 97超碰人人草| 一区在线免费观看| 国产一区二区三区欧美| 最新国产黄色网址| av资源在线播放| 国产女人aaa级久久久级 | 亚洲视频小说| www.久久精品.com| 快she精品国产999| 欧美肥婆姓交大片| 欧美 日韩 成人| 97品白浆高清久久久久久| 色婷婷综合久久久久中文一区二区 | 国产亚洲精品福利| 亚洲伊人第一页| 黄色片视频免费| 激情综合中文娱乐网| 最新亚洲国产精品| 欧美亚一区二区三区| 美女日韩一区| 欧美综合欧美视频| 国产a级片网站| 岛国成人毛片| 欧美激情综合五月色丁香| 好吊色欧美一区二区三区四区| 一区二区小视频| 亚洲永久免费精品| 欧美激情a在线| 精品亚洲乱码一区二区| 欧美日韩爱爱| 日韩精品在线免费播放| 美女流白浆视频| 未满十八勿进黄网站一区不卡| 欧美性xxxxhd| 男人用嘴添女人下身免费视频| 尤物在线网址| 亚洲欧美激情插| 中文字幕在线亚洲三区| a天堂中文在线| 久久精品人人爽人人爽| 麻豆91av| 日韩三级电影网| 99国产精品国产精品久久| 成人欧美一区二区三区在线观看| 一级日韩一级欧美| 捆绑紧缚一区二区三区视频| 国产精品成人av性教育| www.色国产| 久久国产日本精品| 日韩av片电影专区| 亚洲自拍一区在线观看| 久久精品人人| 国产成人精品av在线| 日韩综合在线观看| 日韩中文字幕区一区有砖一区 | 亚洲一区第一页| 丰满少妇在线观看资源站| 欧美精品中文字幕亚洲专区| 亚洲成成品网站| 久久久午夜精品福利内容| 爱爱精品视频| 亚洲第一av网站| 亚洲欧美日本一区| 九九亚洲精品| 中文字幕av一区二区| 91免费在线看片| 亚洲精品电影| 欧美精品国产精品日韩精品| 国产系列精品av| 欧美午夜精彩| 日韩精品在线观看视频| 欧美做受高潮6| 欧美呦呦网站| 美女黄色丝袜一区| 国产精品18p| 性欧美xxxx大乳国产app| 国产精品1234| 国产毛片一区二区三区va在线| 国产精品白丝jk黑袜喷水| 999精品视频一区二区三区| 婷婷在线观看视频| 欧美韩国日本不卡| 日本天堂免费a| 中文字幕色婷婷在线视频| 在线欧美日韩精品| 三日本三级少妇三级99| jizz性欧美23| 在线亚洲欧美视频| 玖玖爱免费视频| 久久国产成人| 91亚洲精品在线| 午夜激情小视频| 国产精品久久久久影院| www在线观看免费| 欧美一级网址| 精品嫩草影院久久| 欧美偷拍一区二区三区| 欧美日韩精品| 国产成人综合久久| 亚洲第一天堂在线观看| 国产视频不卡一区| 欧洲精品在线播放| av成人免费看| 亚洲激情视频网站| 波多野结衣久久久久| 亚洲一区视频| 91嫩草免费看| 日本在线免费网| 日韩欧美成人免费视频| 中文字幕永久免费| 久久国产成人精品| 欧美亚洲第一区| 国产丝袜视频在线观看| 国产日本欧洲亚洲| 欧美极品欧美精品欧美| 国产美女亚洲精品7777| 伊人久久久久久久久久久久久 | 看黄网站在线| 色婷婷精品久久二区二区蜜臀av| 不卡的一区二区| 色琪琪久久se色| 国产成人精品久久久| 成人毛片在线免费观看| 亚洲三级在线观看| 99视频在线视频| 亚洲三级网址| 欧美一区二区三区……| 亚洲伦理在线观看| 亚洲同性gay激情无套| 国产又大又黄又粗又爽| 日韩动漫一区| 97国产精品视频人人做人人爱| 国产suv一区二区| 国产精品对白交换视频| 特级丰满少妇一级| 精品国产一区二区三区四区| 69久久夜色精品国产69乱青草| www.精品久久| 亚洲综合成人网| 超级砰砰砰97免费观看最新一期| 国产精品99久久| 成人h猎奇视频网站| 日韩精品毛片| 欧美久久久一区| 日本免费网站视频| 美女网站色91| 伊人久久青草| а天堂中文最新一区二区三区| 深夜成人在线观看| 国产一区二区在线播放视频| 国产精品久久久99| www.桃色.com| 狠狠爱www人成狠狠爱综合网| 国产a一区二区| 国产精品69xx| 日韩电影第一页| 精品国产一区二区三区四| 久久无码av三级| 天天爽人人爽夜夜爽| 欧美电影免费观看高清| 91精品视频免费看| 日本色护士高潮视频在线观看| 日韩欧美一级二级| 伊人365影院| 91最新地址在线播放| 日日摸日日碰夜夜爽av| 精品国产中文字幕第一页 | 欧美 日韩 国产 高清| 日韩激情网站| 国产精品伦子伦免费视频| 电影av在线| 91精品国产综合久久精品| 久久一区二区三| 久久这里都是精品| 日日干夜夜操s8| 欧美日韩18| 久久五月天婷婷| 久久久国产精品网站| 久久99精品视频一区97| 天堂av资源网| 欧美色大人视频| 精品少妇一二三区| 久久久国产精品午夜一区ai换脸| 色一情一区二区三区| 欧美日韩免费观看一区=区三区| 久久riav二区三区| 欧美亚洲人成在线| 91国内在线视频| 午夜免费福利在线观看| 日韩精品最新网址| 亚洲成人第一网站| 一区二区在线看| 88久久精品无码一区二区毛片| 久久66热偷产精品| 日韩中文字幕三区| 婷婷另类小说| 日韩高清在线播放| 免费萌白酱国产一区二区三区| 国产精品美女午夜av| 国产黄色大片在线观看| 中文字幕一区二区精品| 四季av日韩精品一区| 91精品国产综合久久香蕉的特点| 日本一级一片免费视频| 亚洲视频资源在线| 欧美黄色一级生活片| 成人中文字幕在线| 色婷婷激情视频| 玖玖精品视频| 国产96在线 | 亚洲| 性欧美欧美巨大69| 日本一区视频在线播放| 国产无遮挡裸体免费久久| 成人黄色免费看| 欧美三区四区| 98精品国产自产在线观看| 国产黄色小视频在线| 国产一区二区三区四区福利| 天堂在线视频免费| 欧美一区二区三级| 国产精品久久久久久免费播放| 狠狠躁夜夜躁人人爽天天天天97| 久久久久久久久毛片| 国产精品久久久久久久岛一牛影视| 免费a在线观看播放| 成人精品免费视频| 亚洲欧美一区二区三区不卡| 免费高清不卡av| 欧美黑人又粗又大又爽免费| 国产精品亚洲综合色区韩国| 人妻夜夜添夜夜无码av | 欧美乱妇40p| 国产美女在线观看| 色婷婷av一区二区三区久久| 国产午夜精品一区理论片| 亚洲欧美日韩国产精品| 天天综合网在线| 亚洲激情电影中文字幕| 天堂av资源在线| 日韩精品久久久久久久玫瑰园| 亚洲国产日韩在线观看| 日韩无一区二区| www.97av| 亚洲白虎美女被爆操| 好吊视频一二三区| 亚洲精品在线观看网站| 日韩一级免费视频| 日韩黄在线观看| 青青久在线视频| 亚洲人av在线影院| 国产精品毛片一区二区三区四区| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | www.中文字幕久久久| 中文字幕欧美亚洲| 久草免费在线| 色综合色综合网色综合| 国产理论电影在线| 欧美专区国产专区| 成人福利片在线| 91美女高潮出水| 亚洲国产欧美在线观看| 懂色一区二区三区av片| 欧美人成在线观看ccc36| 欧美理论一区二区| 日韩欧美高清| av动漫在线免费观看| 国精品一区二区| 国产成人无码一二三区视频| 日韩av成人高清| 一级黄色大片儿| 不卡区在线中文字幕| 久操视频免费看| 中文字幕一区二区日韩精品绯色| 日本少妇高清视频| 午夜精品久久一牛影视| 波多野结衣大片| 91精品欧美福利在线观看 | 亚洲午夜久久久影院| 日韩专区在线| 国内精品久久久久伊人av| 日本免费久久| 亚洲a∨日韩av高清在线观看| 国产人妖ts一区二区| 亚洲国产欧洲综合997久久| 97精品一区| 免费看又黄又无码的网站| 日韩成人伦理电影在线观看| 999热精品视频| 久久久99精品久久| 国产性生活网站| 91久久精品网| 99久久精品国产一区色| 日韩大陆毛片av| 高清全集视频免费在线| 81精品国产乱码久久久久久| 亚洲男男av| 热re99久久精品国99热蜜月| 欧美日韩国产亚洲一区| 第四色婷婷基地| 91丨porny丨国产入口| a一级免费视频| 一本一本大道香蕉久在线精品 | 波多野结衣国产| 91精品中文字幕一区二区三区| 全部免费毛片在线播放网站| 久久精品99国产精品酒店日本| 亚洲精品mv| 国产v亚洲v天堂无码| 99久久九九| 久久久精品三级| 91麻豆精品一区二区三区| 极品久久久久久| 欧美日韩视频在线一区二区| 人人妻人人澡人人爽久久av| 久久久精品在线观看| 日韩网站中文字幕| 国内视频一区| 欧美日本在线| 亚洲视频在线不卡| 国产精品你懂的| 无码人妻精品一区二区三区不卡| 精品国产91亚洲一区二区三区婷婷 | 你懂的av在线| 成人免费视频caoporn| 91杏吧porn蝌蚪| 欧美精品乱码久久久久久| 黄网在线观看| 热久久99这里有精品| 欧美成人午夜77777| 久久这里只有精品18| 国产老妇另类xxxxx| 91高清免费看| 欧美精品一卡二卡| 免费a级毛片在线播放| 国产精品免费福利| 成人写真视频| 57pao国产成永久免费视频| 国产人成一区二区三区影院| 人人草在线观看| 亚洲小视频在线观看| 性欧美18一19sex性欧美| 久久婷婷开心| 西西人体一区二区| 欧美做受高潮6| 欧美自拍丝袜亚洲| 东热在线免费视频| 国产啪精品视频网站| 91日韩在线| 日本一二三区在线| 亚洲综合丝袜美腿| 人人妻人人澡人人爽久久av| 7777精品视频| 九一亚洲精品| 性欧美极品xxxx欧美一区二区| 日本一区二区三区在线观看| 日批视频免费观看| 日韩一区二区欧美| 麻豆一二三区精品蜜桃| 欧美 日韩 国产精品| 成人免费看的视频| 亚洲自拍一区在线观看| 中文字幕在线精品| 香蕉大人久久国产成人av| 青草青青在线视频| 2020国产精品| 亚洲一区在线观| 九九九热精品免费视频观看网站| 久久综合给合| 国产精品无码av在线播放| 国产日韩欧美不卡| 国产精品视频无码| 午夜免费日韩视频| 国产一区二区三区不卡视频网站| 性生活免费在线观看| 亚洲一区在线观看网站| 暖暖视频在线免费观看| 国产美女久久精品香蕉69| 欧美~级网站不卡| 好吊日免费视频| 欧美精品三级日韩久久| 2021中文字幕在线| 日韩精品极品视频在线观看免费| 久久99在线观看| 日韩av无码中文字幕| 永久免费看mv网站入口亚洲| 国产精品视频首页| 日批视频在线免费看| 亚洲欧美一区二区视频| 头脑特工队2在线播放| 国产日韩av在线| 亚洲黄页一区| 亚洲 欧美 国产 另类| 亚洲精品大尺度| 国产精品日本一区二区三区在线| 鲁一鲁一鲁一鲁一澡| 亚洲免费观看高清完整版在线观看熊 | 欧美性受黑人性爽| 久久精品亚洲精品国产欧美|