首页 文章 精选 留言 我的

精选列表

搜索[LLM辅助],共10000篇文章
优秀的个人博客,低调大师

AI辅助审计底稿自动化实践:把科目余额表一键变成可交付工作底稿

审计底稿大量重复劳动源于数据搬运与勾稽核对。本文给出"数据层—规则层—产出层"三层自动化架构,并附一段可运行 Python,演示如何把科目余额表自动转为带异常标注的工作底稿,单家主体工时预计节省约七成。一、底稿为什么是"重复劳动重灾区"审计行业有个公开的秘密:一份年度财报审计,真正需要职业判断的时间可能不到三成,剩下七成耗在"把数据搬运到模板、做勾稽、填底稿、留痕迹"的机械活上。一个典型的年审项目,单家主体就要处理几十张科目明细表、往来函证控制表、试算平衡表、折旧摊销测算表……这些表的共同特征是:结构固定、来源单一(几乎都来自科目余额表或序时账)、校验规则明确。凡是满足这三个特征的环节,就具备了被自动化的前提。遗憾的是,很多团队仍然用"复制粘贴 + 手工加公式"的方式完成。弊端很明显:第一,效率低,一个人三天的工作量,其中两天在搬数;第二,易出错,手工勾稽经常漏掉借贷不平、钩稽断裂;第三,难追溯,底稿改了哪、谁改的、为什么改,往往没有留痕。AI 与脚本化工具的价值,恰恰在于把这三件事一次性解决:用统一接口取数,用规则引擎校验,用模板生成可交付底稿并附电子轨迹。二、三层架构:让 AI 接管可标准化的部分底稿自动化三层架构我把底稿自动化拆成三层,边界清晰,便于工程化落地:- 数据层(多源接入):负责把科目余额表、序时账、合同台账、银行流水等统一成标准结构。关键是定义一套稳定的中间格式(CSV / 标准 JSON),让上游财务软件差异被屏蔽在接口之后。

优秀的个人博客,低调大师

#WorkBuddy|AI辅助起诉状撰写+合同合规审查实战教程:分步操作+可直接复用模板

本篇为纯落地无废话实战教程,脱离空洞理论,完全贴合企业法务、执业律师日常实务场景。全程依托WorkBuddy完成起诉状快速定稿、合同合规风险审查全流程操作,步骤清晰、指令模板可直接复制复用,搭配对应截图点位即可直接发文,零基础也能快速上手,兼顾实操效率与法律合规性。

优秀的个人博客,低调大师

go-mir v5.0.1 发布,用 Go 结构体标签定义 handler 路由信息的辅助库

go-mir v5.0.1 发布了,v5 版本带来全新的 RESTful API 开发方式,提供媲美 gRPC 服务开发的体验,方便快捷,欢迎使用。 ​Mir 是一套提供类似 gRPC 服务开发体验的快速开发 RESTful API 后端开发脚手架,适配多种 HTTP 框架,包括Gin,Chi,Hertz,Echo,Iris,Fiber,Macaron,Mux,httprouter。 使用说明 生成样板项目 % go install github.com/alimy/mir/mirc/v5@latest % mirc new -h create template project Usage: mirc new [flags] Flags: -d, --dst string genereted destination target directory (default ".") -h, --help help for new --mir string mir replace package name or place -p, --pkg string project's package name (default "github.com/alimy/mir-example") -s, --style string generated engine style eg: gin,chi,mux,hertz,echo,iris,fiber,fiber-v2,macaron,httprouter (default "gin") % mirc new -d example % tree example example . |-- Makefile |-- README.md |-- go.mod |-- go.sum |-- main.go |-- mirc | |-- auto | | `-- api | | |-- site.go | | |-- v1 | | | `-- site.go | | `-- v2 | | `-- site.go | |-- gen.go | `-- routes | |-- site.go | |-- v1 | | `-- site.go | `-- v2 | `-- site.go `-- servants |-- core.go |-- servants.go |-- site.go |-- site_v1.go `-- site_v2.go % cd example % make generate % make run RESTful API 接口定义 // file: mirc/routes.go package routes import ( . "github.com/alimy/mir/v5" ) type LoginReq struct { Name string `json:"name"` Passwd string `json:"passwd"` } type LoginResp struct { JwtToken string `json:"jwt_token"` } // User user interface info type User struct { // 标示为 API Entry, group为v1, 带有中间件接口 Schema `mir:"v1,chain"` Login func(Post, LoginReq) LoginResp `mir:"login"` Logout func(Post) `mir:"logout"` } 代码生成 // file: mirc/auto/api/routes/v1.go // Code generated by go-mir. DO NOT EDIT. // versions: // - mir v5.0.0 package v1 import ( "net/http" "github.com/alimy/mir/v5" "github.com/gin-gonic/gin" ) type _binding_ interface { Bind(*gin.Context) mir.Error } type _render_ interface { Render(*gin.Context) } type _default_ interface { Bind(*gin.Context, any) mir.Error Render(*gin.Context, any, mir.Error) } type LoginReq struct { Name string `json:"name"` Passwd string `json:"passwd"` } type LoginResp struct { JwtToken string `json:"jwt_token"` } type User interface { _default_ // Chain provide handlers chain for gin Chain() gin.HandlersChain Login(*gin.Context, *LoginReq) (*LoginResp, mir.Error) Logout(*gin.Context) mir.Error mustEmbedUnimplementedUserServant() } // RegisterUserServant register User servant to gin func RegisterUserServant(e *gin.Engine, s User) { router := e.Group("v1") // use chain for router middlewares := s.Chain() router.Use(middlewares...) // register routes info to router router.Handle("POST", "login", func(c *gin.Context) { select { case <-c.Request.Context().Done(): return default: } req := new(LoginReq) if err := s.Bind(c, req); err != nil { s.Render(c, nil, err) return } resp, err := s.Login(req) s.Render(c, resp, err) }) router.Handle("POST", "logout", func(c *gin.Context) { select { case <-c.Request.Context().Done(): return default: } s.Render(c, nil, s.Logout(c)) }) } func (UnimplementedUserServant) Chain() gin.HandlersChain { return nil } func (UnimplementedUserServant) Login(c *gin.Context, req *LoginReq) (*LoginResp, mir.Error) { return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) } func (UnimplementedUserServant) Logout(c *gin.Context) mir.Error { return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) } func (UnimplementedUserServant) mustEmbedUnimplementedUserServant() {} 接口实现 // file: servants/user.go package servants import ( api "github.com/alimy/mir-example/v5/mirc/auto/api/v1" "github.com/alimy/mir/v5" "github.com/gin-gonic/gin" ) type baseSrv struct{} func (baseSrv) Bind(c *gin.Context, obj any) mir.Error { if err := c.ShouldBind(obj); err != nil { mir.NewError(http.StatusBadRequest, err) } return nil } func (baseSrv) Render(c *gin.Context, data any, err mir.Error) { if err == nil { c.JSON(http.StatusOK, data) } else { c.JSON(err.StatusCode(), err.Error()) } } type userSrv struct { baseSrv api.UnimplementedUserServant // TODO: add other fields } func newUserSrv() api.User { return &userSrv{} } 服务注册 // file: servants/servants.go package servants import ( api "github.com/alimy/mir-example/v5/mirc/auto/api/v1" "github.com/gin-gonic/gin" ) // RegisterServants register all the servants to gin.Engine func RegisterServants(e *gin.Engine) { api.RegisterUserServant(e, newUserSrv()) // TODO: some other servant to register } 程序启动 // file: main.go package main import ( "log" "github.com/alimy/mir-example/v5/servants" "github.com/gin-gonic/gin" ) func main() { e := gin.Default() // register servants to gin servants.RegisterServants(e) // start servant service if err := e.Run(); err != nil { log.Fatal(err) } } 使用go-mir的项目 examples-go-mir自带的 demo,主要演示了如何使用Mir快速进行 RESTful API 的后端开 发; paopao-ce-一个清新文艺的微社区,提供类似 Twiter / 微博的推文分享服务; paopao-ce 通过使用go-mir更好、更便捷的开发 RESTful API 服务与 gRPC 服务。

