File size: 7,587 Bytes
8713346
 
 
 
 
 
 
f06e713
8713346
 
f06e713
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8713346
 
 
 
1025131
c1d9eec
 
 
 
 
 
 
 
4981d25
c1d9eec
635acfc
c1d9eec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8713346
 
f06e713
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8713346
 
f06e713
 
 
8713346
 
f06e713
8713346
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f06e713
 
8713346
 
 
 
f06e713
8713346
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Audio Input with Tabs and Features</title>
  <style>
    .hidden {
      display: none !important;
    }

    b-dot {
      opacity: 0;
      animation: blink 1.5s infinite;
    }

    b-dot:nth-child(1) { animation-delay: 0s; }
    b-dot:nth-child(2) { animation-delay: 0.5s; }
    b-dot:nth-child(3) { animation-delay: 1s; }

    @keyframes blink {
      0%, 100% { opacity: 0; }
      20%, 40% { opacity: 1; }
    }

    #modelType {
      appearance: none;
      background: #e9ecef;
      border-radius: 10px;
      position: relative;
      outline: none;
      transition: background 0.3s;
    }
    #modelType:checked {
      background: #ffd700;
    }
    #modelType::before {
      content: '';
      display: block;
      width: 18px;
      height: 18px;
      background: #fff;
      border-radius: 50%;
      position: absolute;
      left: 1px;
      top: 1px;
      transition: left 0.3s;
    }
    #modelType:checked::before {
      left: 21px;
    }
    label:has(#modelType:disabled), label:has(#modelType:disabled) * {
      cursor: not-allowed !important;
    }
  </style>
