webassembly003 TTS BARK.CPP-02-bark_tokenize_input(ctx, text);

bark_tokenize_input函数

  • bark是没有语言控制选项的,但是官方的版本无法运行中文
  • bark_tokenize_input会调用bert_tokenize函数,bark_tokenize_input函数对中文分词失效,也就是导致不支持中文的原因。

在这里插入图片描述

void bark_tokenize_input(struct bark_context * ctx, const char * text) {auto & model = ctx->model.text_model;bark_vocab * vocab = &ctx->model.vocab;int32_t block_size = model.hparams.block_size;int32_t max_ctx_size = std::min(block_size, 256);int32_t n_tokens;bark_sequence tokens(max_ctx_size);bert_tokenize(vocab, text, tokens.data(), &n_tokens, max_ctx_size);for (int i = 0; i < (int) tokens.size(); i++)tokens[i] += TEXT_ENCODING_OFFSET;if (n_tokens < max_ctx_size) {for (int i = n_tokens; i < max_ctx_size; i++)tokens[i] = TEXT_PAD_TOKEN;} else if (n_tokens > max_ctx_size) {fprintf(stderr, "%s: input sequence is too long (%d > 256), truncating sequence", __func__, n_tokens);}tokens.resize(max_ctx_size);// semantic historyfor (int i = 0; i < 256; i++)tokens.push_back(SEMANTIC_PAD_TOKEN);tokens.push_back(SEMANTIC_INFER_TOKEN);assert(tokens.size() == 256 + 256 + 1);ctx->tokens = tokens;printf("%s: prompt: '%s'\n", __func__, text);printf("%s: number of tokens in prompt = %zu, first 8 tokens: ", __func__, ctx->tokens.size());for (int i = 0; i < std::min(8, (int) ctx->tokens.size()); i++) {printf("%d ", ctx->tokens[i]);}printf("\n");
}

单词表对象

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 对象创建自vocab.txt
    在这里插入图片描述
    在这里插入图片描述

上一步完成后还会进行wordpiece处理

// apply wordpiece
for (const auto &word : words) {// 如果单词长度为0,跳过if (word.size() == 0)continue;std::string prefix = "";  // 初始化前缀为空字符串int i = 0;                // 初始化索引 i 为0int n = word.size();      // 获取单词长度loop:while (i < n) {// 如果 tokens 数组中的元素达到了最大允许值,跳出循环if (t >= n_max_tokens - 1)break;int j = n;  // 初始化 j 为单词长度while (j > i) {// 尝试找到前缀加上从 i 到 j 的子串在 token_map 中的映射auto it = token_map->find(prefix + word.substr(i, j - i));if (it != token_map->end()) {// 找到映射,将映射的值添加到 tokens 数组中tokens[t++] = it->second;i = j;  // 更新索引 iprefix = "##";  // 更新前缀为 "##"goto loop;  // 跳转到 loop 标签处}--j;  // 递减 j}// 如果 j 等于 i,说明无法找到合适的子串if (j == i) {fprintf(stderr, "%s: unknown token '%s'\n", __func__, word.substr(i, 1).data());prefix = "##";  // 更新前缀为 "##"++i;  // 更新索引 i}}}
}

bert_tokenize函数

  • bert_tokenize函数会将句子tockenlize到ctx中的tokens对象。

在这里插入图片描述

  • 代码实现如下
void bert_tokenize(const bark_vocab * vocab,const char * text,int32_t * tokens,int32_t * n_tokens,int32_t   n_max_tokens) {std::string str = text;std::vector<std::string> words;int32_t t = 0;auto * token_map = &vocab->token_to_id;// split the text into words{str = strip_accents(text);std::string pat = R"([[:punct:]]|[[:alpha:]]+|[[:digit:]]+)";std::regex re(pat);std::smatch m;while (std::regex_search(str, m, re)) {for (std::string x : m)words.push_back(x);str = m.suffix();}}// apply wordpiecefor (const auto &word : words) {if (word.size() == 0)continue;std::string prefix = "";int i = 0;int n = word.size();loop:while (i < n) {if (t >= n_max_tokens - 1)break;int j = n;while (j > i) {auto it = token_map->find(prefix + word.substr(i, j - i));if (it != token_map->end()) {tokens[t++] = it->second;i = j;prefix = "##";goto loop;}--j;}if (j == i) {fprintf(stderr, "%s: unknown token '%s'\n", __func__, word.substr(i, 1).data());prefix = "##";++i;}}}*n_tokens = t;
}

将文本分割成单词

  • 将文本分割成单词的部分使用了如下的正则表达式,其无法支持中文句子的分割,这也导致了无法正确推理运行。
    在这里插入图片描述
	// split the text into words 将文本分割成单词{// 对文本进行去重音符处理str = strip_accents(text);// 定义正则表达式模式,匹配标点符号、字母和数字std::string pat = R"([[:punct:]]|[[:alpha:]]+|[[:digit:]]+)";// 创建正则表达式对象std::regex re(pat);std::smatch m;// 使用正则表达式匹配文本中的单词while (std::regex_search(str, m, re)) {// 将匹配到的单词添加到单词列表for (std::string x : m)words.push_back(x);// 更新文本,排除已匹配的部分str = m.suffix();}}

