예제 #1
0
 public void KatakanaToRomaji()
 {
     foreach (var(_, katakana, romaji) in ConversionTables.HiraganaKatakanaToRomaji)
     {
         if (!string.IsNullOrEmpty(katakana))
         {
             var result = WanaKana.ToRomaji(katakana);
             Assert.Equal(romaji, result);
         }
     }
 }
예제 #2
0
        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));
            }
        }
예제 #3
0
 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(" ", ""));
 }
예제 #4
0
        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(" ", ""));
                });
            });
        }
예제 #5
0
        /// <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);
        }
예제 #6
0
        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));
        }
예제 #7
0
        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);
        }
예제 #8
0
        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));
        }
예제 #9
0
        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));
        }
예제 #10
0
 public void EmptyInput()
 {
     Assert.Empty(WanaKana.Tokenize(string.Empty));
 }
예제 #11
0
        public void IsJapaneseAcceptsOptionalAllowedCharsRegex()
        {
            var isJapanese = WanaKana.IsJapanese("≪偽括弧≫", new Regex("[≪≫]"));

            Assert.True(isJapanese);
        }
예제 #12
0
 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!");
        }
예제 #14
0
 public static bool ContainsJapanese(this string text) => WanaKana.IsMixed(text) || WanaKana.IsJapanese(text);
예제 #15
0
        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);
        }
예제 #18
0
 public bool IsHiragana(string input) => WanaKana.IsHiragana(input);
예제 #19
0
 public bool IsKatkana(string input) => WanaKana.IsKatakana(input);
예제 #20
0
 //[TestCase("a!b&cーd", new Regex("[!ー]") ExpectedResult = true)]
 public bool IsRomaji(string input, Regex allowed = null) => WanaKana.IsRomaji(input, allowed);
예제 #21
0
 public string StripOkurigana(string input, bool leading = false, string matchKanji = "") => WanaKana.StripOkurigana(input, leading, matchKanji);
예제 #22
0
 //[TestCase("≪偽括弧≫", new Regex("[≪≫]") ExpectedResult = true)]
 public bool IsJapanese(string input, Regex allowed = null) => WanaKana.IsJapanese(input, allowed);
예제 #23
0
        public void IsJapaneseAcceptsOptionalAllowedChars()
        {
            var isJapanese = WanaKana.IsJapanese("≪偽括弧≫", '[', '≪', '≫', ']');

            Assert.True(isJapanese);
        }
예제 #24
0
 public void IsJapaneseResponsesMatch(string input, bool expectedResult)
 {
     Assert.Equal(expectedResult, WanaKana.IsJapanese(input));
 }
 public void EmptyReturnsFalse()
 {
     Assert.False(WanaKana.IsRomaji(string.Empty));
 }
예제 #26
0
 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);
        }
예제 #28
0
        public void ToHiraganaWithMixedInput()
        {
            var result = WanaKana.ToHiragana("#22 22漢字、toukyou, オオサカ");

            Assert.Equal("#22 22漢字、とうきょう、 おおさか", result, StringComparer.InvariantCulture);
        }
예제 #29
0
 public bool IsKanji(string input) => WanaKana.IsKanji(input);
예제 #30
0
 public void EmptyResultIsEmpty()
 {
     Assert.Empty(WanaKana.ToHiragana(string.Empty));
 }