优秀的个人博客,低调大师

word GPT Plus V0.2.6 发布,AI 辅助工作的 word 加载项,现在支持 PALM2

Word GPT Plus 是一款基于Vue3开发的Word加载项,它允许你基于文档中写的内容生成文本。你可以使用它来翻译、总结、润色或者从零开始写一篇文章。 开源地址和软件官网 Github Kuingsmile/word-GPT-Plus 本次更新内容 现在支持使用PALM2 API了 特色功能 使用GPT-3.5 API生成文本并支持选择模型 支持设置access token调用chatGPT web接口(使用该方法免费,建议配合chatGPT-plus) 支持OpenAI官方接口、Azure OpenAI API和PALM2 API 内置用于翻译、总结、润色和学术写作的提示 支持多种语言 可以自定义提示并保存以供将来使用 允许用户设置temperature和max tokens 支持代理 环境要求 软件要求 Microsoft Word 2016/2019 零售版,Microsoft Word 2021 或 Microsoft 365 Edge WebView2 Runtime https://developer.microsoft.com/en-us/microsoft-edge/webview2/ 如果你使用自己搭建的服务,你需要 Node.js 16+ 注意:office 插件只能在 docx 文件中使用,不支持 doc 文件。 账户要求 官方API需要一个OpenAI api key,你可以从https://platform.openai.com/account/api-keys获取 网页API需要一个chatGPT网站的access token,你可以参考access token获取 使用截图 安装方法 有两种方法可以安装 Word GPT Plus:通过我的免费web服务,或者自己搭建服务。 我强烈建议使用我的web服务,因为它安装简单快捷,也不需要安装额外的依赖项。此外,你将随时可以访问到最新版本的 Word GPT Plus。 由于所有数据都是使用localStorage保存的,所以你的隐私是受到保护的。 但是,如果你想要更快的速度,并且具有Node.js的专业知识,自己搭建服务也是一个选择。 由我提供的服务 下载manifest.xml文件并保存到你的电脑上,例如 C:\\Users\\username\\Documents\\WordGPT. 非中国地区: release/other/manifest.xml 中国地区: release/china/manifest.xml 按照下面的 旁加载插件 说明安装插件。 自己搭建服务 如果你想要自己搭建服务,你需要克隆这个仓库并安装依赖项,然后运行项目。需要 Node.js 16+。 git clone https://github.com/Kuingsmile/Word-GPT-Plus.git yarn yarn run serve 然后,按照下面的 旁加载插件 说明安装插件。 旁加载插件 为了开始使用 Word GPT Plus,你需要将插件旁加载到 Microsoft Word 中。 你可以在下面的链接中找到微软提供的说明:sideload office add-ins 打开你保存了 manifest.xml 文件的文件夹,例如 C:\\Users\\username\\Documents\\WordGPT. 右键点击文件夹打开菜单,选择 属性. 在 属性 对话框中,选择 共享 选项卡,然后选择 共享. 在 网络访问 对话框中,添加你自己和任何你想要共享的其他用户,选择 共享 按钮,当你看到你的文件夹被共享的确认信息时,注意显示在文件夹名称后面的 完整网络路径. 在 Word 中打开一个新文档,选择 文件 选项卡,然后选择 选项. 选择 信任中心,然后选择 信任中心设置 按钮. 选择 信任的目录. 在 目录 URL 框中,输入 完整网络路径,然后选择 添加目录. 选择 在菜单中显示 复选框,然后选择 确定. 关闭并重新启动 Word. 点击插入 -> 获取加载项 -> 共享目录,选择 Word GPT. 享受 Word GPT Plus 的强大功能吧!

