{"id":46557880,"url":"https://github.com/ayutaz/dot-net-g2p","last_synced_at":"2026-03-10T06:08:57.219Z","repository":{"id":342283853,"uuid":"1169951179","full_name":"ayutaz/dot-net-g2p","owner":"ayutaz","description":"C#/.NET向け日英バイリンガルG2P（書記素→音素変換）ライブラリ。OpenJTalk互換パイプライン、CMU辞書+LTS、純C# MeCabエンジン搭載。Unity対応。","archived":false,"fork":false,"pushed_at":"2026-03-07T03:18:16.000Z","size":5047,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-07T10:41:40.518Z","etag":null,"topics":["csharp","dotnet","g2p","japanese","mecab","morphological-analysis","nlp","nuget","openjtalk","phoneme","text-to-speech","tts","unity"],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ayutaz.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-01T13:33:24.000Z","updated_at":"2026-03-07T03:15:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ayutaz/dot-net-g2p","commit_stats":null,"previous_names":["ayutaz/dot-net-g2p"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/ayutaz/dot-net-g2p","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ayutaz%2Fdot-net-g2p","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ayutaz%2Fdot-net-g2p/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ayutaz%2Fdot-net-g2p/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ayutaz%2Fdot-net-g2p/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ayutaz","download_url":"https://codeload.github.com/ayutaz/dot-net-g2p/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ayutaz%2Fdot-net-g2p/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30246872,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-08T05:41:50.788Z","status":"ssl_error","status_checked_at":"2026-03-08T05:41:39.075Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","dotnet","g2p","japanese","mecab","morphological-analysis","nlp","nuget","openjtalk","phoneme","text-to-speech","tts","unity"],"created_at":"2026-03-07T05:12:26.328Z","updated_at":"2026-03-08T06:01:13.719Z","avatar_url":"https://github.com/ayutaz.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DotNetG2P\n\n**日本語** | [English](README_EN.md) | [中文](README_ZH.md)\n\n[![CI](https://github.com/ayutaz/dot-net-g2p/actions/workflows/ci.yml/badge.svg)](https://github.com/ayutaz/dot-net-g2p/actions/workflows/ci.yml)\n[![NuGet](https://img.shields.io/nuget/v/DotNetG2P.svg)](https://www.nuget.org/packages/DotNetG2P)\n[![License: Apache-2.0](https://img.shields.io/badge/License-Apache--2.0-blue.svg)](LICENSE)\n\nC#/.NET向け日英多言語G2P（Grapheme-to-Phoneme: 書記素→音素変換）ライブラリ。\nOpenJTalk互換の日本語G2PパイプラインとCMU辞書ベースの英語G2PをC#でネイティブに再実装し、Pythonやネイティブバイナリへの依存なしに日英混在テキストを音素列に変換します。\n\n```csharp\nusing var engine = new G2PEngine(new MeCabTokenizer(\"/path/to/naist-jdic\"));\n\nengine.ToPhonemes(\"こんにちは\");  // =\u003e \"k o N n i ch i w a\"\nengine.ToKana(\"音声合成\");        // =\u003e \"オンセーゴーセー\"\n\n// 英語G2P\nusing var enEngine = new EnglishG2PEngine();\nenEngine.ToPhonemes(\"hello world\");  // =\u003e \"HH AH0 L OW1 W ER1 L D\"\n\n// 日英混在テキスト\nusing var multiEngine = new MultilingualG2PEngine(\"/path/to/naist-jdic\");\nmultiEngine.ToPhonemes(\"私はhelloと言った\");  // 日本語部分は日本語音素、英語部分はARPAbet\n```\n\n## 目次\n\n- [特徴](#特徴)\n- [インストール](#インストール)\n- [クイックスタート](#クイックスタート)\n- [API リファレンス](#api-リファレンス)\n- [処理パイプライン](#処理パイプライン)\n- [辞書の準備](#辞書の準備)\n- [オプション設定](#オプション設定)\n- [ビルド](#ビルド)\n- [スレッドセーフティ](#スレッドセーフティ)\n- [ライセンス](#ライセンス)\n\n## 特徴\n\n- **純C#実装** — ネイティブバイナリ不要、独自MeCabエンジン（`DotNetG2P.MeCab`）によりNuGetパッケージ依存なし（実行時に[naist-jdic辞書](#辞書の準備)が必要）\n- **OpenJTalk互換パイプライン** — 発音生成・数字読み・アクセント句結合・アクセント結合型・無声音化の6段階NJD処理\n- **複数の出力形式** — 音素列 / カタカナ / ESPnet韻律記号 / VOICEVOX互換AccentPhrase / HTSフルコンテキストラベル / 韻律特徴量（A1/A2/A3）\n- **Unity対応** — .NET Standard 2.1（Unity 2021.2+）ターゲット、UPMパッケージ提供\n- **拡張可能な設計** — `ITokenizer`インターフェースにより形態素解析エンジンを差し替え可能\n- **英語G2P対応** — CMU辞書（135,000語）+ Flite LTSルールによるOOV推定、IPA/X-SAMPA出力、テキスト正規化、同綴異音語解決\n- **日英混在テキスト対応** — Unicode文字種ベースの自動言語判定・セグメント分割により、日英が混在するテキストをシームレスに処理\n\n## インストール\n\n### NuGet\n\n```bash\n# コアライブラリ + 独自MeCabエンジン（日本語G2P）\ndotnet add package DotNetG2P\ndotnet add package DotNetG2P.MeCab\n\n# 英語G2P\ndotnet add package DotNetG2P.English\n\n# 日英混在テキスト対応\ndotnet add package DotNetG2P.Multilingual\n```\n\n### パッケージ構成\n\n| パッケージ | ライセンス | 説明 |\n|-----------|-----------|------|\n| `DotNetG2P` | Apache-2.0 | コアライブラリ（G2Pエンジン、NJD処理、音素変換） |\n| `DotNetG2P.MeCab` | Apache-2.0 | 独自MeCabエンジン（外部依存なし） |\n| `DotNetG2P.English` | Apache-2.0 | 英語G2Pエンジン（CMU辞書 + LTSルール） |\n| `DotNetG2P.Multilingual` | Apache-2.0 | 多言語G2Pエンジン（日英混在テキスト対応） |\n\n### Unity (UPM)\n\nUnity Package Managerの **Add package from git URL** で以下を追加:\n\n```\nhttps://github.com/ayutaz/dot-net-g2p.git?path=src/DotNetG2P.Core\nhttps://github.com/ayutaz/dot-net-g2p.git?path=src/DotNetG2P.MeCab\nhttps://github.com/ayutaz/dot-net-g2p.git?path=src/DotNetG2P.English\nhttps://github.com/ayutaz/dot-net-g2p.git?path=src/DotNetG2P.Multilingual\n```\n\n\u003e **Note:** 別途 naist-jdic 辞書が必要です。詳細は[辞書の準備](#辞書の準備)を参照してください。\n\n## クイックスタート\n\n```csharp\nusing DotNetG2P;\nusing DotNetG2P.MeCab;\n\n// 1. エンジン初期化（辞書パスを指定）\nusing var tokenizer = new MeCabTokenizer(\"/path/to/naist-jdic\");\nusing var engine = new G2PEngine(tokenizer);\n\n// 2. テキストから音素列を取得\nstring phonemes = engine.ToPhonemes(\"今日は良い天気です\");\n// =\u003e \"ky o o w a i i t e N k i d e s U\"\n\n// 3. カタカナ読みを取得\nstring kana = engine.ToKana(\"今日は良い天気です\");\n// =\u003e \"キョーワイーテンキデス\"\n\n// 4. 韻律記号付き出力（ESPnet方式）\nstring prosody = engine.ToProsody(\"こんにちは\");\n// =\u003e \"^ k o [ N n i ch i w a $\"\n\n// 5. VOICEVOX互換アクセント句\nvar phrases = engine.ToAccentPhrases(\"こんにちは\");\n\n// 6. HTSフルコンテキストラベル（HMM/DNN音声合成用）\nvar labels = engine.ToFullContextLabels(\"こんにちは\");\n\n// 7. 韻律特徴量（音素単位のA1/A2/A3、uPiper等の音声合成エンジン向け）\nvar features = engine.ToProsodyFeatures(\"こんにちは\");\n// features.Phonemes: [\"sil\",\"k\",\"o\",\"N\",\"n\",\"i\",\"ch\",\"i\",\"w\",\"a\",\"sil\"]\n// features.A1, A2, A3: 各音素のアクセント位置情報\n\n// === 英語G2P ===\nusing DotNetG2P.English;\n\nusing var enEngine = new EnglishG2PEngine();\nstring enPhonemes = enEngine.ToPhonemes(\"hello world\");\n// =\u003e \"HH AH0 L OW1 W ER1 L D\"\n\n// === 日英混在テキスト ===\nusing DotNetG2P.Multilingual;\n\nusing var multiEngine = new MultilingualG2PEngine(\"/path/to/naist-jdic\");\nstring mixed = multiEngine.ToPhonemes(\"今日はgood dayです\");\n// 日本語部分→日本語音素、英語部分→ARPAbet音素\n\nvar segments = multiEngine.ToSegments(\"今日はgood dayです\");\n// 言語タグ付きセグメントリスト\n```\n\n## API リファレンス\n\n### G2PEngine\n\n| メソッド | 戻り値型 | 説明 |\n|---------|---------|------|\n| `ToPhonemes(text)` | `string` | 空白区切り音素列 (`\"k o N n i ch i w a\"`) |\n| `ToKana(text)` | `string` | カタカナ読み (`\"コンニチワ\"`) |\n| `ToProsody(text)` | `string` | ESPnet韻律記号付き (`\"^ k o [ N n i ch i w a $\"`) |\n| `ToAccentPhrases(text)` | `IReadOnlyList\u003cAccentPhrase\u003e` | VOICEVOX互換アクセント句構造体 |\n| `ToFullContextLabels(text)` | `IReadOnlyList\u003cstring\u003e` | HTSフルコンテキストラベル |\n| `ToProsodyFeatures(text)` | `ProsodyFeatures` | 韻律特徴量（音素単位のA1/A2/A3） |\n| `Analyze(text)` | `IReadOnlyList\u003cNjdNode\u003e` | NJD処理後のノード列 |\n| `ToPhonemesBatch(texts)` | `IReadOnlyList\u003cstring\u003e` | 複数テキストを一括で音素列に変換 |\n| `ToKanaBatch(texts)` | `IReadOnlyList\u003cstring\u003e` | 複数テキストを一括でカタカナ読みに変換 |\n| `ToProsodyBatch(texts)` | `IReadOnlyList\u003cstring\u003e` | 複数テキストを一括で韻律記号付きに変換 |\n| `ToFullContextLabelsBatch(texts)` | `IReadOnlyList\u003cIReadOnlyList\u003cstring\u003e\u003e` | 複数テキストを一括でHTSラベルに変換 |\n| `ToProsodyFeaturesBatch(texts)` | `IReadOnlyList\u003cProsodyFeatures\u003e` | 複数テキストを一括で韻律特徴量に変換 |\n\n### EnglishG2PEngine\n\n| メソッド | 戻り値型 | 説明 |\n|---------|---------|------|\n| `ToPhonemes(text)` | `string` | ARPAbet音素列 (`\"HH AH0 L OW1\"`) |\n| `ToIPA(text)` | `string` | IPA表記 |\n| `ToPhonemeList(text)` | `IReadOnlyList\u003cEnglishPhoneme\u003e` | 構造化音素リスト |\n| `LookupWord(word)` | `IReadOnlyList\u003cEnglishPhoneme\u003e` | 単語ルックアップ |\n| `ContainsWord(word)` | `bool` | 辞書存在確認 |\n\n### MultilingualG2PEngine\n\n| メソッド | 戻り値型 | 説明 |\n|---------|---------|------|\n| `ToPhonemes(text)` | `string` | 日英混在音素列 |\n| `ToSegments(text)` | `IReadOnlyList\u003cG2PSegment\u003e` | 言語タグ付きセグメント |\n| `ToPhonemesBatch(texts)` | `IReadOnlyList\u003cstring\u003e` | バッチ音素変換 |\n| `ToSegmentsBatch(texts)` | `IReadOnlyList\u003cIReadOnlyList\u003cG2PSegment\u003e\u003e` | バッチセグメント変換 |\n\n### 日本語音素体系\n\n| 種別 | 音素 |\n|------|------|\n| 母音 | `a` `i` `u` `e` `o` （無声: `A` `I` `U` `E` `O`） |\n| 子音 | `k` `g` `s` `z` `t` `d` `n` `h` `b` `p` `m` `r` `f` `v` |\n| 拗音子音 | `ky` `gy` `sh` `j` `ch` `ts` `ny` `hy` `by` `py` `my` `ry` `dy` `ty` `kw` `gw` |\n| 半母音 | `y` `w` |\n| 特殊 | `N`（撥音） `cl`（促音） `-`（長音） `pau`（ポーズ） |\n\n## 処理パイプライン\n\nDotNetG2Pは[OpenJTalk](https://open-jtalk.sourceforge.net/)と同等の6段階NJD処理パイプラインを実装しています。\n\n```\nテキスト入力\n  │\n  ├─ TextNormalizer        全角/半角正規化、濁点結合\n  ├─ ITokenizer.Tokenize   形態素解析（MeCabTokenizer + naist-jdic）\n  ├─ SetPronunciation      辞書読み・フォールバック発音生成\n  ├─ SetDigit              数字列検出・助数詞読み変換\n  ├─ SetAccentPhrase       品詞パターンによるアクセント句結合（18ルール）\n  ├─ SetAccentType         チェインルールによるアクセント結合型決定\n  └─ SetUnvoicedVowel      無声母音化（6ルール）\n  │\n  ▼\n  出力（音素列 / カタカナ / 韻律記号 / AccentPhrase / HTSラベル / 韻律特徴量）\n```\n\n## 辞書の準備\n\nDotNetG2Pは形態素解析にnaist-jdic辞書（OpenJTalk用MeCab辞書）を使用します。\n\n### 入手方法\n\n1. [Open JTalk公式サイト](https://open-jtalk.sourceforge.net/)からダウンロード\n2. pyopenjtalkやOpenJTalkに同梱の辞書ディレクトリをそのまま使用\n\n### 必要なファイル\n\n辞書ディレクトリに以下の4ファイルが含まれている必要があります:\n\n| ファイル | 内容 |\n|---------|------|\n| `sys.dic` | システム辞書 |\n| `matrix.bin` | 遷移コスト行列 |\n| `char.bin` | 文字カテゴリ定義 |\n| `unk.dic` | 未知語テンプレート |\n\n### Unity での配置\n\nUnityでは `StreamingAssets` フォルダに辞書ファイルを配置し、`Application.streamingAssetsPath` を使用してパスを指定します。\n\n```csharp\nvar dicPath = Path.Combine(Application.streamingAssetsPath, \"naist-jdic\");\nusing var tokenizer = new MeCabTokenizer(dicPath);\n```\n\n## オプション設定\n\n`G2POptions` で各処理段階を個別にON/OFFできます（イミュータブル設計）。\n\n```csharp\n// 無声音化のみ無効にする例\nvar options = new G2POptions(enableUnvoicedVowel: false);\nusing var engine = new G2PEngine(tokenizer, options);\n```\n\n| パラメータ | デフォルト | 説明 |\n|-----------|-----------|------|\n| `enableTextNormalization` | `true` | テキスト正規化（全角/半角変換） |\n| `enableDigitProcessing` | `true` | 数字読み変換・助数詞処理 |\n| `enableAccentPhrase` | `true` | アクセント句結合（18ルール） |\n| `enableAccentType` | `true` | アクセント結合型決定 |\n| `enableUnvoicedVowel` | `true` | 無声母音化（6ルール） |\n| `expandLongVowels` | `true` | 長音を母音繰り返しで出力（`false`=`\"-\"`記号を使用） |\n\n## ビルド\n\n### 要件\n\n- .NET SDK 9.0 以上\n\n### コマンド\n\n```bash\n# ビルド\ndotnet build DotNetG2P.slnx\n\n# テスト実行\ndotnet test DotNetG2P.slnx\n\n# コンソールサンプル（辞書なし: MoraMappingのみ確認）\ndotnet run --project samples/DotNetG2P.Console\n\n# コンソールサンプル（辞書あり: フルG2P）\ndotnet run --project samples/DotNetG2P.Console -- /path/to/naist-jdic\n```\n\n## スレッドセーフティ\n\n`G2PEngine` および `MeCabTokenizer` はスレッドセーフではありません。\nマルチスレッド環境では、スレッドごとにインスタンスを作成してください。\n\n辞書データ（`DictionaryBundle`）は内部でWeakReferenceキャッシュにより自動的に共有されるため、\n複数インスタンスを作成してもメモリ使用量は最小限に抑えられます。\n\n## ライセンス\n\n| パッケージ | ライセンス | 備考 |\n|-----------|-----------|------|\n| **DotNetG2P** | [Apache-2.0](LICENSE) | コアライブラリ |\n| **DotNetG2P.MeCab** | [Apache-2.0](LICENSE) | 独自MeCabエンジン |\n| **DotNetG2P.English** | [Apache-2.0](LICENSE) | 英語G2Pエンジン |\n| **DotNetG2P.Multilingual** | [Apache-2.0](LICENSE) | 多言語G2Pエンジン |\n\n全コンポーネントが**Apache-2.0ライセンス**で利用可能です。\nサードパーティコンポーネントのライセンスについては [NOTICE](NOTICE) ファイルを参照してください。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fayutaz%2Fdot-net-g2p","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fayutaz%2Fdot-net-g2p","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fayutaz%2Fdot-net-g2p/lists"}