若该文为原创文章,转载请注明原文出处。
参考:【豆包大模型】-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播放,那对话的体验效果不理想。
如有侵权,或需要完整代码,请及时联系博主。