优秀的个人博客,低调大师

kuingsmile word GPT Plus V0.1.0 发布,一款利用 ChatGPT 辅助工作的 Word 加载项

Word GPT Plus 是一款基于Vue3开发的Word加载项,它允许你基于文档中写的内容生成文本。你可以使用它来翻译、总结、润色或者从零开始写一篇文章。 开源地址和软件官网 Github Kuingsmile/word-GPT-Plus 更新内容 项目初始化,提供翻译、润色、总结等功能 使用openai官方 API 提供模型选择功能 特色功能 使用GPT-3.5 API生成文本并支持选择模型 内置用于翻译、总结、润色和学术写作的提示 支持多种语言 可以自定义提示并保存以供将来使用 允许用户设置temperature和max tokens 支持代理 使用截图 安装方法 克隆Kuingsmile/word-GPT-Plus并安装依赖,然后运行项目。 git clone https://github.com/Kuingsmile/word-GPT-Plus.git yarn yarn run serve 将插件旁加载到 Microsoft Word 中。旁加载允许你安装和测试尚未在 Microsoft Store 中提供的插件。 旁加载 Word GPT Plus可以参考官方的说明:旁加载 office 插件

优秀的个人博客,低调大师

go-mir v3.0.0 发布,用 Go 结构体标签定义 handler 路由信息的辅助库

go-mir v3.0.0 发布了,v3版本带来全新的RESTful API开发方式,提供媲美gRPC服务开发的体验,方便快捷,欢迎参考使用。 ​Mir 是一套提供类似gRPC服务开发体验的快速开发RESTful API后端开发脚手架,适配多种HTTP框架,包括Gin, Chi, Hertz, Echo, Iris, Fiber, Macaron, Mux, httprouter。 使用说明 生成样板项目 % go install github.com/alimy/mir/mirc/v3@latest % mirc new -h create template project Usage: mirc new [flags] Flags: -d, --dst string genereted destination target directory (default ".") -h, --help help for new --mir string mir replace package name or place -p, --pkg string project's package name (default "github.com/alimy/mir-example") -s, --style string generated engine style eg: gin,chi,mux,hertz,echo,iris,fiber,fiber-v2,macaron,httprouter (default "gin") % mirc new -d example % tree example example . |-- Makefile |-- README.md |-- go.mod |-- go.sum |-- main.go |-- mirc | |-- auto | | `-- api | | |-- site.go | | |-- v1 | | | `-- site.go | | `-- v2 | | `-- site.go | |-- main.go | `-- routes | |-- site.go | |-- v1 | | `-- site.go | `-- v2 | `-- site.go `-- servants |-- core.go |-- servants.go |-- site.go |-- site_v1.go `-- site_v2.go % cd example % make generate % make build RESTful接口定义 // file: mirc/routes.go package routes import ( . "github.com/alimy/mir/v3" . "github.com/alimy/mir/v3/engine" ) func init() { AddEntry(new(User)) } type LoginReq struct { Name string `json:"name"` Passwd string `json:"passwd"` } type LoginResp struct { JwtToken string `json:"jwt_token"` } // User user interface info type User struct { Chain Chain `mir:"-"` Group Group `mir:"v1"` Login func(Post, LoginReq) LoginResp `mir:"/login/"` Logout func(Post) `mir:"/logout/"` } 代码生成 // file: mirc/auto/api/routes.go // Code generated by go-mir. DO NOT EDIT. package routes import ( "net/http" "github.com/alimy/mir/v3" "github.com/gin-gonic/gin" ) type LoginReq struct { Name string `json:"name"` Passwd string `json:"passwd"` } type LoginResp struct { JwtToken string `json:"jwt_token"` } type User interface { // Chain provide handlers chain for gin Chain() gin.HandlersChain Login(c *gin.Context, req *LoginReq) (*LoginResp, mir.Error) Logout(c *gin.Context) mir.Error mustEmbedUnimplementedUserServant() } type UserBinding interface { BindLogin(c *gin.Context) (*LoginReq, mir.Error) mustEmbedUnimplementedUserBinding() } type UserRender interface { RenderLogin(c *gin.Context, data *LoginResp, err mir.Error) RenderLogout(c *gin.Context, err mir.Error) mustEmbedUnimplementedUserRender() } // UnimplementedUserServant can be embedded to have forward compatible implementations. type UnimplementedUserServant struct { } // UnimplementedUserBinding can be embedded to have forward compatible implementations. type UnimplementedUserBinding struct { BindAny func(*gin.Context, any) mir.Error } // UnimplementedUserRender can be embedded to have forward compatible implementations. type UnimplementedUserRender struct { RenderAny func(*gin.Context, any, mir.Error) } // RegisterUserServant register User servant to gin func RegisterUserServant(e *gin.Engine, s User, b UserBinding, r UserRender) { router := e.Group("v1") // use chain for router middlewares := s.Chain() router.Use(middlewares...) // register routes info to router router.Handle("POST", "/login/", func(c *gin.Context) { select { case <-c.Request.Context().Done(): return default: } req, err := b.BindLogin(c) if err != nil { r.RenderLogin(c, nil, err) } resp, err := s.Login(c, req) r.RenderLogin(c, resp, err) }) router.Handle("POST", "/logout/", func(c *gin.Context) { select { case <-c.Request.Context().Done(): return default: } r.RenderLogout(c, s.Logout(c)) }) } func (UnimplementedUserServant) Chain() gin.HandlersChain { return nil } func (UnimplementedUserServant) Login(c *gin.Context, req *LoginReq) (*LoginResp, mir.Error) { return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) } func (UnimplementedUserServant) Logout(c *gin.Context) mir.Error { return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) } func (UnimplementedUserServant) mustEmbedUnimplementedUserServant() {} func (b UnimplementedUserBinding) BindLogin(c *gin.Context) (*LoginReq, mir.Error) { obj := new(LoginReq) err := b.BindAny(c, obj) return obj, err } func (b UnimplementedUserBinding) mustEmbedUnimplementedUserBinding() {} func (r UnimplementedUserRender) RenderLogin(c *gin.Context, data *LoginResp, err mir.Error) { r.RenderAny(c, data, err) } func (r UnimplementedUserRender) RenderLogout(c *gin.Context, err mir.Error) { r.RenderAny(c, nil, err) } func (r UnimplementedUserRender) mustEmbedUnimplementedUserRender() {} 接口实现 // file: servants/user.go package servants import ( "github.com/alimy/mir-example/v3/mirc/auto/api" ) type userSrv struct { api.UnimplementedUserServant } type userBinding struct { *api.UnimplementedUserBinding } type userRender struct { *api.UnimplementedUserRender } func newUserSrv() api.Site { return &userSrv{} } func newUserBinding() api.SiteBinding { return &siteBinding{ UnimplementedSiteBinding: &api.UnimplementedSiteBinding{ BindAny: bindAny, }, } } func newUserRender() api.SiteRender { return &siteRender{ UnimplementedSiteRender: &api.UnimplementedSiteRender{ RenderAny: renderAny, }, } } func bindAny(c *gin.Context, obj any) mir.Error { if err != c.ShouldBind(obj); err != nil { return mir.NewError(http.StatusBadRequest, err) } return nil } func renderAny(c *gin.Context, data any, err mir.Error) { if err == nil { c.JSON(http.StatusOK, data) } else { c.JSON(err.StatusCode(), err.Error()) } } 服务注册 // file: servants/servants.go package servants import ( "github.com/alimy/mir-example/v3/mirc/auto/api" "github.com/gin-gonic/gin" ) // RegisterServants register all the servants to gin.Engine func RegisterServants(e *gin.Engine) { api.RegisterUserServant(e, newUserSrv(), newUserBinding(), newUserRender()) // TODO: some other servant to register } 程序启动 // file: main.go package main import ( "log" "github.com/alimy/mir-example/v3/servants" "github.com/gin-gonic/gin" ) func main() { e := gin.Default() // register servants to gin servants.RegisterServants(e) // start servant service if err := e.Run(); err != nil { log.Fatal(err) } } 使用go-mir的项目 examples- go-mir自带的demo,主要演示了如何使用Mir快速进行RESTful API的后端开 发; paopao-ce - 一个清新文艺的微社区,提供类似Twiter/微博的推文分享服务; paopao-ce通过使用go-mir更好、更便捷的开发RESTful API服务与gRPC服务。

