{% extends "base.html" %} {% from "fragments/_chips.html" import chip %} {% block title %}Voxint — {{ speaker.display_name }}{% endblock %} {% block cb_breadcrumb %}speakers / {{ speaker.display_name|lower|replace(" ", "-") }}{% endblock %} {% block cb_summary %} {%- if aggregate.verified %}{{ chip("verified by you") }}{% elif aggregate.files > 0 %}{{ chip("needs you") }}{% endif -%} {% endblock %} {% block cb_actions %} {% if not archived %} Edit profile
Merge ▾

Merge this speaker into another from their profile page.

{% endif %} {% endblock %} {% block body %} {% if archived %} {% endif %}
{{ (speaker.display_name or "?")[:2]|upper }}

{{ speaker.display_name }}

{% set bio = profile.get("bio") %} {% set affiliation = profile.get("affiliation") %} {% if bio or affiliation %}

{% if bio %}{{ bio.value }}{% endif %}{% if bio and affiliation %}, {% endif %}{% if affiliation %}{{ affiliation.value }}{% endif %}

{% endif %}
{{ aggregate.files }}
RECORDINGS
{{ format_duration(aggregate.seconds) }}
SPEAKING TIME
{{ aggregate.segments }}
SEGMENTS
{%- if tier.tier -%} {%- set best = tier.evidence|map(attribute="similarity")|select("number")|list -%} {%- if best -%} {%- set pct = (best|max * 100)|round|int -%} {{ pct }}% {%- else -%}–{%- endif -%} {%- else -%}–{%- endif -%}
AVG MATCH
{% if aggregate.first_seen %}{{ aggregate.first_seen.strftime("%b %d") }}{% else %}–{% endif %}
FIRST HEARD
{% if aggregate.last_seen %}{{ aggregate.last_seen.strftime("%b %d") }}{% else %}–{% endif %}
LAST HEARD
{% if insights %}

INSIGHTS

{% if insights.distinctive_terms %}

DISTINCTIVE VOCABULARY

Based on {{ "{:,}".format(insights.speaker_token_count) }} words across {{ insights.recording_count }} recording{{ "s" if insights.recording_count != 1 else "" }}

{%- set max_z = insights.distinctive_terms[0].z_score if insights.distinctive_terms and insights.distinctive_terms[0].z_score else 1 -%} {% for t in insights.distinctive_terms[:20] %} {{ t.term }} {{ t.count }} {% endfor %}
{% endif %} {% if insights.ego_transitions_in or insights.ego_transitions_out %}

CONVERSATION PARTNERS

{% if insights.ego_transitions_in %}

SPEAKS BEFORE {{ speaker.display_name|upper }}

{% for edge in insights.ego_transitions_in[:8] %}
{{ edge.speaker_name or "Unknown" }} {{ edge.count }}
{% endfor %}
{% endif %} {% if insights.ego_transitions_out %}

{{ speaker.display_name|upper }} SPEAKS BEFORE

{% for edge in insights.ego_transitions_out[:8] %}
{{ edge.speaker_name or "Unknown" }} {{ edge.count }}
{% endfor %}
{% endif %}
{% endif %} {% if insights.wpm is not none %}

SPEAKING PACE

{{ insights.wpm|round|int }} words/min
{% if insights.wpm_timed_segments < insights.wpm_total_segments %}

Based on {{ insights.wpm_timed_segments }} of {{ insights.wpm_total_segments }} segments with word-level timing

{% endif %}
{% endif %}

All quotes by {{ speaker.display_name }} in Explore →

{% elif not archived and insights_eligible %}

INSIGHTS

Speaker insights are being computed. Refresh to check.

{% elif not archived and aggregate.files > 0 and not insights_eligible %}

INSIGHTS

Not enough data for speaker insights. This speaker needs at least 2 recordings with substantial speech.

{% endif %} {% include "speakers/profile_panel.html" %} {% if not archived %} {% include "speakers/research.html" %} {% endif %}

HEARD IN

{% if aggregate.appearances %}
RECORDING FOLDER SPOKE SEGMENTS MATCH
{% for a in aggregate.appearances %}
{% if runs_by_id.get(a.run_id) %} {{ run_source_title(runs_by_id[a.run_id]) }} {% else %}recording removed{% endif %} {% if a.human_assigned %}{{ chip("verified") }}{% endif %} {%- set run = runs_by_id.get(a.run_id) -%} {%- if run and run.media_item and run.media_item.media_folder -%} {{ run.media_item.media_folder.path }} {%- else -%}{%- endif -%} {{ format_duration(a.seconds) }} {{ a.segments }} {%- if a.similarity is defined and a.similarity is not none -%} {%- set pct = (a.similarity * 100)|round|int -%} {{ pct }}% {%- else -%}{%- endif -%} {% if runs_by_id.get(a.run_id) %} Open → {% endif %}
{% endfor %}
{% else %}

Not heard in any processed recording yet.

{% endif %}
{% if tier.has_voice_evidence %}
Voice match details

{{ tier.strong }} strong, {{ tier.moderate }} moderate, {{ tier.weak }} weak{% if tier.unavailable %}, {{ tier.unavailable }} without recorded numbers{% endif %} — graded against the current gates (strong needs cosine ≥ {{ "%.2f"|format(gates.grounded_min_cosine) }}, margin ≥ {{ "%.2f"|format(gates.grounded_min_margin) }}, vote agreement ≥ {{ "%.2f"|format(gates.grounded_min_vote_agreement) }}; moderate needs cosine ≥ {{ "%.2f"|format(gates.min_cosine) }}, margin ≥ {{ "%.2f"|format(gates.min_margin) }}, vote agreement ≥ {{ "%.2f"|format(gates.min_vote_agreement) }}).

{% endif %} {% endblock %}