若该文为原创文章,转载请注明原文出处。

参考:【豆包大模型】-Python调用豆包大模型API及文本转语音TTS_豆包tts-CSDN博客

代码是基于下面地址修改测试的, 如需源码,留下邮箱

https://download.csdn.net/download/Jlinkneeder/89743078

一、环境安装

使用的是自己的电脑,没有GPU

1、环境创建

conda create -n tts_env python=3.11.3
conda activate tts_env

2、依赖安装

pip install pyttsx3 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install python-dotenv -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install volcengine-python-sdk -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install httpx -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pydantic -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install SpeechRecognition -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install PyAudio -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pipwin -i https://pypi.tuna.tsinghua.edu.cn/simple

其中安装有一个会出错,

如果报以下错误:

note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for volcengine-python-sdk
  Running setup.py clean for volcengine-python-sdk
Failed to build volcengine-python-sdk
ERROR: ERROR: Failed to build installable wheels for some pyproject.toml based projects (volcengine-python-sdk)


 是因为Windows 系统有最长路径限制,可能会导致安装失败,请按照以下方式设置:

1. 按下 Win+R ,输入 regedit 打开注册表编辑器。
2. 设置 \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem 路径下的变量 LongPathsEnabled 为 1 即可。
修改完注册表后再次运行pip命令即可成功安装volcengine-python-sdk。

二、大模型后台设置


1. 注册登录


进入火山引擎官网,注册并登录:

https://console.volcengine.com/auth/login?redirectURI=%2Fhome


2. 获取API访问密钥


进入火山引擎API访问密钥网页,获取API访问密钥:

https://console.volcengine.com/iam/keymanage/
具体流程如下:

此处获得的Access Key和Secret Access Key非常重要,后续需要配置到Python程序中。

3. 获取API Key


进入火山引擎API Key网页,获取API Key:

https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey
具体流程如下: 

即可获取到API Key。 

4. 获取model


进入火山引擎model获取网页,获取model:

https://console.volcengine.com/ark/region:ark+cn-beijing/endpoint?current=1&pageSize=10
具体流程如下:

模型选择Doubao-pro-32k,主线模型选择240515即可。

接入点名称下的这一串代码就是 ENDPOINT_ID,非常重要,后续需要填到Python程序中。

5. 开通模型


进入以下网站,开通模型:

https://console.volcengine.com/ark/region:ark+cn-beijing/openManagement


 开通Doubao-pro-4k的模型服务。

三、测试

功能是,录制一段音频,在转成文本,文本通过豆包大模型在输出。

1、TTS测试

import speech_recognition as sr
 
# 初始化识别器
r = sr.Recognizer()
 
# 使用默认麦克风作为音频来源
with sr.Microphone() as source:
    print("请说些什么吧...")
    audio = r.listen(source)
 
    try:
        # 使用Google Web Speech API进行识别
        print("Google Speech Recognition thinks you said:")
        text = r.recognize_google(audio, language='zh-CN') # 根据需要设置语言
        print(text)
    except sr.UnknownValueError:
        print("Google Speech Recognition could not understand audio")
    except sr.RequestError as e:
        print(f"Could not request results from Google Speech Recognition service; {e}")

2、模型测试

import os
import pyttsx3
from volcenginesdkarkruntime import Ark
import dotenv

# 加载环境变量
dotenv.load_dotenv(".env")

# 初始化 Ark 客户端
client = Ark()

# 初始化 pyttsx3 引擎
engine = pyttsx3.init()

# 配置 TTS 的语速和音量(可选)
engine.setProperty('rate', 150)  # 语速
engine.setProperty('volume', 1)  # 音量

# 从环境变量中获取模型 ID
model_id = os.getenv("ENDPOINT_ID")

# 欢迎语
Welcome_Text = "您好,我是豆包,您的大模型对话助手,请问有什么可以帮到您?(输入 'exit' 退出对话)"
print(Welcome_Text)
engine.say(Welcome_Text)
engine.runAndWait()  # 等待语音播放完毕

# 进入多轮对话的循环
while True:
    # 从终端获取用户输入
    user_input = input("User:\r\n")

    # 检查用户是否想退出
    if user_input.lower() in ["exit", "quit"]:
        print("AI:感谢您的使用,再见!")
        break

    # 创建流式对话请求
    stream = client.chat.completions.create(
        model=model_id,
        messages=[
            {"role": "system", "content": "你是豆包,是由字节跳动开发的 AI 人工智能助手"},
            {"role": "user", "content": user_input},  # 使用终端输入的内容
        ],
        stream=True
    )

    print("AI:")
    # 初始化一个空字符串来存储所有文本
    full_text = ""

    # 逐块读取流式输出并将结果打印
    for chunk in stream:
        if not chunk.choices:
            continue
        # 获取文本内容
        text = chunk.choices[0].delta.content

        # 输出文本到控制台
        print(text, end="")

        # 将文本累积到 full_text
        full_text += text

    # 当流式结果全部接收完成后,开始将累积的文本通过 TTS 朗读出来
    if full_text:
        engine.say(full_text)
        engine.runAndWait()  # 等待语音播放完毕

    print("\r\n")