优秀的个人博客,低调大师

go-mir v2.8.0 发布,用 Go 结构体标签定义 handler 路由信息的辅助库

go-mir v2.8.0 发布了,支持多个web框架,自带mirc脚手架,零基础开发web应用,方便快捷。 新增特性: 支持把一个方法注册到多个HTTP METHOD,eg: type Site struct { Assets mir.Any `mir:"/assets" method:"Head,Get"` Others mirAny `mir:"/others"` Status mir.Any `mir:"/Status" method:"Get,Post,Head"` } 额~ 还有很多... 有兴趣可以查看这里。 最近疫情原因,呆家出不去,所以...没啥事,就是发个版本打发一下无聊时间~~ 这个库其实本质上是一个代码生成器,当初开发这个库就是奔着写代码偷懒去的,本着能自动生成就绝不Ctr-C/Ctr-V的心思,业余时间捣腾几下,还别说,至少在我的项目中,还是蛮省心的,有兴趣的朋友可以尝试一下,万一就对了你的心呢!!! go-mir v2的架构如下: v2版本升级采用代码生成的方式生成接口代码,同样也是采用golang内置的struct tag定义路由信息,但不同于v1版本在引擎启动时解析后注册路由信息到web引擎,这里参考grpc的接口生成方式,生成接口定义文件,业务逻辑只要实现了接口,注册接口实现的对象到相应的web引擎,启动后就可以对外通过RESTfull接口获取服务。 go-mir v2功能特性: 使用Go结构体标签定义handler路由信息; 自动根据定义的结构体标签信息生成handler接口,开发者实现相应接口后注册到router,与gRPC的使用方式类似; 内置支持gin、go-chi、mux、httprouter、echo、iris、macaron、fiber的代码生成器; 自带脚手架mirc自动生成gin、go-chi、mux、httprouter、echo、iris、macaron、fiber样式的模板工程代码; 支持多goroutine并发生成接口代码,加快代码生成效率; go-mir v2代码示例:(eg: gin style) 生成样板代码 % go get github.com/alimy/mir/mirc/v2@latest % mirc new -d mir-examples % tree mir-examples mir-examples ├── Makefile ├── README.md ├── go.mod ├── main.go └── mirc ├── main.go └── routes ├── site.go ├── v1 │ └── site.go └── v2 └── site.go % cd mir-examples % make generate 自定义路由信息,比如: // file: mirc/routes/v1/site.go package v1 import ( "github.com/alimy/mir/v2" "github.com/alimy/mir/v2/engine" ) func init() { engine.AddEntry(new(Site)) } // Site mir's struct tag define type Site struct { Chain mir.Chain `mir:"-"` Group mir.Group `mir:"v1"` Index mir.Get `mir:"/index/"` Articles mir.Get `mir:"/articles/:category/"` } 定义生成器入口,比如: // file: mirc/main.go package main import ( "log" "github.com/alimy/mir/v2/core" "github.com/alimy/mir/v2/engine" _ "github.com/alimy/mir/v2/examples/mirc/routes" _ "github.com/alimy/mir/v2/examples/mirc/routes/v1" _ "github.com/alimy/mir/v2/examples/mirc/routes/v2" ) //go:generate go run main.go func main() { log.Println("generate code start") opts := core.Options{ core.RunMode(core.InSerialDebugMode), core.GeneratorName(core.GeneratorGin), core.SinkPath("./gen"), } if err := engine.Generate(opts); err != nil { log.Fatal(err) } log.Println("generate code finish") } 自动生成接口,基于上面的定义,生成器将自动生成接口定义文件,如下: % make generate % cat mirc/gen/api/v1/site.go // Code generated by go-mir. DO NOT EDIT. package v1 import ( "github.com/gin-gonic/gin" ) type Site interface { // Chain provide handlers chain for gin Chain() gin.HandlersChain Index(*gin.Context) Articles(*gin.Context) } // RegisterSiteServant register Site servant to gin func RegisterSiteServant(e *gin.Engine, s Site) { router := e.Group("v1") // use chain for router middlewares := s.Chain() router.Use(middlewares...) // register routes info to router router.Handle("GET", "/index/", s.Index) router.Handle("GET", "/articles/:category/", s.Articles) } 实现接口逻辑, 比如: // file: servants/site_v1.go package servants import ( "net/http" "github.com/gin-gonic/gin" api "github.com/alimy/mir/v2/examples/mirc/gen/api/v1" ) var _ api.Site = EmptySiteV1{} // EmptySiteV1 implement api.Site interface type EmptySiteV1 struct{} func (EmptySiteV1) Chain() gin.HandlersChain { return gin.HandlersChain{gin.Logger()} } func (EmptySiteV1) Index(c *gin.Context) { c.String(http.StatusOK, "get index data (v1)") } func (EmptySiteV1) Articles(c *gin.Context) { c.String(http.StatusOK, "get articles data (v1)") } 注册接口实现对象到相对应的router,比如: package main import ( "log" "github.com/gin-gonic/gin" "github.com/alimy/mir/v2/examples/mirc/gen/api" "github.com/alimy/mir/v2/examples/mirc/gen/api/v1" "github.com/alimy/mir/v2/examples/mirc/gen/api/v2" "github.com/alimy/mir/v2/examples/servants" ) func main() { e := gin.New() // register servants to engine registerServants(e) // start servant service if err := e.Run(); err != nil { log.Fatal(err) } } func registerServants(e *gin.Engine) { // register default group routes api.RegisterSiteServant(e, servants.EmptySiteWithNoGroup{}) // register routes for group v1 v1.RegisterSiteServant(e, servants.EmptySiteV1{}) // register routes for group v2 v2.RegisterSiteServant(e, servants.EmptySiteV2{}) } 最后,构建并运行应用: % make run 大功告成,是不是很简单,赶紧上手吧:) 演示项目: examples:一个简单的快速了解如何使用mir的演示项目; Mirage-幻影: 简单的Docker图形化管理,示范如何使用go-mir构建web应用程序. mir-covid19: 新冠疫情统计TH_COVID19_International的Golang版本,完整的演示了如何使用mir快速开发一个web应用。

