FunASR icon indicating copy to clipboard operation
FunASR copied to clipboard

Onnx 添加 windows 支持

Open endink opened this issue 2 years ago • 23 comments

目前的代码(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 和静态库编译

endink avatar Jul 11 '23 02:07 endink

顺便提供一个编译好的 windows onnx runtime 静态库 (请自行下载 onnx runtime 1.15.1 动态库),方便后来的同学使用~

PS:刚处理好编译问题,还没来得及测试

funasr_winx64_static_md.zip

endink avatar Jul 11 '23 02:07 endink

https://github.com/k2-fsa/sherpa-onnx 支持 64-bit 和 32-bit Windows; 同时,它既支持动态链接,又支持静态链接(完全静态链接,包括 onnxruntime 也是静态链接)。

如果感兴趣,可以参考下.

csukuangfj avatar Jul 13 '23 10:07 csukuangfj

@csukuangfj K2那个乱码的问题我觉得真的是K2的问题,如果要调试源码那就要自己维护分支了,所以我改用FUNASR了,目前一切正常

endink avatar Jul 13 '23 10:07 endink

https://github.com/k2-fsa/sherpa-ncnn/issues/236

你说的是这个 issue 吗?


如果要调试源码那就要自己维护分支了

不需要呀。主要是我们没碰到你出现的问题。我们这边全是正常的. 如果你发现是什么问题,我们可以改,不需要你维护的.

Screenshot 2023-07-13 at 16 01 14

下面链接有一个编译好的 exe, 你可以在你电脑上测测的,没有乱码. (你提的那个 issue 是在 sherpa-ncnn 里,这个截图是 sherpa-onnx) https://github.com/k2-fsa/sherpa-onnx/releases

csukuangfj avatar Jul 13 '23 10:07 csukuangfj

@csukuangfj 那回头我再调试一下,另外标点恢复真的很需要,是不是考虑训练一个,转到FunASE一部分原因它自带了标点恢复模型。

endink avatar Jul 13 '23 10:07 endink

标点模型是外接的。

csukuangfj avatar Jul 13 '23 10:07 csukuangfj

目前的代码(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 和静态库编译

Thank you for you advice. If it is convenient for you, A PR is appreciatived.

LauraGPT avatar Jul 13 '23 10:07 LauraGPT

@csukuangfj 那回头我再调试一下,另外标点恢复真的很需要,是不是考虑训练一个,转到FunASE一部分原因它自带了标点恢复模型。

还有,你要分清楚 sherpa-ncnn 和 sherpa-onnx 的区别。你提的issue 是 sherpa-ncnn 里的,我上面说的是 sherpa-onnx.

标点模型和识别模型,是可以分开的,没有绑定在一起。

csukuangfj avatar Jul 13 '23 10:07 csukuangfj

@csukuangfj 我其实就是用在游戏引擎里,我觉得 NCNN 之类的手机端效率更高,我知道 onnx 和 ncnn 的区别,我是用你们的 ncnn 版本出现问题就没尝试 onnx 版本了,标点模型似乎 K2 官方没有提供,开发者自己去提取其他方案的当然可以,但是我建议自带一个,这东西 FunASR有, Paddle 也有,用 K2 就要自己找一个,然后要配合 VAD 附加标点,那多多少少开发量又有一些了,FunASR 了的 OnnxRuntime 只要指定模型路径,都不用自己操心了,真的开箱即用,拿到的输出就有标点(标点效果一般,但普通业务足够用),这其实大大的减少了用户的开发量,当然了,只是个人建议~

endink avatar Jul 13 '23 11:07 endink

点赞~~提交下pr吧

cgisky1980 avatar Jul 20 '23 14:07 cgisky1980

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]

babysor avatar Jul 24 '23 17:07 babysor

你这里是不是年久失修了啊。。我跟着文档,用windows安装就是一直失败:

请贴完整的 error log.

sherpa-onnx 有 CI tests. GitHub actions 是完全正常的.

https://github.com/k2-fsa/sherpa-onnx/actions/workflows/windows-x64.yaml

csukuangfj avatar Jul 25 '23 02:07 csukuangfj

你这里是不是年久失修了啊。。我跟着文档,用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也是通的

babysor avatar Jul 25 '23 03:07 babysor

这个是 windows cuda CI, 刚加的,完全没问题。

https://github.com/k2-fsa/sherpa-onnx/actions/runs/5652678141/job/15312677007

csukuangfj avatar Jul 25 '23 04:07 csukuangfj

你是不是先跑的 cpu build, 然后你没有删掉 build 文件夹,直接就跑 cuda build 了?是的话,请先删掉 build 文件夹,然后重试。 (如果是的话,那这个是你自己使用 cmake 的问题。 cmake 有 cache. )

csukuangfj avatar Jul 25 '23 04:07 csukuangfj

你是不是先跑的 cpu build, 然后你没有删掉 build 文件夹,直接就跑 cuda build 了?是的话,请先删掉 build 文件夹,然后重试。 (如果是的话,那这个是你自己使用 cmake 的问题。 cmake 有 cache. )

有删掉重试的, cuda toolkit 11.7, 我怀疑cmake版本是不是还有依赖?我装了最新的

babysor avatar Jul 25 '23 05:07 babysor

编译的时候,不需要 cudatoolkit, 只有运行的时候,才需要有 cudatoolkit.

pip install cmake

可以安装最新的 cmake.


方便的话,可否贴完整的 log ? (请先删掉 build 目录,然后跑一遍,然后贴 log)

csukuangfj avatar Jul 25 '23 05:07 csukuangfj

编译的时候,不需要 cudatoolkit, 只有运行的时候,才需要有 cudatoolkit.

pip install cmake

可以安装最新的 cmake.

方便的话,可否贴完整的 log ? (请先删掉 build 目录,然后跑一遍,然后贴 log)

log有点长,方便加v信发你么

babysor avatar Jul 25 '23 08:07 babysor

编译的时候,不需要 cudatoolkit, 只有运行的时候,才需要有 cudatoolkit.

pip install cmake

可以安装最新的 cmake. 方便的话,可否贴完整的 log ? (请先删掉 build 目录,然后跑一遍,然后贴 log)

log有点长,方便加v信发你么

please see https://github.com/k2-fsa/sherpa/pull/445

csukuangfj avatar Jul 27 '23 08:07 csukuangfj

顺便提供一个编译好的 windows onnx runtime 静态库 (请自行下载 onnx runtime 1.15.1 动态库),方便后来的同学使用~

PS:刚处理好编译问题,还没来得及测试

funasr_winx64_static_md.zip

请问,模型在哪里?

haha010508 avatar Aug 16 '23 05:08 haha010508

老哥可以帮忙搞一下websocket的runtime吗

leorusLao avatar Sep 06 '23 09:09 leorusLao

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

LauraGPT avatar Dec 04 '23 09:12 LauraGPT

Cool !

endink avatar Dec 07 '23 02:12 endink