FunASR
FunASR copied to clipboard
Onnx 添加 windows 支持
目前的代码(master head)onnx 在 windows 下无法编译(Onnx runtime 1.15.1),希望支持一下,自己通过修改代码解决了一下,因为处理的比较乱,没好意思提交 PR:
支持 windows 修改:
1. Onnx session 构造函数签名宽字符问题.
例如:
std::make_unique<Ort::Session>(env_, punc_model.c_str(), session_options);
修改一下:
auto path = StrToWstr(punc_model);
m_session = std::make_unique<Ort::Session>(env_, path.c_str(), session_options);
2. OfflineStream 头文件 Windows 兼容, 主要是 access 函数。
头部加入:
#ifdef WIN32
#include <io.h>
#define F_OK 0
#else
#include <unistd.h>
#endif
3. win_func.h 缺失,自己补一个文件.
#include <time.h>
#ifdef WIN32
#include <windows.h>
#else
#include <sys/time.h>
#endif
#ifdef WIN32
int gettimeofday(struct timeval* tp, void* tzp)
{
time_t clock;
struct tm tm;
SYSTEMTIME wtm;
GetLocalTime(&wtm);
tm.tm_year = wtm.wYear - 1900;
tm.tm_mon = wtm.wMonth - 1;
tm.tm_mday = wtm.wDay;
tm.tm_hour = wtm.wHour;
tm.tm_min = wtm.wMinute;
tm.tm_sec = wtm.wSecond;
tm.tm_isdst = -1;
clock = mktime(&tm);
tp->tv_sec = clock;
tp->tv_usec = wtm.wMilliseconds * 1000;
return (0);
}
#endif
4. commonfunc.h 的 include 写在代码中,导致 namespace 错误
include codecvt 移动到头部就好
#ifdef _WIN32
#include <codecvt>
#endif // _WIN32
5. yaml-cpp 的 convert.h 似乎不兼容windows, 这里要修改源代码,似乎 string 复制构造函数的问题。
因为在宏里,不好调试,没仔细研究,因为用到的地方不多,就直接修改一下了,主要是 YAML_DEFINE_CONVERT_STREAMABLE 这个宏定义。
const std::string& input = node.Scalar();
不使用引用即可:
const std::string input = node.Scalar();
另外目前不支持编译 static 库,要支持也很简单
static 编译支持:
好好做也是要配合 cmake 做一些编译选项,我自己用所以直接修改了
1. onnnxruntime 下的 cmake 加一行:
set(BUILD_SHARED_LIBS OFF)
2. src 里的 CMAKE 改一下:
add_library(funasr STATIC ${files})
3. funasrruntime.h 目前不支持静态编译,要好好做要配合 cmake 做一些定义和判断,我就编译完了手动修改一下了:
#ifdef WIN32
#ifdef _FUNASR_API_EXPORT
#define _FUNASRAPI __declspec(dllexport)
#else
#define _FUNASRAPI __declspec(dllimport)
#endif
#else
#define _FUNASRAPI
#endif
用静态库时直接改成
#define _FUNASRAPI
This all, 希望官方支持一下 windows 和静态库编译
顺便提供一个编译好的 windows onnx runtime 静态库 (请自行下载 onnx runtime 1.15.1 动态库),方便后来的同学使用~
PS:刚处理好编译问题,还没来得及测试
https://github.com/k2-fsa/sherpa-onnx 支持 64-bit 和 32-bit Windows; 同时,它既支持动态链接,又支持静态链接(完全静态链接,包括 onnxruntime 也是静态链接)。
如果感兴趣,可以参考下.
@csukuangfj K2那个乱码的问题我觉得真的是K2的问题,如果要调试源码那就要自己维护分支了,所以我改用FUNASR了,目前一切正常
https://github.com/k2-fsa/sherpa-ncnn/issues/236
你说的是这个 issue 吗?
如果要调试源码那就要自己维护分支了
不需要呀。主要是我们没碰到你出现的问题。我们这边全是正常的. 如果你发现是什么问题,我们可以改,不需要你维护的.
下面链接有一个编译好的 exe, 你可以在你电脑上测测的,没有乱码. (你提的那个 issue 是在 sherpa-ncnn 里,这个截图是 sherpa-onnx) https://github.com/k2-fsa/sherpa-onnx/releases
@csukuangfj 那回头我再调试一下,另外标点恢复真的很需要,是不是考虑训练一个,转到FunASE一部分原因它自带了标点恢复模型。
标点模型是外接的。
目前的代码(master head)onnx 在 windows 下无法编译(Onnx runtime 1.15.1),希望支持一下,自己通过修改代码解决了一下,因为处理的比较乱,没好意思提交 PR:
支持 windows 修改:
1. Onnx session 构造函数签名宽字符问题.
例如:
std::make_unique<Ort::Session>(env_, punc_model.c_str(), session_options);修改一下:
auto path = StrToWstr(punc_model); m_session = std::make_unique<Ort::Session>(env_, path.c_str(), session_options);2. OfflineStream 头文件 Windows 兼容, 主要是
access函数。头部加入:
#ifdef WIN32 #include <io.h> #define F_OK 0 #else #include <unistd.h> #endif3. win_func.h 缺失,自己补一个文件.
#include <time.h> #ifdef WIN32 #include <windows.h> #else #include <sys/time.h> #endif #ifdef WIN32 int gettimeofday(struct timeval* tp, void* tzp) { time_t clock; struct tm tm; SYSTEMTIME wtm; GetLocalTime(&wtm); tm.tm_year = wtm.wYear - 1900; tm.tm_mon = wtm.wMonth - 1; tm.tm_mday = wtm.wDay; tm.tm_hour = wtm.wHour; tm.tm_min = wtm.wMinute; tm.tm_sec = wtm.wSecond; tm.tm_isdst = -1; clock = mktime(&tm); tp->tv_sec = clock; tp->tv_usec = wtm.wMilliseconds * 1000; return (0); } #endif4. commonfunc.h 的 include 写在代码中,导致 namespace 错误
include codecvt移动到头部就好#ifdef _WIN32 #include <codecvt> #endif // _WIN325. yaml-cpp 的 convert.h 似乎不兼容windows, 这里要修改源代码,似乎 string 复制构造函数的问题。
因为在宏里,不好调试,没仔细研究,因为用到的地方不多,就直接修改一下了,主要是
YAML_DEFINE_CONVERT_STREAMABLE这个宏定义。const std::string& input = node.Scalar();不使用引用即可:
const std::string input = node.Scalar();另外目前不支持编译 static 库,要支持也很简单
static 编译支持:
好好做也是要配合 cmake 做一些编译选项,我自己用所以直接修改了
1. onnnxruntime 下的 cmake 加一行:
set(BUILD_SHARED_LIBS OFF)2. src 里的 CMAKE 改一下:
add_library(funasr STATIC ${files})3. funasrruntime.h 目前不支持静态编译,要好好做要配合 cmake 做一些定义和判断,我就编译完了手动修改一下了:
#ifdef WIN32 #ifdef _FUNASR_API_EXPORT #define _FUNASRAPI __declspec(dllexport) #else #define _FUNASRAPI __declspec(dllimport) #endif #else #define _FUNASRAPI #endif用静态库时直接改成
#define _FUNASRAPIThis all, 希望官方支持一下 windows 和静态库编译
Thank you for you advice. If it is convenient for you, A PR is appreciatived.
@csukuangfj 那回头我再调试一下,另外标点恢复真的很需要,是不是考虑训练一个,转到FunASE一部分原因它自带了标点恢复模型。
还有,你要分清楚 sherpa-ncnn 和 sherpa-onnx 的区别。你提的issue 是 sherpa-ncnn 里的,我上面说的是 sherpa-onnx.
标点模型和识别模型,是可以分开的,没有绑定在一起。
@csukuangfj 我其实就是用在游戏引擎里,我觉得 NCNN 之类的手机端效率更高,我知道 onnx 和 ncnn 的区别,我是用你们的 ncnn 版本出现问题就没尝试 onnx 版本了,标点模型似乎 K2 官方没有提供,开发者自己去提取其他方案的当然可以,但是我建议自带一个,这东西 FunASR有, Paddle 也有,用 K2 就要自己找一个,然后要配合 VAD 附加标点,那多多少少开发量又有一些了,FunASR 了的 OnnxRuntime 只要指定模型路径,都不用自己操心了,真的开箱即用,拿到的输出就有标点(标点效果一般,但普通业务足够用),这其实大大的减少了用户的开发量,当然了,只是个人建议~
点赞~~提交下pr吧
https://github.com/k2-fsa/sherpa-onnx 支持 64-bit 和 32-bit Windows; 同时,它既支持动态链接,又支持静态链接(完全静态链接,包括 onnxruntime 也是静态链接)。
如果感兴趣,可以参考下.
你这里是不是年久失修了啊。。我跟着文档,用windows安装就是一直失败: cmake -DCMAKE_BUILD_TYPE=Release -DSHERPA_ONNX_ENABLE_GPU=ON .. cmake --build . --config Release LINK : fatal error LNK1181: 无法打开输入文件“onnxruntime_providers_cuda.lib” [D:\repos\pyplayground\sherpa-onnx\build\c-api-examples\decode-file-c-api.vcxproj]
你这里是不是年久失修了啊。。我跟着文档,用windows安装就是一直失败:
请贴完整的 error log.
sherpa-onnx 有 CI tests. GitHub actions 是完全正常的.
https://github.com/k2-fsa/sherpa-onnx/actions/workflows/windows-x64.yaml
你这里是不是年久失修了啊。。我跟着文档,用windows安装就是一直失败:
请贴完整的 error log.
sherpa-onnx 有 CI tests. GitHub actions 是完全正常的.
https://github.com/k2-fsa/sherpa-onnx/actions/workflows/windows-x64.yaml
我还看了下action,里面只跑了CPU only,我CPU也是通的
这个是 windows cuda CI, 刚加的,完全没问题。
https://github.com/k2-fsa/sherpa-onnx/actions/runs/5652678141/job/15312677007
你是不是先跑的 cpu build, 然后你没有删掉 build 文件夹,直接就跑 cuda build 了?是的话,请先删掉 build 文件夹,然后重试。 (如果是的话,那这个是你自己使用 cmake 的问题。 cmake 有 cache. )
你是不是先跑的 cpu build, 然后你没有删掉 build 文件夹,直接就跑 cuda build 了?是的话,请先删掉 build 文件夹,然后重试。 (如果是的话,那这个是你自己使用 cmake 的问题。 cmake 有 cache. )
有删掉重试的, cuda toolkit 11.7, 我怀疑cmake版本是不是还有依赖?我装了最新的
编译的时候,不需要 cudatoolkit, 只有运行的时候,才需要有 cudatoolkit.
pip install cmake
可以安装最新的 cmake.
方便的话,可否贴完整的 log ? (请先删掉 build 目录,然后跑一遍,然后贴 log)
编译的时候,不需要 cudatoolkit, 只有运行的时候,才需要有 cudatoolkit.
pip install cmake可以安装最新的 cmake.
方便的话,可否贴完整的 log ? (请先删掉 build 目录,然后跑一遍,然后贴 log)
log有点长,方便加v信发你么
编译的时候,不需要 cudatoolkit, 只有运行的时候,才需要有 cudatoolkit.
pip install cmake可以安装最新的 cmake. 方便的话,可否贴完整的 log ? (请先删掉 build 目录,然后跑一遍,然后贴 log)
log有点长,方便加v信发你么
please see https://github.com/k2-fsa/sherpa/pull/445
顺便提供一个编译好的 windows onnx runtime 静态库 (请自行下载 onnx runtime 1.15.1 动态库),方便后来的同学使用~
PS:刚处理好编译问题,还没来得及测试
请问,模型在哪里?
老哥可以帮忙搞一下websocket的runtime吗
The FunASR community software package for Windows has been adapted and now supports both offline file transcription and real-time dictation). We welcome everyone to try it out and provide feedback.
Software package download link: downlaod
Instructions on how to use it can be found at: docs
Cool !