在这里插入图片描述
在这里插入图片描述

简单修改与运行

// examples/main.cpp
struct bark_params {int32_t n_threads = std::min(4, (int32_t) std::thread::hardware_concurrency());// user promptstd::string prompt = "你 好"; // "this is an audio";//std::string prompt = "this is an audio"; // "this is an audio";// pathsstd::string model_path = "./bark.cpp/ggml_weights";std::string dest_wav_path = "output.wav";int32_t seed = 0;
};
// bark.cpp// split the text into words{str = strip_accents(text);//        std::string pat = R"([[:punct:]]|[[:alpha:]]+|[[:digit:]]+)";
//
//        std::regex re(pat);
//        std::smatch m;
//
//        while (std::regex_search(str, m, re)) {
//            for (std::string x : m)
//                words.push_back(x);
//            str = m.suffix();
//        }// 用空格分割字符串std::istringstream iss(str);std::vector<std::string> words;// 从输入流中读取每个分词并添加到 vector 中do {std::string word;iss >> word;words.push_back(word);} while (iss);// 输出分词结果std::cout << "分词结果:" << std::endl;for (const auto& word : words) {std::cout << word << std::endl;}}
  • ps:这样就能成功运行了,但是,不知道为什么中文推理用的内存比英文多,还有这个分不能通过手动空格实现(即使空格也无法运行,因为许多词没在词表中,还需要参考一下bert的分词过程。)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/657391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IP 层转发分组的过程

目录 IP 层转发分组的过程 1.1 基于终点的转发 1.2 最长前缀匹配 转发表中的 2 种特殊的路由 主机路由 (host route) 默认路由 (default route) 路由器分组转发算法 1.3 使用二叉线索查找转发表 IP 层转发分组的过程 1.1 基于终点的转发 分组在互联网中是逐跳转发的。…

Walrus 实用教程|Walrus + Gitlab,打通CI/CD 自动化交付!

Walrus file 是 Walrus 0.5 版本推出的新功能&#xff0c;用户可以通过一个非常简洁的 YAML 描述应用或基础设施资源的部署配置&#xff0c;然后通过 Walrus CLI 执行 walrus apply或在 Walrus UI 上进行import&#xff0c;将 Walrus file 提交给 Walrus server&#xff0c;由 …

AP5191 DC-DC宽电压LED降压恒流驱动器 摩托电动汽车驱动芯片

产品描述 AP5191是一款PWM工作模式,高效率、外围简 单、内置功率MOS管&#xff0c;适用于4.5-150V输入的高 精度降压LED恒流驱动芯片。输出功率150W&#xff0c; 电流6A。AP5191可实现线性调光和PWM调光&#xff0c;线性调 光脚有效电压范围0.55-2.6V. AP5191 工作频率可以通过…

visual studio2022专业版安装步骤

目录 一、Visual studio下载二、创建C#项目——Hello World三、专业版秘钥激活 一、Visual studio下载 首先进入下载官网 先下载2022专业版&#xff0c;等等后面还需要选环境 我勾选了以下几个和c#开发有关的&#xff0c;后面缺什么还可以再安装所有以少勾了问题也不大 然后…

c学习:sqlite3数据库操作

目录 获取sqlite3源码 c调用步骤 常用接口函数说明 例子 打开数据库&#xff0c;新建表&#xff0c;插入数据&#xff0c;查询数据&#xff0c;关闭数据库 查询数据需要在回调函数中获取 获取sqlite3源码 先下载c的sqlite3源码&#xff0c;https://www.sqlite.org/inde…

植物病害检测YOLOV8,OPENCV调用

【免费】植物病害检测&#xff0c;10种类型&#xff0c;YOLOV8训练&#xff0c;转换成ONNX&#xff0c;OPENCV调用资源-CSDN文库 植物病害检测&#xff0c;YOLOV8NANO&#xff0c;训练得到PT模型&#xff0c;然后转换成ONNX&#xff0c;OPENCV的DNN调用&#xff0c;支持C,PYTH…

《Numpy 简易速速上手小册》第5章:Numpy高效计算与广播(2024 最新版)

文章目录 5.1 向量化计算5.1.1 基础知识5.1.2 完整案例&#xff1a;股票数据分析5.1.3 拓展案例 1&#xff1a;多维数组运算5.1.4 拓展案例 2&#xff1a;复杂函数的向量化应用 5.2 广播机制5.2.1 基础知识5.2.2 完整案例&#xff1a;二维数据与一维数据运算5.2.3 拓展案例 1&a…

vxe-table表格合并行和虚拟滚动冲突