代码里有个.env文件,需要把上面的参数修改成自己注册的API等参数

3、完整功能

import speech_recognition as sr
import pyttsx3

# 初始化语音识别器
r = sr.Recognizer()

# 初始化语音合成引擎
engine = pyttsx3.init()

# 进入多轮对话的循环
while True:
    # 使用麦克风获取用户语音输入
    with sr.Microphone() as source:
        print("请说些什么吧...")
        audio = r.listen(source)

        try:
            # 使用Google Web Speech API进行识别
            user_input = r.recognize_google(audio, language='zh-CN')  # 根据需要设置语言
            print(f"User:{user_input}\r\n")
        except sr.UnknownValueError:
            print("Google Speech Recognition could not understand audio")
            continue
        except sr.RequestError as e:
            print(f"Could not request results from Google Speech Recognition service; {e}")
            continue

    # 检查用户是否想退出
    if user_input.lower() in ["exit", "quit"]:
        print("AI:感谢您的使用,再见!")
        break

    # 创建流式对话请求
    stream = client.chat.completions.create(
        model=model_id,
        messages=[
            {"role": "system", "content": "你是豆包,是由字节跳动开发的 AI 人工智能助手"},
            {"role": "user", "content": user_input},  # 使用语音识别的内容
        ],
        stream=True
    )

    print("AI:")
    # 初始化一个空字符串来存储所有文本
    full_text = ""

    # 逐块读取流式输出并将结果打印
    for chunk in stream:
        if not chunk.choices:
            continue
        # 获取文本内容
        text = chunk.choices[0].delta.content

        # 输出文本到控制台
        print(text, end="")

        # 将文本累积到 full_text
        full_text += text

    # 当流式结果全部接收完成后,开始将累积的文本通过 TTS 朗读出来
    if full_text:
        engine.say(full_text)
        engine.runAndWait()  # 等待语音播放完毕

    print("\r\n")

功能基本正常。

四、使用C++测试

有打算部署到 RK3568,所以使用curl测试

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>

// 回调函数,用于处理服务器返回的数据
size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {
    ((char *)userp)[size * nmemb] = '\0'; // 确保字符串以null结尾
    printf("%s", (char *)contents);
    return size * nmemb;
}

int main(void) {
    CURL *curl;
    CURLcode res;
    char postData[1024];
    char response[4096];
    const char *apiKey = "67b818e6-5f1f-40ca-bd67-b1ef5404934d"; // 替换为你的API密钥
    char userInput[256];

    // 初始化libcurl
    curl_global_init(CURL_GLOBAL_ALL);
    curl = curl_easy_init();
    if(curl) {
        // 设置URL
        curl_easy_setopt(curl, CURLOPT_URL, "https://ark.cn-beijing.volces.com/api/v3/chat/completions");

        // 设置HTTP头
        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Content-Type: application/json");
        char authHeader[256];
        snprintf(authHeader, sizeof(authHeader), "Authorization: Bearer %s", apiKey);
        headers = curl_slist_append(headers, authHeader);
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

        // 获取用户输入
        printf("请输入你的问题: ");
        if (fgets(userInput, sizeof(userInput), stdin) != NULL) {
            // 去掉换行符
            userInput[strcspn(userInput, "\n")] = '\0';
        } else {
            fprintf(stderr, "读取输入失败\n");
            curl_slist_free_all(headers);
            curl_easy_cleanup(curl);
            curl_global_cleanup();
            return 1;
        }

        // 设置POST数据
        snprintf(postData, sizeof(postData), "{\"model\": \"ep-20250214134145-g6lj5\", \"messages\": [{\"role\": \"system\", \"content\": \"你是豆包,是由字节跳动开发的 AI 人工智能助手.\"}, {\"role\": \"user\", \"content\": \"%s\"}]}", userInput);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

        // 设置回调函数和用户数据
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)response);

        // 执行请求
        res = curl_easy_perform(curl);
        if(res != CURLE_OK) {
            fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
        } else {
            printf("Response: %s\n", response);
        }

        // 清理
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    }
    curl_global_cleanup();
    return 0;
}

测试结果,响应很慢,有点不符合预期,响应好几秒,在通过TTS播放,那对话的体验效果不理想。

如有侵权,或需要完整代码,请及时联系博主。

Logo

在这里,我们一起交流AI,学习AI,用AI改变世界。如有AI产品需求,可访问讯飞开放平台,www.xfyun.cn。

更多推荐