public void KatakanaToRomaji() { foreach (var(_, katakana, romaji) in ConversionTables.HiraganaKatakanaToRomaji) { if (!string.IsNullOrEmpty(katakana)) { var result = WanaKana.ToRomaji(katakana); Assert.Equal(romaji, result); } } }
public void ConvertWithCustomMapping() { { var customMapping = new Trie <char, string>(); var root = customMapping.Root; root.Insert(('い', "i")); root['い'].Insert(('ぬ', "dog")); Assert.AreEqual("inu", WanaKana.ToRomaji("いぬ")); Assert.AreEqual("dog", WanaKana.ToRomaji("いぬ", customRomajiMapping: customMapping)); } }
public UOto(Oto oto, UOtoSet set) { Alias = oto.Name; Set = set.Name; File = Path.Combine(set.Location, oto.Wav); Offset = oto.Offset; Consonant = oto.Consonant; Cutoff = oto.Cutoff; Preutter = oto.Preutter; Overlap = oto.Overlap; SearchTerms = new List <string>(); SearchTerms.Add(Alias.ToLowerInvariant().Replace(" ", "")); SearchTerms.Add(WanaKana.ToRomaji(Alias).ToLowerInvariant().Replace(" ", "")); }
public USinger(Voicebank voicebank, string singersPath) { Name = voicebank.Name; Author = voicebank.Author; Web = voicebank.Web; OtherInfo = voicebank.OtherInfo; Location = Path.GetDirectoryName(voicebank.File); if (!string.IsNullOrEmpty(voicebank.Image)) { Avatar = Path.Combine(Location, voicebank.Image); try { using (var stream = new FileStream(Avatar, FileMode.Open)) { using (var memoryStream = new MemoryStream()) { stream.CopyTo(memoryStream); AvatarData = memoryStream.ToArray(); } } } catch (Exception e) { AvatarData = null; Log.Error(e, "Failed to load avatar data."); } } if (voicebank.PrefixMap != null) { PrefixMap = voicebank.PrefixMap.Map; } else { PrefixMap = new Dictionary <string, Tuple <string, string> >(); } OtoSets = new List <UOtoSet>(); foreach (var otoSet in voicebank.OtoSets) { OtoSets.Add(new UOtoSet(otoSet, this, singersPath)); } Id = voicebank.Id; Loaded = true; Task.Run(() => { OtoSets .SelectMany(set => set.Otos.Values) .SelectMany(otos => otos) .ToList() .ForEach(oto => { oto.SearchTerms.Add(oto.Alias.ToLowerInvariant().Replace(" ", "")); oto.SearchTerms.Add(WanaKana.ToRomaji(oto.Alias).ToLowerInvariant().Replace(" ", "")); }); }); }
/// <summary> /// Progress sentence /// </summary> /// <param name="sentence"></param> /// <returns></returns> public List <MecabWordInfo> SentenceHandle(string sentence) { List <MecabWordInfo> ret = new List <MecabWordInfo>(); foreach (var node in tagger.ParseToNodes(sentence)) { if (node.CharType > 0) { var features = node.Feature.Split(','); #region 填充 MecabWordInfo 各项 Property MecabWordInfo word = new MecabWordInfo { Word = node.Surface, PartOfSpeech = features[0], Description = features[1], Feature = node.Feature }; // 加这一步是为了防止乱码进入分词导致无法读取假名 if (features.Length >= 8) { word.Kana = features[7]; } // 清理不需要的假名 if (word.PartOfSpeech == "記号") { word.Kana = ""; } if (WanaKana.IsHiragana(node.Surface)) { word.Kana = ""; } if (WanaKana.IsKatakana(node.Surface)) { word.Kana = ""; } #endregion ret.Add(word); } } return(ret); }
public void CompactTrue() { var result = WanaKana.Tokenize("5romaji here...!?漢字ひらがなカタ カナ4「SHIO」。! لنذهب", true); var expectedResult = new string[] { "5", "romaji here", "...!?", "漢字ひらがなカタ カナ", "4「", "SHIO", "」。!", " ", "لنذهب", }; Assert.Equal(expectedResult, result.Select(t => t.Content)); }
public void CompactDetailedCheck() { var result = WanaKana.Tokenize("5romaji here...!?漢字ひらがなカタ カナ4「SHIO」。! لنذهب", true); var expectedResult = new Token[] { new Token(tokenType: TokenTypes.Other, content: "5"), new Token(tokenType: TokenTypes.English, content: "romaji here"), new Token(tokenType: TokenTypes.Other, content: "...!?"), new Token(tokenType: TokenTypes.Japanese, content: "漢字ひらがなカタ カナ"), new Token(tokenType: TokenTypes.Other, content: "4「"), new Token(tokenType: TokenTypes.Japanese, content: "SHIO"), new Token(tokenType: TokenTypes.Other, content: "」。!"), new Token(tokenType: TokenTypes.English, content: " "), new Token(tokenType: TokenTypes.Other, content: "لنذهب"), }; Assert.Equal(expectedResult, result); }
private void UpdateSuggestion() { if (Part == null || Note == null) { itemList.Items.Clear(); popup.IsOpen = false; return; } itemList.Items.Clear(); popup.IsOpen = true; var singer = DocManager.Inst.Project.tracks[Part.trackNo].Singer; if (singer == null) { itemList.Items.Add("No Singer"); return; } if (!string.IsNullOrEmpty(Text)) { itemList.Items.Add(WanaKana.ToHiragana(Text)); } singer.GetSuggestions(Text, oto => itemList.Items.Add(oto.Alias)); }
public void HandlesMixedInput() { var result = WanaKana.Tokenize("5romaji here...!?漢字ひらがなカタ カナ4「SHIO」。!"); var expectedResult = new string[] { "5", "romaji", " ", "here", "...!?", "漢字", "ひらがな", "カタ", " ", "カナ", "4", "「", "SHIO", "」。!", }; Assert.Equal(expectedResult, result.Select(t => t.Content)); }
public void EmptyInput() { Assert.Empty(WanaKana.Tokenize(string.Empty)); }
public void IsJapaneseAcceptsOptionalAllowedCharsRegex() { var isJapanese = WanaKana.IsJapanese("≪偽括弧≫", new Regex("[≪≫]")); Assert.True(isJapanese); }
public void ToHiraganaKatakanaChoonpu(string input, string expectedResult) { Assert.Equal(expectedResult, WanaKana.ToHiragana(input), StringComparer.InvariantCulture); }
public void ProcessDirectory() { var subDirectories = this._directory.GetDirectories().Where(dir => dir.ContainsSong()).ToList(); var oszSongs = this._directory.GetOszFiles(); if (this._outputDirectory.GetDirectories().Length > 0) { Console.WriteLine("Cleaning up output directory.."); foreach (DirectoryInfo directoryInfo in this._outputDirectory.GetDirectories()) { directoryInfo.Delete(true); } } int total = subDirectories.Count + oszSongs.Length; int id = this._startId; int count = 1; int succesful = 0; string format = $"D{total.ToString().Length}"; Console.WriteLine($"Processing {total} songs!"); if (oszSongs.Any()) { DirectoryInfo tempDirectory = this._outputDirectory.CreateSubdirectory("temp"); OsuProcessor osuProcessor = new OsuProcessor(this._categoryId, tempDirectory); foreach (FileInfo fileInfo in oszSongs) { Console.Write( $"[{count.ToString(format)}/{total.ToString()}] {Path.GetFileNameWithoutExtension(fileInfo.FullName)}.."); Song newSong = osuProcessor.Process(fileInfo, id); if (newSong != null) { this._songs.Add(newSong); string outputPath = $"{this._outputDirectory.FullName}{Path.DirectorySeparatorChar}{id}"; Directory.CreateDirectory(outputPath); foreach (FileInfo enumerateFile in tempDirectory.EnumerateFiles()) { enumerateFile.MoveTo($"{outputPath}{Path.DirectorySeparatorChar}{enumerateFile.Name}"); } Console.ForegroundColor = ConsoleColor.Green; Console.Write("OK! \n"); Console.ResetColor(); succesful += 1; id += 1; } count += 1; } tempDirectory.Delete(true); } if (subDirectories.Any()) { TjaProcessor tjaProcessor = new TjaProcessor(this._categoryId); foreach (DirectoryInfo subDirectory in subDirectories) { FileInfo tjaFile = subDirectory.GetTjaFile(); FileInfo musicFile = subDirectory.GetMusicFile(); Console.Write( $"[{count.ToString(format)}/{total.ToString()}] {Path.GetFileNameWithoutExtension(tjaFile.FullName)}.."); Song newSong = tjaProcessor.Process(tjaFile, id); if (newSong != null) { this._songs.Add(newSong); string outputPath = $"{this._outputDirectory.FullName}{Path.DirectorySeparatorChar}{id}"; Directory.CreateDirectory(outputPath); #if !DEBUG musicFile.CopyTo($"{outputPath}{Path.DirectorySeparatorChar}main.ogg", true); #endif tjaFile.CopyTo($"{outputPath}{Path.DirectorySeparatorChar}main.tja", true); if (this._generateMarkers) //behind a switch for now since I don't want to piss off my FTP server (yet) { HepburnConverter hepburn = new HepburnConverter(); string markerFile = $"{outputPath}{Path.DirectorySeparatorChar}{Path.GetFileNameWithoutExtension(WanaKana.ToRomaji(hepburn, tjaFile.FullName))}"; if (!File.Exists(markerFile)) { File.Create( markerFile); //create an empty file with the song name, just to keep shit organised } } Console.ForegroundColor = ConsoleColor.Green; Console.Write("OK! \n"); Console.ResetColor(); succesful += 1; id += 1; } count += 1; } } Console.WriteLine($"\nSuccesfully processed {succesful} songs out of {total}!"); string json = JsonSerializer.Serialize(this._songs); Console.WriteLine("Exporting json..."); File.WriteAllText($@"{this._outputDirectory}{Path.DirectorySeparatorChar}songs.json", json, Encoding.GetEncoding(932)); Console.WriteLine($"\nDone! Enjoy! Don't forget to import songs.json to mongoDB!"); }
public static bool ContainsJapanese(this string text) => WanaKana.IsMixed(text) || WanaKana.IsJapanese(text);
public void ToHiraganaWithoutPassRomaji() { var result = WanaKana.ToHiragana("only カナ"); Assert.Equal("おんly かな", result, StringComparer.InvariantCulture); }
public void IsRomajiResponsesMatch(string input, bool expectedResult) { Assert.Equal(expectedResult, WanaKana.IsRomaji(input)); }
public void IsRomajiWithOptionalAllowedCharsRegex() { var isRomaji = WanaKana.IsRomaji("a!b&cーd", new Regex("[!ー]")); Assert.True(isRomaji); }
public bool IsHiragana(string input) => WanaKana.IsHiragana(input);
public bool IsKatkana(string input) => WanaKana.IsKatakana(input);
//[TestCase("a!b&cーd", new Regex("[!ー]") ExpectedResult = true)] public bool IsRomaji(string input, Regex allowed = null) => WanaKana.IsRomaji(input, allowed);
public string StripOkurigana(string input, bool leading = false, string matchKanji = "") => WanaKana.StripOkurigana(input, leading, matchKanji);
//[TestCase("≪偽括弧≫", new Regex("[≪≫]") ExpectedResult = true)] public bool IsJapanese(string input, Regex allowed = null) => WanaKana.IsJapanese(input, allowed);
public void IsJapaneseAcceptsOptionalAllowedChars() { var isJapanese = WanaKana.IsJapanese("≪偽括弧≫", '[', '≪', '≫', ']'); Assert.True(isJapanese); }
public void IsJapaneseResponsesMatch(string input, bool expectedResult) { Assert.Equal(expectedResult, WanaKana.IsJapanese(input)); }
public void EmptyReturnsFalse() { Assert.False(WanaKana.IsRomaji(string.Empty)); }
public void IsKanaResponseMatches(string input, bool expectedResult) { Assert.Equal(expectedResult, WanaKana.IsKana(input)); }
public void IsRomajiWithOptionalAllowedChars() { var isRomaji = WanaKana.IsRomaji("a!b&cーd", '[', '!', 'ー', ']'); Assert.True(isRomaji); }
public void ToHiraganaWithMixedInput() { var result = WanaKana.ToHiragana("#22 22漢字、toukyou, オオサカ"); Assert.Equal("#22 22漢字、とうきょう、 おおさか", result, StringComparer.InvariantCulture); }
public bool IsKanji(string input) => WanaKana.IsKanji(input);
public void EmptyResultIsEmpty() { Assert.Empty(WanaKana.ToHiragana(string.Empty)); }