-
Notifications
You must be signed in to change notification settings - Fork 119
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
C++音声合成ライブラリの追加 #87
C++音声合成ライブラリの追加 #87
Conversation
プルリクエスト作成ありがとうございます!!!!! |
Mac で検証してみました。ビルド・実行の過程で2点つまづいたところがあって、それを解消すると問題の「正しくないと思われるノイズ音声」が生成されました。
|
Windowsのcl.exeで試していたのですが、LoadLibraryが突破できませんでした。。 FILEが見つからないエラー → @PickledChair さんの方法で解決 kana_parser.cppでstd::runtime_errorが無いエラー #include <algorithm>
#include <stdexcept> LoadLibraryのエラー内容は |
同じくcl.exeで試してみました。 Pythonのctypesで実行してみましたが、ヘッダー以外空のwavファイルが出力されました。 ctypes実装import argparse
import os
from ctypes import CDLL, POINTER, c_bool, c_char_p, c_int, c_int64, c_char
from pathlib import Path
class CppEngine:
def __init__(self, root_dir: Path, openjtalk_dir: Path):
self.core = CDLL(str((root_dir/"core.dll").resolve(strict=True)))
self.core.initialize.restype = c_bool
self.core.initialize_openjtalk.argtypes = (c_char_p,)
self.core.initialize_openjtalk.restype = c_bool
self.core.tts.argtypes = (c_char_p, POINTER(c_int64), POINTER(c_int))
self.core.tts.restype = POINTER(c_char)
cwd = os.getcwd()
os.chdir(root_dir)
init_core = self.core.initialize(".", False, None)
os.chdir(cwd)
assert init_core
init_ojt = self.core.initialize_openjtalk(c_char_p(str(openjtalk_dir).encode()))
assert init_ojt
def tts(self, text: str, speaker_id: int):
binary_size = POINTER(c_int)(c_int(0))
return self.core.tts(
c_char_p(text.encode()),
c_int64(speaker_id),
binary_size
), binary_size
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--root_dir", type=Path)
parser.add_argument("--openjtalk_dir", type=Path)
parser.add_argument("--text", type=str)
parser.add_argument("--speaker_id", type=int)
args = parser.parse_args()
engine = CppEngine(args.root_dir, args.openjtalk_dir)
tts_ret, bin_size = engine.tts(args.text, args.speaker_id)
data = b""
for i in range(bin_size.contents.value):
data += tts_ret[i]
with open("test.wav", mode="wb") as f:
f.write(data) |
jpcommonのためのコードを入れておいたはずが、clang-formatで移動させられて機能していなかったようです。 今のところ、エラーハンドリングやWindowsでの手元での動作確認が取れていない等まだ課題が残っているので、Draftは外さずに置いておきます。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
コード見てみましたが恐らく動かなくなっている原因となっているところがありました。
また随所にGCのある言語のようなノリで書かれてると思われるコードが散見されました。
C++でこれをやってしまうとメモリリークやアクセス領域違反があり大変危険な状態です。
まだあるかもしれません。
おっしゃる通りと思われます。 このPRがDraftなのは、エラーハンドリング周りが完全でないことだけでなく、そういった非常識で危険なコードを修正するためでもあります。 追記: OpenJTalk周りのコードはpyopenjtalkのコードの流用であるため、特に深い意味はありません。とはいえ深い意味がないが使っているというのは危険なコードではあると思うので、正しいように直せたら良いなと思います。 |
@y-chan suggestionも考えたのですがちょっと広範になりそうなのでとりあえず今思ってることで良いので各コメントに対して返信していただけますか? |
@qwerty2501 さん 戦略ですが、一旦マージしてしまえば各々がプルリクエストを送ることができるので、マージを最優先に考えています。 |
なので、指摘箇所のうちすぐ直せる部分は直していただきつつ、難しいところはFIXMEコメントを足した状態にできればdraftを外していただければ・・・! |
コメントしましたがmergeのタイミングはお任せします |
個人的には @qwerty2501 さんにコメント頂いた2箇所を修正 or FIXMEコメント追加頂ければ一旦マージしたいですね・・・!! |
とりあえず別ブランチとしてマージするのがいいと思います! |
私もそう思いました! |
とりあえず現状指摘のあった
と、その他のリファクタ(warningの解消やformat)を改善しました。 |
コメントしましたがLGTMです。 |
Co-authored-by: qwerty2501 <939468+qwerty2501@users.noreply.github.com>
Co-authored-by: qwerty2501 <939468+qwerty2501@users.noreply.github.com>
Co-authored-by: takana-v <44311840+takana-v@users.noreply.github.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!!!
コメント、僕もとても勉強になりました。
さすがに初手で完璧なのはなかなかなく、いろんな改善点があるのかもしれません。
どんどん良くしていければ嬉しいです、プルリクエストお待ちしています!!
内容
今のところ動きませんとりあえず動くようになりましたwavの生成周りは多分うまくいっていますが、それを実際に実行(https://gist.github.com/y-chan/5d09177b3771bd17bfa946623b1fd905 )してみるとうまく行きません...(正しくないと思われるノイズ音声が再生されます)https://gist.github.com/y-chan/5d09177b3771bd17bfa946623b1fd905 に実行のためのファイルと説明を置いておいたので、良ければ検証にご利用ください。
関連 Issue
ref #43