如何基于YoC播放器实时播放语音合成码流

简介: 如何基于YoC播放器实时播放语音合成码流

image.png

YoC播放器中支持的码流url类型有如下几种:

流类型 URL前缀 URL格式
http流 http(s):// http(s)://ip:port/xx.mp3
文件流 file:// file:///fatfs0/xx.mp3?avformat=%s&avcodec=%u&channel=%u&rate=%u
内存流 mem:// mem://addr=%u&size=%u&avformat=%u&avcodec=%u&channel=%u&rate=%u
fifo流 fifo:// fifo://tts/1?avformat=%s&avcodec=%u&channel=%u&rate=%u
由于fifo是基于生产者-消费者原理来实现的,我们可以基于fifo码流类型来实现实时语音合成码流播放。用户在创建fifo后,通过将fifo传递给播放器播放。与此同时可不断从网络上读取tts流,写入fifo中。

示例代码如下:
//核心代码片段
static player_t* g_player;
static nsfifo_t* g_tts_fifo;

static void _ptask(void *arg)
{

int fd;
int cnt = 0, rc, wlen;
char *val, *pos;
uint8_t reof = 0;
web_session_t *session;
/* 创建一个http会话 */
session = web_session_create();
/* 向指定地址发起http请求 */
rc = web_session_get(session, "http://www.srcbin.net/ai/result.mp3", 3);
if (rc) {
    LOGE(TAG, "web_session_get fail. rc = %d, code = %d, phrase = %s", rc, session->code, session->phrase);
    goto err;
}
/* 获取内容的长度 */
val = (char*)dict_get_val(&session->hdrs, "Content-Length");
CHECK_RET_TAG_WITH_GOTO(val != NULL, err);
fd = session->fd;
LOGD(TAG, "content len = %d", atoi(val));

for (;;) {
    /* 获取fifo的可写指针及长度 */
    wlen = nsfifo_get_wpos(g_tts_fifo, &pos, 8*1000);
    /* 获取播放器fifo读端是否退出(可能播放出错) */
    nsfifo_get_eof(g_tts_fifo, &reof, NULL);
    if (wlen <= 0 || reof) {
        LOGE(TAG, "get wpos err. wlen = %d, reof = %d", wlen, reof);
        break;
    }
    /* 从网络套接字中读取数据 */
    rc = sock_readn(fd, pos, wlen, 6*1000);
    if (rc <= 0) {
        LOGE(TAG, "readn err. rc = %d", rc);
        break;
    }
    /* 设置写指针 */
    nsfifo_set_wpos(g_tts_fifo, rc);
    cnt += rc;
}
LOGD(TAG, "rc = %8d, cnt = %8d", rc, cnt);

err:

/* 销毁web会话资源 */
web_session_destroy(session);
return;

}
/ 创建fifo,指定fifo地址和大小 /
g_tts_fifo = nsfifo_open("fifo://tts/1", O_CREAT, 64*1024);
if (g_tts_fifo) {

/* 创建 _ptask任务,用于通过网络获取码流数据 */
aos_task_new("xx_task", _ptask, NULL, 6*1024);
/* 设置播放器取流超时时间 */
player_ioctl(g_player, PLAYER_CMD_RCVTIMEO, AOS_WAIT_FOREVER);
/* 播放之前创建的fifo码流 */
player_play(g_player, "fifo://tts/1", 0);

}

相关文章
|
1月前
|
人工智能 安全 Linux
OpenClaw(小龙虾)从0到1部署手册:阿里云+本地全流程+千问/Coding Plan适配+避坑指南
2026年,开源AI Agent框架OpenClaw(曾用名Moltbot、Clawdbot,因Logo酷似小龙虾被网友亲切称为“小龙虾”)凭借“本地优先+主动执行”的核心特性,成为现象级工具。它打破了传统AI仅能“对话答疑”的局限,通过自主规划任务、调用工具、执行操作,实现“自然语言指令→AI规划→工具调用→任务落地”的全闭环,适配办公自动化、文件管理、多渠道协作等全场景需求。
464 1
|
3月前
|
人工智能 前端开发 API
AI 画图全家桶来了!这回想自己手绘图都难了
大家好,我是小富~发现超好用的开源AI绘图工具「AI Draw Nexus」:一站式支持Excalidraw(手绘风)、draw.io(架构图)、Mermaid(Markdown图表)三大风格,AI生成+手动微调,零成本本地部署或在线体验!
669 13
AI 画图全家桶来了!这回想自己手绘图都难了
|
3月前
|
人工智能 自然语言处理 供应链
AI Agent 职业路线全解析:从入门到精通的体系化进阶指南
随着“人工智能+”深入推进,AI智能体正从辅助工具升级为协作伙伴。2027年应用率将超70%,催生生成式AI测试员、智能体设计师等新岗。我国AI人才缺口超500万,人社部、教育部已将其纳入国家职业与教育体系。本文梳理四阶进阶路径(零代码构建→流程集成→全栈开发→行业落地),助力开发者构建“人机协同”核心竞争力。(239字)
502 1
|
9月前
|
Ubuntu 安全 搜索推荐
揭秘Ubuntu系统的优势,你想知道吗?
对于移动设备,Ubuntu系统还在不断地探索与支持。众多Ubuntu系统的社区和开发人员正在探索Ubuntu系统在移动领域的应用,以提供全新的、更加开放和稳定的移动系统体验。 对于云服务器,Ubuntu系统作为一种轻量级的操作系统,越来越受到云服务提供商的青睐。Ubuntu系统可以作为一种安全和高效的云服务器操作系统,无论在公有云、私有云或混合云里,都可以提供出色的性能和体验。
|
5月前
|
缓存 人工智能 开发者
大模型推理优化实战:从延迟到吞吐的工程权衡
在人工智能从“能用”迈向“好用”的关键阶段,大语言模型(LLM)的部署效率已成为产品落地的核心瓶颈。开发者常面临一个现实困境:模型在实验室跑得飞快,上线后却响应迟缓、成本飙升。本文将深入探讨大模型推理中的关键技术挑战与优化策略,帮助工程师在延迟(Latency)、吞吐量(Throughput)和成本之间找到最佳平衡点。
|
5月前
|
存储 Kubernetes 应用服务中间件
容器服务ACK入门:Kubernetes上云实践
本文介绍阿里云容器服务ACK(Kubernetes)上云实践,涵盖集群创建、工作负载部署、服务暴露、存储管理与监控运维。通过实战示例,帮助用户快速掌握ACK核心功能及微服务部署全流程。
827 0
|
5月前
|
缓存 前端开发 JavaScript
Spring Boot 中使用 Thymeleaf:从页面渲染到数据绑定
Thymeleaf是Spring Boot推荐的模板引擎,HTML即原型又可动态渲染,提升前后端协作效率。支持页面跳转、数据绑定、列表遍历、条件显示等常用功能,开发时关闭缓存可实时预览。静态页可直接浏览,后端注入数据无缝衔接,助力高效开发。
|
7月前
|
CDN
如何切换阿里云CDN的加速区域?
本文介绍如何通过阿里云CDN控制台切换加速区域,涵盖登录、域名管理、修改加速范围及注意事项,助企业轻松实现从中国大陆到全球的CDN加速调整,优化海外用户访问体验。
|
7月前
|
弹性计算 API 对象存储
怎么给阿里云CDN配置多个源站?
为阿里云CDN配置多源站可显著提升业务高可用性,成本极低且操作简单。本文详解添加主备源站步骤,并推荐在高可用需求、动静分离、系统迁移等场景下使用,保障业务稳定运行。

热门文章

最新文章