</head>
<body style="font-family: 'Source Sans Pro', sans-serif; background-color: #f9fafb; color: #333; display: flex; flex-direction: column; align-items: center; height: 100vh; margin: 0;">

  <div style="width: 100%; max-width: 900px; margin-bottom: 1.5rem; background: #fff; padding: 1.5rem; border-radius: 8px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); text-align: left; font-size: 0.9rem; color: #6c757d;">
    <h2 style="margin:0 0 6px 0;">🐊 Welcome to Kroko</h2>

    <p style="margin:6px 0;">
      Fast, on-device speech-to-text with streaming performance. Pick what fits your project:
    </p>

    <ul style="margin:6px 0 10px 20px; padding:0;">
      <li><strong>Community models</strong> β€” completely free to use. Lower-cost/size and quality, great for experiments and demos.</li>
      <li style="margin-top:6px;"><strong>Pro models</strong> β€” higher quality / lower latency. Two ways to use them:
        <ul style="margin:6px 0 0 18px; padding:0;">
          <li><strong>Personal / Hobbyist:</strong> you can get a Pro key and use Pro models <em>free</em> for non-commercial projects.</li>
          <li><strong>Commercial:</strong> paid plans are available (trials offered) if you need Pro models for commercial use.</li>
        </ul>
      </li>
    </ul>

    <p style="margin:8px 0;"><strong>Get a Pro key:</strong></p>
    <ol style="margin:6px 0 12px 20px; padding:0;">
      <li>Visit <a href="https://app.kroko.ai" target="_blank" rel="noopener">app.kroko.ai</a>.</li>
      <li>Log in or sign up, open the <em>On premise</em> page, and request your free Pro key or trial for commercial needs.</li>
      <li>Paste the key into this demo to try Pro models.</li>
    </ol>

    <p style="margin:6px 0 0 0; font-size:13px; color:#333;">
      Need help or want to connect?  
      πŸ’¬ Join our <a href="https://discord.gg/JT7wdtnK79" target="_blank" rel="noopener">Discord community</a> β€’  
      🌐 Visit our <a href="https://kroko.ai" target="_blank" rel="noopener">website</a> β€’  
      πŸ’» Check out our <a href="https://github.com/kroko-ai" target="_blank" rel="noopener">GitHub</a>.
    </p>

  </div>

  <div style="width: 100%; max-width: 900px; background: #fff; padding: 1.5rem; border-radius: 8px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); flex: 1;">

    <div id="selectLanguageContent" class="hidden">
      <div style="font-size: 1rem; font-weight: bold; padding: 0.5rem 1rem; background-color: #f8f9fa; border-radius: 8px; color: #6c757d;">Languages &amp; models</div>

      <div style="margin: 1rem 0; text-align: center; display: flex; justify-content: center; gap: 1rem; flex-wrap: wrap;">
        <label style="display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.5rem 1rem; border: 1px solid #ced4da; border-radius: 4px; cursor: pointer;">
          <span style="display: flex; align-items: center; gap: 0.5rem;">🌐</span>
          <select id="languageSelect" name="language" style="border: none; background: transparent; font-size: 1rem; padding: 0.5rem 1rem; outline: none; cursor: pointer;">
            <option value="" selected disabled>Select a language</option>
          </select>
        </label>
        <label style="display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.5rem 1rem; border: 1px solid #ced4da; border-radius: 4px; cursor: pointer;" title="Pro models are not available here yet">
          <span>Community</span>
          <input type="checkbox" id="modelType" style="width: 40px; height: 20px; accent-color: goldenrod;" disabled>
          <span>Pro</span>
        </label>
      </div>

      <div id="modelList" style="display: flex; flex-direction: column; gap: 1rem; padding: 0.5rem 1rem;"></div>
    </div>

    <div id="selectedModelContent" class="hidden">
      <div style="font-size: 1rem; font-weight: bold; padding: 0.5rem 1rem; background-color: #f8f9fa; border-radius: 8px; color: #6c757d;">Selected model</div>
      <div id="selectedModel" style="display: flex; flex-direction: column; gap: 1rem; padding: 0.5rem 1rem;"></div>
    </div>

    <div id="singleAudioContent" class="hidden">
      <div style="display: flex; gap: 1.5rem;">
        <div style="flex: 1; display: flex; flex-direction: column; gap: 1rem;">
          <div style="font-size: 1rem; font-weight: bold; padding: 0.5rem 1rem; background-color: #f8f9fa; border-radius: 8px; display: flex; align-items: center; gap: 0.5rem; color: #6c757d;">
            <span style="line-height: 1;">🎡</span> Input
          </div>

          <div id="dropzone" style="border: 2px dashed #ced4da; border-radius: 8px; padding: 2rem; text-align: center; color: #6c757d; cursor: pointer; background-color: #f8f9fa; transition: background-color 0.3s, border-color 0.3s; position: relative;">
            <input type="file" id="fileInput" accept="audio/*" style="position: absolute; top: 0; left: 0; opacity: 0; width: 100%; height: 100%; cursor: pointer;" />
            <p style="margin: 0;">Drop Audio Here<br>- or -<br>Click to Upload</p>
          </div>

          <button id="recordBtn" style="padding: 0.5rem 1rem; border: 1px solid #e9ecef; border-radius: 4px; background-color: #fff; color: #d9534f; cursor: pointer; font-size: 1rem;">
            <span style="font-size: 0.8rem; border-radius: 50%; background-color: #d9534f; width: 10px; height: 10px; display: inline-block;"></span>
            Use Microphone
          </button>
        </div>

        <div style="flex: 1; display: flex; flex-direction: column; gap: 1rem;">
          <div style="font-size: 1rem; font-weight: bold; padding: 0.5rem 1rem; background-color: #f8f9fa; border-radius: 8px; color: #6c757d;">Transcript</div>
          <textarea id="results" placeholder="Output will appear here..." readonly style="flex: 1; padding: 0.75rem; font-size: 1rem; border: 1px solid #ced4da; border-radius: 8px; resize: none; background-color: #f8f9fa;"></textarea>
          <audio id="audioPlayback" controls style="display: none; margin-top: 1rem; width: 100%;"></audio>
        </div>
      </div>
    </div>

    <div id="status" style="display: flex; justify-content: center; align-items: center; height: 100%; font-size: 2rem;">
      Preparing<b-dot>.</b-dot><b-dot>.</b-dot><b-dot>.</b-dot>
    </div>

  </div>

  <script src="./app-asr.js" type="module"></script>
</body>
</html>