项目一直用的vxe-table 2.0版本&#xff0c;支持表格的虚拟滚动&#xff0c;最近要做表格合并行功能&#xff0c;虚拟滚动便失效了&#xff0c;强行虚拟滚动&#xff0c;合并行会有错行现象。 vxe-table2.0给出的解释是&#xff1a;合并行不能和虚拟滚动一起使用。 目前找到两种…

华为VRP系统简介

因为现在国内主流是华为、华三、锐捷的设备趋势&#xff0c;然后考的证书也是相关的&#xff0c;对于华为设备的一个了解也是需要的。 一、VRP概述 华为的VRP(通用路由平台)是华为公司数据通信产品的通用操作系统平台&#xff0c;作为华为公司从低端到核心的全系列路由器、以太…

个人建站前端篇(一)项目准备初始化以及远程仓库连接

云风的知识库 云风网前端重构&#xff0c;采用vue3.0vite antd框架&#xff0c;实现前后端分离&#xff0c;实现网站的SEO优化&#xff0c;实现网站的性能优化 vite创建vue项目以及前期准备 Vite 需要 Node.js 版本 18&#xff0c;20。然而&#xff0c;有些模板需要依赖更高…

java生成dll,并利用c语言使用libcurl调用http接口

本文可能需要使用的环境和工具&#xff1a; c/ c和GCC编译器 (Windows) Cygwin或MinGW 本文运行环境为windows10&#xff0c;使用MinGW-W64-builds-4.2.0 curl-8.5.0 libcurl 可以在官网 http://curl.haxx.se/ 获得。 配置MinGW 将mingw.rar解压到D:&#xff0c;修改系统…

Java面试题之 IO(四)

Java面试题之 IO&#xff08;四&#xff09; 文章目录 Java面试题之 IO&#xff08;四&#xff09;随机访问流 文章来自Java Guide 用于学习如有侵权&#xff0c;立即删除 随机访问流 这里要介绍的随机访问流指的是支持随意跳转到文件的任意位置进行读写的 RandomAccessFile 。…

防火墙综合拓扑(NAT、双机热备)

实验需求 拓扑 实验注意点&#xff1a; 先配置双机热备&#xff0c;再来配置安全策略和NAT两台双机热备的防火墙的接口号必须一致如果其中一台防火墙有过配置&#xff0c;最好清空或重启&#xff0c;不然配置会同步失败两台防火墙同步完成后&#xff0c;可以直接在主状态防火墙…

浅谈WPF之UniformGrid和ItemsControl

在日常开发中&#xff0c;有些布局非常具有规律性&#xff0c;比如相同的列宽&#xff0c;行高&#xff0c;均匀的排列等&#xff0c;为了简化开发&#xff0c;WPF提供了UniformGrid布局和ItemsControl容器&#xff0c;本文以一个简单的小例子&#xff0c;简述&#xff0c;如何…

TSINGSEE青犀智能分析网关V4—让加油站迈入AI智能检测时代

一、背景与需求 中国目前建设加油站超过10万个&#xff0c;作为高危场所对于烟火&#xff0c;危险区域管控、消防器材等管理要求严格&#xff0c;稍有不慎即酿成大祸。由于春节临近&#xff0c;加油站各类人员进出频繁&#xff0c;安全意识较低&#xff0c;依靠普通监控人力的…

java常量和kotlin常量

在java中使用final声明常量在kotlin中使用const val声明常量 常量在编译为字节码后会直接把调用常量的地方直接替换为常量值&#xff0c;示例如下&#xff1a; public class ConstDemo {public static final String NAME "Even";private static final int ID 100…

海外云手机开辟企业跨境电商新道路

近几年&#xff0c;海外云手机为跨境电商、海外媒体引流、游戏行业等互联网领域注入了蓬勃活力。对于国内跨境电商而言&#xff0c;在亚马逊及其他平台上&#xff0c;短视频引流和社交电商营销成为最为有效的流量来源。如何通过海外云手机的助力&#xff0c;在新兴社交平台为企…

python二维高斯热力图绘制简单的思路代码

import numpy as np import matplotlib.pyplot as plt from scipy.ndimage import gaussian_filter import cv2# 生成一个示例图像 image_size 100 image np.zeros((image_size, image_size))# 在图像中心创建一个高亮区域 center_x, center_y image_size // 2, image_size …

【遥感专题系列】遥感影像信息提取之——人工目视解译

​遥感影像通过亮度值或像元值的高低差异&#xff08;反映地物的光谱信息&#xff09;及空间变化&#xff08;反映地物的空间信息&#xff09;来表示不同地物的差异&#xff0c;这是区分不同影像地物的物理基础。 ​人工解译是目前国内使用最多的一种影像提取方法&#xff0c;如…

力扣hot100 单词搜索 深度优先搜索 特殊字符判重

Problem: 79. 单词搜索 Code class Solution{int n, m;char[][] b;String word;int[] dx { 1, 0, -1, 0 };int[] dy { 0, 1, 0, -1 };public boolean exist(char[][] board, String word){b board;this.word word;n b.length;m b[0].length; // 以所有点作为起点来进行…