优秀的个人博客,低调大师

是时候写个翻译器辅助女友追星了

过年回来,程序员阿强变了。 阿强,一个向来对外宣称只关心代码的男人,近期突然加入了办公室自发组织的追星兴趣小组,热情高涨的探讨起“饭圈文学”,对新生代的明星爱豆,虽不能做到如数家珍,却透露出十足兴味,特别是在应援话术和常见追星场景上,阿强尤为认真,甚至做起了笔记…… 轮番追问,才发现这个成熟coder细腻又体贴的内心。 原来,随着选秀节目《创4》的“突如其来”,阿强的女友阿珍,又粉上了新一代年轻爱豆,不同的是,这次粉的还是几位来自日、韩、俄、泰、乌克兰的国际选手。语言不通的阿珍,一如既往地淹没在饭圈女孩的茫茫人海中,粉得轰轰烈烈又平平无奇。 阿强深知,饭圈内卷丝毫不比开发圈轻松。会写彩虹文的比不上会p美图的,会设计灯牌的较之扛长焦的又稍显逊色…… 想让女友的追星体验更佳,甚至脱颖而出,阿强很快找到了突破口——为女友开发一个追星翻译神器。 说干就干,阿强迅速构思出这个翻译器的重点功能,包含但不限于: 1、支持文本和语音输入; 2、支持多国语言; 3、译文支持生成语音…… 阿强想,该翻译器不仅适用于追星场景,日后出国旅游、社交交流、语言学习也能扛起大任。 实现原理 借助华为机器学习能力,任何人都可以简单便捷的使用原本复杂的机器学习能力,助力开发者更快更好地开发各类AI应用。 开发准备 1、配置华为Maven仓地址 2、添加编译SDK依赖 打开应用级的“build.gradle”文件 dependencies { ... // 引入实时语音识别服务插件 implementation 'com.huawei.hms:ml-computer-voice-asr-plugin:2.0.3.300' // 引入文本翻译服务SDK implementation 'com.huawei.hms:ml-computer-translate:2.0.4.300' // 引入文本翻译算法包 implementation 'com.huawei.hms:ml-computer-translate-model:2.0.4.300' // 引入语音合成服务SDK implementation 'com.huawei.hms:ml-computer-voice-tts:2.0.4.300' // 引入离线语音合成bee语音包 implementation 'com.huawei.hms:ml-computer-voice-tts-model-bee:2.0.4.300' } 上述步骤可以参考开发者网站中的应用开发介绍:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/config-agc-0000001050990353-V5 3、在AndroidManifest.xml中添加权限 打开main中的AndroidManifest.xml文件,在<application 前添加所需的权限 <uses-permission android:name="android.permission.INTERNET" /> <!-- 访问网络 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 获取网络状态 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!-- 升级算法版本 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><!-- 获取Wi-Fi状态 --> <uses-permission android:name="android.permission.RECORD_AUDIO" /><!-- 通过录音机获取声音 --> 开发步骤 页面设计 参考activity_main.xml布局文件,设计专属自己好用的页面app页面 点击“开始识别”按钮,加载ASR模块,识别用户说话的内容。 点击“合成语音”,加载TTS模块,把翻译后的内容直接朗读出来。 功能开发 1. 使用实时语音识别服务插件,快速集成ASR能力 public void startAsr(View view) { // 通过intent进行识别设置。 Intent intent = new Intent(this, MLAsrCaptureActivity.class) // 设置识别语言为英语,若不设置,则默认识别英语。支持设置:"zh-CN":中文;"en-US":英语;"fr-FR":法语;"es-ES":西班牙语;"de-DE":德语;"it-IT":意大利语。 .putExtra(MLAsrCaptureConstants.LANGUAGE, Constants.ASR_SOURCE[spinnerInput.getSelectedItemPosition()]) // 设置拾音界面是否显示识别结果,MLAsrCaptureConstants.FEATURE_ALLINONE为不显示,MLAsrCaptureConstants.FEATURE_WORDFLUX为显示。 .putExtra(MLAsrCaptureConstants.FEATURE, MLAsrCaptureConstants.FEATURE_WORDFLUX); // 100表示当前Activity和拾音界面Activity之间的请求码,通过该码可以在当前Activity中获取拾音界面的处理结果。 startActivityForResult(intent, 100); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); String text; // 100是第2步中定义的当前Activity和拾音界面Activity之间的请求码。 if (requestCode == 100) { switch (resultCode) { // 返回值为MLAsrCaptureConstants.ASR_SUCCESS表示识别成功。 case MLAsrCaptureConstants.ASR_SUCCESS: if (data != null) { Bundle bundle = data.getExtras(); // 获取语音识别得到的文本信息。 if (bundle != null && bundle.containsKey(MLAsrCaptureConstants.ASR_RESULT)) { text = bundle.getString(MLAsrCaptureConstants.ASR_RESULT); // 识别得到的文本信息处理。 textViewInput.setText(text); Translation.run(this, textViewOutput, spinnerInput.getSelectedItemPosition(), spinnerOutput.getSelectedItemPosition(), text); } } break; ... } } } 2. 新建Translation类,用于调用文本翻译的能力 首先暴露公共方法,根据参数判断使用在线翻译或者离线翻译 public static void run(Activity activity, TextView textView, int sourcePosition, int targetPosition, String sourceText) { Log.d(TAG, Constants.TRANSLATE[sourcePosition] + ", " + Constants.TRANSLATE[targetPosition] + ", " + sourceText); if (isOffline) { onDeviceTranslation(activity, textView, sourcePosition, targetPosition, sourceText); } else { realTimeTranslation(textView, sourcePosition, targetPosition, sourceText); } } 接着分别引入在线和离线翻译的具体方法 private static void realTimeTranslation(final TextView textView, int sourcePosition, final int targetPosition, String sourceText) { Log.d(TAG, "realTimeTranslation"); ... } private static void onDeviceTranslation(final Activity activity, final TextView textView, final int sourcePosition, final int targetPosition, final String sourceText) { Set<String> result = MLTranslateLanguage.syncGetLocalAllLanguages(); Log.d(TAG, "本地离线翻译支持的语种: " + Arrays.toString(result.toArray())); ... } 新建TTS类,用于调用语音合成的能力 同Translation一样,首先暴露公共方法,根据参数判断使用在线语音合成或者离线语音合成 public static void run(Activity activity, int targetPosition, String sourceText) { Log.d(TAG, sourceText); if (isNotAuto || sourceText.isEmpty()) { return; } if (isOffline) { if (0 == targetPosition) { Toast.makeText(activity, "暂不支持离线中文发音", Toast.LENGTH_SHORT).show(); return; } offlineTts(activity, Constants.TTS_TARGET[targetPosition], Constants.TTS_TARGET_SPEAKER_OFFLINE[targetPosition], sourceText); } else { onlineTts(Constants.TTS_TARGET[targetPosition], Constants.TTS_TARGET_SPEAKER[targetPosition], sourceText); } } 接着,分别引入在线和离线语音合成的具体实现 private static void onlineTts(String language, String person, String sourceText) { Log.d(TAG, language + ", " + person + ", " + sourceText); ... } private static void offlineTts(final Activity activity, String language, final String person, final String sourceText) { // 使用自定义参数配置创建语音合成引擎。 // 发音人名称请参见“音色试听”章节。 final MLTtsConfig mlTtsConfig = new MLTtsConfig().setLanguage(language) .setPerson(person) // 设置语音合成的模式为离线模式,不设置默认为在线模式。 .setSynthesizeMode(MLTtsConstants.TTS_OFFLINE_MODE); ... } 添加自定义语言支持 1、分别在多语言的values/arrays.xml文件中,添加需要的语言(比如Italian) <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="languages"> ... <item>Spanish</item> <!--add next line--> <item>Italian</item> </string-array> </resources> 2、在Language枚举类中,添加ASR/Translate/TTS模块的语言代码 public enum Language { ... ES(MLAsrConstants.LAN_ES_ES, "es", MLTtsConstants.TTS_LAN_ES_ES, MLTtsConstants.TTS_SPEAKER_FEMALE_ES, MLTtsConstants.TTS_SPEAKER_OFFLINE_ES_ES_FEMALE_BEE), // add next line IT("it-IT", "it", MLTtsConstants.TTS_LAN_IT_IT, MLTtsConstants.TTS_SPEAKER_FEMALE_IT, MLTtsConstants.TTS_SPEAKER_OFFLINE_IT_IT_FEMALE_BEE); ... 从前往后各字段的含义分别是ASR输入语言,翻译目标语言,TTS输出语言,TTS输出语言音色。 完成以上两步,就可以在App中使用意大利语了。 最终效果 阿强相信,凭借此神器,女友阿珍必定能克服了语言障碍,于千篇一律的彩虹应援词中,使用爱豆母语发送问候,瞬间突出!在公演现场和见面会,用爱豆熟悉的语言呼唤他,收获了身处异国的爱豆的注意!甚至荣升爱豆国际后援团中国区团长,与全球团长共商应援大事,都指日可待! 而成就这一切背后的男人,就是深处功与名的阿强,一个做事低调的coder而已。 >>访问华为开发者联盟官网,了解更多相关内容 >>获取开发指导文档 >>华为移动服务开源仓库地址:GitHub、Gitee 点击右上角头像右方的关注,第一时间了解华为移动服务最新技术~

优秀的个人博客,低调大师

go-mir v2.3.2 发布,用 Go 结构体标签定义 handler 路由信息的辅助库

go-mir v2.3.2发布了,支持多个web框架,自带mirc脚手架,零基础开发web应用,方便快捷。 新增特性: 添加echo, iris, macaron的支持,mirc自动生成相应web框架样式的接口代码; 支持多层次Group定义,优化生成代码的包名命名方式; 支持使用多goroutine更快速的自动 生成接口代码; 简要介绍: go-mir v2 是参考grpc使用方式,使用golang内置的结构体标签定义路由信息,通过代码生成的方式生成接口代码,业务逻辑只要实现了接口,注册接口实现的对象到相应的web引擎,启动后就可以对外通过RESTful接口获取服务。大致框架如下: 功能特性: 使用Go结构体标签定义handler路由信息; 自动根据定义的结构体标签信息生成handler接口,开发者实现相应接口后注册到router,与gRPC的使用方式类似; 内置支持gin、go-chi、mux、httprouter、echo、iris、macaron的代码生成器; 自带脚手架mirc自动生成gin、go-chi、mux、httprouter、echo、iris、macaron样式的模板工程代码; 支持多goroutine并发生成接口代码,加快代码生成效率; 代码示例:(eg: gin style) 生成样板代码 % go get github.com/alimy/mir/mirc/v2@latest % mirc new -d mir-examples % tree mir-examples mir-examples ├── Makefile ├── README.md ├── go.mod ├── main.go └── mirc ├── main.go └── routes ├── site.go ├── v1 │ └── site.go └── v2 └── site.go % cd mir-examples % make generate 自定义路由信息,比如: // file: mirc/routes/v1/site.go package v1 import ( "github.com/alimy/mir/v2" "github.com/alimy/mir/v2/engine" ) func init() { engine.AddEntry(new(Site)) } // Site mir's struct tag define type Site struct { Chain mir.Chain `mir:"-"` Group mir.Group `mir:"v1"` Index mir.Get `mir:"/index/"` Articles mir.Get `mir:"/articles/:category/"` } 定义生成器入口,比如: // file: mirc/main.go package main import ( "log" "github.com/alimy/mir/v2/core" "github.com/alimy/mir/v2/engine" _ "github.com/alimy/mir/v2/examples/mirc/routes" _ "github.com/alimy/mir/v2/examples/mirc/routes/v1" _ "github.com/alimy/mir/v2/examples/mirc/routes/v2" ) //go:generate go run main.go func main() { log.Println("generate code start") opts := core.Options{ core.RunMode(core.InSerialDebugMode), core.GeneratorName(core.GeneratorGin), core.SinkPath("./gen"), } if err := engine.Generate(opts); err != nil { log.Fatal(err) } log.Println("generate code finish") } 自动生成接口,基于上面的定义,生成器将自动生成接口定义文件,如下: % make generate % cat mirc/gen/api/v1/site.go // Code generated by go-mir. DO NOT EDIT. package v1 import ( "github.com/gin-gonic/gin" ) type Site interface { // Chain provide handlers chain for gin Chain() gin.HandlersChain Index(*gin.Context) Articles(*gin.Context) } // RegisterSiteServant register Site servant to gin func RegisterSiteServant(e *gin.Engine, s Site) { router := e.Group("v1") // use chain for router middlewares := s.Chain() router.Use(middlewares...) // register routes info to router router.Handle("GET", "/index/", s.Index) router.Handle("GET", "/articles/:category/", s.Articles) } 实现接口逻辑, 比如: // file: servants/site_v1.go package servants import ( "net/http" "github.com/gin-gonic/gin" api "github.com/alimy/mir/v2/examples/mirc/gen/api/v1" ) var _ api.Site = EmptySiteV1{} // EmptySiteV1 implement api.Site interface type EmptySiteV1 struct{} func (EmptySiteV1) Chain() gin.HandlersChain { return gin.HandlersChain{gin.Logger()} } func (EmptySiteV1) Index(c *gin.Context) { c.String(http.StatusOK, "get index data (v1)") } func (EmptySiteV1) Articles(c *gin.Context) { c.String(http.StatusOK, "get articles data (v1)") } 注册接口实现对象到相对应的router,比如: package main import ( "log" "github.com/gin-gonic/gin" "github.com/alimy/mir/v2/examples/mirc/gen/api" "github.com/alimy/mir/v2/examples/mirc/gen/api/v1" "github.com/alimy/mir/v2/examples/mirc/gen/api/v2" "github.com/alimy/mir/v2/examples/servants" ) func main() { e := gin.New() // register servants to engine registerServants(e) // start servant service if err := e.Run(); err != nil { log.Fatal(err) } } func registerServants(e *gin.Engine) { // register default group routes api.RegisterSiteServant(e, servants.EmptySiteWithNoGroup{}) // register routes for group v1 v1.RegisterSiteServant(e, servants.EmptySiteV1{}) // register routes for group v2 v2.RegisterSiteServant(e, servants.EmptySiteV2{}) } 最后,构建并运行应用: % make run 大功告成,是不是很简单,赶紧上手吧:) 演示项目: examples:一个简单的快速了解如何使用mir的演示项目; mir-covid19: 新冠疫情统计TH_COVID19_International的Golang版本,完整的演示了如何使用mir快速开发一个web应用。

优秀的个人博客,低调大师

go-mir v2.0.0 发布,用 Go 结构体标签定义 handler 路由信息的辅助库

go-mir v2.0.0 发布了,推荐使用。 功能特性: 使用Go结构体标签定义handler路由信息; 自动根据定义的结构体标签信息生成handler接口,开发者实现相应接口后注册到router,与gRPC的使用方式类似; 内置支持gin、go-chi、mux、httprouter的代码生成器; 自带脚手架mirc自动生成gin、go-chi、mux、httprouter样式的模板工程代码; 开发详情: 与版本 v1不同,版本v2采用代码生成的方式从定义的结构体标签信息生成handler接口,开发者实现相应接口完成Web API的功能,非常漂亮的支持了基于接口编程的范式。 go-mir v1的架构大体是这样: 这套架构主要是使用了golang的反射机制对struct tag解析然后注册路由信息到web engine,只影响启动时间,不会有运行时损耗,总体来说,方便了接口定义,对代码组织很有益处。 go-mir v2版本大体架构如下: v2版本升级采用代码生成的方式生成接口代码,同样也是采用golang内置的struct tag定义路由信息;不同于v1版本在引擎启动时解析后注册路由信息到web引擎,这里参考grpc的接口生成方式,生成接口定义文件,业务逻辑只要实现了接口,注册接口实现的对象到相应的web引擎,启动后就可以对外通过RESTfull接口获取服务。 代码示例:(eg: gin style) 生成样板代码 % go get github.com/alimy/mir/mirc/v2@latest % mirc new -d mir-examples % tree mir-examples mir-examples ├── Makefile ├── README.md ├── go.mod ├── main.go └── mirc ├── main.go └── routes ├── site.go ├── v1 │ └── site.go └── v2 └── site.go % cd mir-examples % make generate 自定义路由信息,比如: // file: mirc/routes/site.go package routes import "github.com/alimy/mir/v2" // Site mir's struct tag define type Site struct { Chain mir.Chain `mir:"-"` Index mir.Get `mir:"/index/"` Articles mir.Get `mir:"/articles/:category/"` } 定义生成器入口,比如 % cat mirc/main.go package main import ( "log" "github.com/alimy/mir/v2/core" "github.com/alimy/mir/v2/engine" routes "github.com/alimy/mir/v2/examples/mirc/routes" v1 "github.com/alimy/mir/v2/examples/mirc/routes/v1" v2 "github.com/alimy/mir/v2/examples/mirc/routes/v2" ) //go:generate go run main.go func main() { log.Println("generate code start") entries := mirEntries() opts := &core.Options{ GeneratorName: core.GeneratorGin, GeneratorOpts: core.InitOpts{ core.OptSinkPath: "./gen", }, } if err := engine.Generate(entries, opts); err != nil { log.Fatal(err) } log.Println("generate code finish") } func mirEntries() []interface{} { return []interface{}{ new(routes.Site), new(v1.Site), new(v2.Site), } } 自动生成接口,基于上面的定义,生成器将自动生成接口定义文件,如下: % make generate % cat mirc/gen/api/site.go // Code generated by go-mir. DO NOT EDIT. package api import ( "github.com/gin-gonic/gin" ) // Site mir's struct tag define type Site interface { Chain() gin.HandlersChain Index(c *gin.Context) Articles(c *gin.Context) } // RegisterSiteServant register site to gin func RegisterSiteServant(e *gin.Engine, s Site) { router := e // use chain for router middlewares := s.Chain() router.Use(middlewares...) // register route info to router router.Handle("GET", "/index/", s.Index) router.Handle("GET", "/articles/:category/", s.Articles) } 注册接口实现对象到相对应的router,比如: package main import ( "log" "github.com/gin-gonic/gin" "github.com/alimy/mir/v2/examples/mirc/gen/api" "github.com/alimy/mir/v2/examples/mirc/gen/api/v1" "github.com/alimy/mir/v2/examples/mirc/gen/api/v2" "github.com/alimy/mir/v2/examples/servants" ) func main() { e := gin.New() // register servants to engine registerServants(e) // start servant service if err := e.Run(); err != nil { log.Fatal(err) } } func registerServants(e *gin.Engine) { // register default group routes api.RegisterSiteServant(e, servants.EmptySiteWithNoGroup{}) // register routes for group v1 v1.RegisterSiteServant(e, servants.EmptySiteV1{}) // register routes for group v2 v2.RegisterSiteServant(e, servants.EmptySiteV2{}) } 最后,构建并运行应用: % make run 大功告成,是不是很简单,赶紧上手吧:)

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册