| using Microsoft.ML.Tokenizers; |
| using System; |
| using System.Collections.Generic; |
| using System.IO; |
| using System.Linq; |
| using System.Net; |
| using System.Net.Http; |
| using System.Text; |
| using System.Threading.Tasks; |
|
|
| namespace StableDiffusionV2 |
| { |
| internal class ClipTokenizer |
| { |
| private readonly Tokenizer _tokenizer; |
| private readonly int _startToken; |
| private readonly int _endToken; |
|
|
| public ClipTokenizer(string vocabPath, string mergesPath, int startToken = 49406, int endToken = 49407) |
| { |
| if(!File.Exists(vocabPath) || !File.Exists(mergesPath)) |
| { |
| |
| |
|
|
| using (var client = new HttpClient()) |
| { |
| Console.WriteLine("download vocab.json and merges.txt"); |
| using (var s = client.GetStringAsync("https://huggingface.co/laion/CLIP-ViT-H-14-laion2B-s32B-b79K/raw/main/vocab.json")) |
| { |
| using (var fs = new StreamWriter(vocabPath)) |
| { |
| fs.Write(s.Result); |
| } |
| } |
|
|
| using (var s = client.GetStringAsync("https://huggingface.co/laion/CLIP-ViT-H-14-laion2B-s32B-b79K/raw/main/merges.txt")) |
| { |
| using (var fs = new StreamWriter(mergesPath)) |
| { |
| fs.Write(s.Result); |
| } |
| } |
| } |
| } |
|
|
| _tokenizer = new Tokenizer(new Bpe(vocabPath, mergesPath, endOfWordSuffix: "</w>")); |
| _startToken = startToken; |
| _endToken = endToken; |
| } |
|
|
| public int[] Tokenize(string text, int maxTokens = 77) |
| { |
| var res = _tokenizer.Encode(text); |
| var tokens = new[] { _startToken }.Concat(res.Ids.Concat(Enumerable.Repeat(0, maxTokens - res.Ids.Count - 2))).Concat(new[] { _endToken }).ToArray(); |
| return tokens; |
| } |
| } |
| } |
|
|