サンプル

Hylabel Discussion SDK

 1"""
 2Hylable Discussion のコース一覧を表示するサンプル
 3(c) 2023 Hylable Inc.
 4"""
 5
 6import argparse
 7from hylable import HDClient
 8
 9
10if __name__ == "__main__":
11    parser = argparse.ArgumentParser()
12    parser.add_argument("--profile", default="default")
13    args = parser.parse_args()
14
15    # Hylable Discussion とコミュニケーションするクライアントを作成
16    client = HDClient(args.profile)
17
18    print("コースの IDと登録メンバー数、コース名を表示")
19    for course in client.get_courses():
20        print(f"[{course.id}] ({len(course.members) :-3d}人) {course.name}")
 1"""
 2ディスカッションの詳細を取得して表示するサンプル
 3(c) 2023 Hylable Inc.
 4"""
 5
 6import argparse
 7import matplotlib.pyplot as plt
 8
 9from hylable import HDClient
10
11
12if __name__ == "__main__":
13    parser = argparse.ArgumentParser()
14    parser.add_argument("discussion_id", help="ディスカッションのID")
15    parser.add_argument("--profile", default="default")
16    args = parser.parse_args()
17
18    # Hylable Discussion とコミュニケーションするクライアントを作成
19    client = HDClient(args.profile)
20
21    # ディスカッションの情報を取得し、メンバー情報にメンバーのオブジェクトを追加
22    d = client.get_discussion(args.discussion_id)
23
24    # メンバーの名前などの情報を取得
25    for m in d.members:
26        try:
27            m['member'].sync_data(client)
28        except Exception:
29            m['member'].name = m['member'].id
30
31    # ディスカッションの詳細をテキストで
32    print(f"""
33    ID        : {d.id}
34    トピック  : {d.topic}
35    コメント  : {d.comment}
36    録音時刻  : {d.recordedAt.strftime('%Y-%m-%d %H:%M:%S')}
37    継続時間  : {d.duration_sec}秒
38    グループ名: {d.group_name}
39    メンバー  : {', '.join([f"{m['member'].name}({m['position']}度)" for m in d.members])}
40    """)
41
42    # 発話量の時間変化と総発話時間をグラフで表示
43    plt.subplot(2, 1, 1)
44    plt.imshow(d.frames['activity'].T, aspect="auto", interpolation="nearest", origin="lower")
45    plt.yticks(range(len(d.members)), [m['member'].name for m in d.members])
46    plt.title("発話量の時間変化")
47
48    plt.subplot(2, 1, 2)
49    plt.barh([m['member'].name for m in d.members], d.stats["tlot_ms"] / 1000)
50    plt.title("総発話時間[秒]")
51    plt.show()
 1"""
 2使用可能なレコーダーを一覧表示するサンプル
 3(c) 2023 Hylable Inc.
 4"""
 5import argparse
 6from hylable import HDClient
 7
 8
 9if __name__ == "__main__":
10    parser = argparse.ArgumentParser()
11    parser.add_argument("--profile", default="default")
12    args = parser.parse_args()
13
14    # Hylable Discussion とコミュニケーションするクライアントを作成
15    client = HDClient(args.profile)
16
17    # レコーダーの名前、状態、バージョンを表示
18    for r in sorted(client.get_recorders(), key=lambda r: r.name):
19        print(f"{r.name:<15} [{r.status:<12}] {r.version}")
 1"""
 2指定したレコーダーで計測を行い、自動的に停止するサンプル
 3(c) 2023 Hylable Inc.
 4"""
 5
 6import argparse
 7import time
 8
 9from hylable import HDClient
10
11
12if __name__ == "__main__":
13    parser = argparse.ArgumentParser()
14    parser.add_argument("--profile", default="default")
15    parser.add_argument("recorder", help="計測するレコーダーの名前")
16    parser.add_argument("duration", type=int, help="録音時間")
17    parser.add_argument("course_name", help="データを保存するコース名")
18    args = parser.parse_args()
19
20    # Hylable Discussion とコミュニケーションするクライアントを作成
21    client = HDClient(args.profile)
22
23    # 指定された名前と一致するレコーダーを探す
24    print("レコーダーを探しています...")
25    for recorder in client.get_recorders():
26        if recorder.name == args.recorder:
27            break
28    else:
29        raise ValueError(f"レコーダー {args.recorder} は見つかりませんでした。")
30
31    # 指定された名前と一致するコースを探す
32    print("保存先コースを探しています...")
33    for course in client.get_courses():
34        if course.name == args.course_name:
35            break
36    else:
37        raise ValueError(f"コース {args.course_name} は見つかりませんでした。")
38
39    # 計測開始の準備として、空のディスカッションを作成する
40    print("ディスカッションを作成しています...")
41    discussionobj = client.create_discussion(
42        course_id=course.id,
43        recorder=recorder
44    )
45
46    url = "https://discussion.hylable.com/#/course/%s/discussion/%s" % (
47        course.id, discussionobj.id
48    )
49    print("ディスカッションが作成されました。 URL はこちらです。")
50    print(url)
51
52    # 計測の開始
53    print("計測を開始します")
54    client.start_recording(discussionobj)
55
56    # 計測時間だけ待つ
57    print(f"{args.duration} 秒待機中...")
58    time.sleep(args.duration)
59
60    # 計測の停止
61    print("計測を停止します")
62    client.stop_recording([recorder])
 1"""
 2ディスカッションを更新するサンプル
 3(c) 2023 Hylable Inc.
 4"""
 5
 6import argparse
 7
 8from hylable import HDClient
 9
10
11if __name__ == "__main__":
12    parser = argparse.ArgumentParser()
13    parser.add_argument("discussion_id", help="更新したいディスカッションのID")
14    parser.add_argument("--profile", default="default")
15    args = parser.parse_args()
16
17    # Hylable Discussion とコミュニケーションするクライアントを作成
18    client = HDClient(args.profile)
19
20    # 更新したいディスカッションのオブジェクトを取得
21    # この `discussion` オブジェクトに変更を加えて、最後にアップデートする。
22    print("現在のディスカッションの取得")
23    discussion = client.get_discussion(args.discussion_id)
24
25    print("ディスカッションの変更")
26    # トピックとコメントを変更
27    discussion.topic = "新しいトピック"
28    discussion.comment = "新しいコメント"
29
30    # Ben と George というメンバーの Member オブジェクトを取得
31    # (メンバー登録がされていなければエラーになります)
32    member_names = ["Ben", "George"]
33    members = [
34        m for m in client.get_members() if m.name in member_names
35    ]
36
37    # Ben を 0度、 George を 180度に座席設定
38    discussion.members = [
39        {"position": "0", "member": members[0]},
40        {"position": "180", "member": members[1]},
41    ]
42
43    # アノテーションを追加
44    discussion.annotations = [
45        {"begin": 0, "end": 1000, "label": "hello 1"},
46        {"begin": 1500, "end": 3000, "label": "hello 2"},
47    ]
48
49    # 更新したディスカッションの情報をアップロード
50    print("変更したディスカッションの反映")
51    client.update_discussion(discussion)
 1"""
 2ディスカッションの音声認識(ASR)バッチ処理の完了を待ってから
 3Excel レポートを取得して保存するサンプル
 4
 5音声認識は音響分析(discussion.status)とは別の非同期バッチとして実行されるため、
 6status が completed でも音声認識が未完了のことがある。その状態で Excel レポートを取得すると
 7音声認識結果(発話テキスト)のシートが欠けてしまうため、wait_asr_done() で完了を待つ。
 8(c) 2026 Hylable Inc.
 9"""
10
11import argparse
12import pathlib
13import sys
14sys.path.append("..")
15from hylable import HDClient
16
17
18if __name__ == "__main__":
19    parser = argparse.ArgumentParser()
20    parser.add_argument("discussion_id", help="ディスカッションのID")
21    parser.add_argument("--profile", default="default")
22    parser.add_argument("--outfile", default="report.xlsx", help="保存先のファイル名")
23    args = parser.parse_args()
24
25    # Hylable Discussion とコミュニケーションするクライアントを作成
26    client = HDClient(args.profile)
27
28    # ディスカッションの情報を取得
29    d = client.get_discussion(args.discussion_id)
30
31    # 現在の音声認識バッチの状態を確認
32    print(f"音声認識の状態: {client.get_asr_state(d)}")
33
34    # 未実行(none)のとき音声認識を自動で起動してよいかを呼び出し側で判断する。
35    # ここではコースで音声認識が有効(runAsr)かつ音声があるディスカッションのみ対象にする
36    can_request_asr = bool(d.options.get("runAsr")) and d.duration_sec > 0
37
38    # 音声認識バッチが完了するまで待つ
39    # 既定では最大 1000 秒待ち、それを過ぎると状態 doing のまま戻る
40    state = client.wait_asr_done(d, request_if_needed=can_request_asr)
41    print(f"待機後の状態: {state}")
42
43    if state != "done":
44        # 状態が error のときは自動で再実行しないので、リトライしたいときは
45        # client.request_asr(d) を明示的に呼ぶ
46        sys.exit(f"音声認識が完了しませんでした(状態: {state})。レポートを取得しません。")
47
48    # 音声認識が完了したので Excel レポートを取得して保存
49    content = client.get_discussion_report(d, "dreport_export")
50    pathlib.Path(args.outfile).write_bytes(content)
51    print(f"保存しました: {args.outfile}")