@jjlmoya/utils-forensic-science 1.12.0 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +3 -1
  3. package/src/entries.ts +5 -1
  4. package/src/index.ts +1 -0
  5. package/src/tests/locale_completeness.test.ts +2 -2
  6. package/src/tests/tool_validation.test.ts +2 -2
  7. package/src/tool/voice-spectrogram-analyzer/audio-runtime.ts +75 -0
  8. package/src/tool/voice-spectrogram-analyzer/bibliography.astro +14 -0
  9. package/src/tool/voice-spectrogram-analyzer/bibliography.ts +16 -0
  10. package/src/tool/voice-spectrogram-analyzer/component.astro +116 -0
  11. package/src/tool/voice-spectrogram-analyzer/controller.ts +219 -0
  12. package/src/tool/voice-spectrogram-analyzer/dom-views.ts +204 -0
  13. package/src/tool/voice-spectrogram-analyzer/entry.ts +31 -0
  14. package/src/tool/voice-spectrogram-analyzer/evaluator.ts +13 -0
  15. package/src/tool/voice-spectrogram-analyzer/fft.ts +64 -0
  16. package/src/tool/voice-spectrogram-analyzer/i18n/de.ts +135 -0
  17. package/src/tool/voice-spectrogram-analyzer/i18n/en.ts +122 -0
  18. package/src/tool/voice-spectrogram-analyzer/i18n/es.ts +122 -0
  19. package/src/tool/voice-spectrogram-analyzer/i18n/fr.ts +135 -0
  20. package/src/tool/voice-spectrogram-analyzer/i18n/id.ts +136 -0
  21. package/src/tool/voice-spectrogram-analyzer/i18n/it.ts +135 -0
  22. package/src/tool/voice-spectrogram-analyzer/i18n/ja.ts +135 -0
  23. package/src/tool/voice-spectrogram-analyzer/i18n/ko.ts +135 -0
  24. package/src/tool/voice-spectrogram-analyzer/i18n/nl.ts +136 -0
  25. package/src/tool/voice-spectrogram-analyzer/i18n/pl.ts +136 -0
  26. package/src/tool/voice-spectrogram-analyzer/i18n/pt.ts +135 -0
  27. package/src/tool/voice-spectrogram-analyzer/i18n/ru.ts +136 -0
  28. package/src/tool/voice-spectrogram-analyzer/i18n/sv.ts +136 -0
  29. package/src/tool/voice-spectrogram-analyzer/i18n/tr.ts +136 -0
  30. package/src/tool/voice-spectrogram-analyzer/i18n/zh.ts +135 -0
  31. package/src/tool/voice-spectrogram-analyzer/index.ts +11 -0
  32. package/src/tool/voice-spectrogram-analyzer/logic.test.ts +46 -0
  33. package/src/tool/voice-spectrogram-analyzer/logic.ts +163 -0
  34. package/src/tool/voice-spectrogram-analyzer/seo.astro +15 -0
  35. package/src/tool/voice-spectrogram-analyzer/storage.ts +33 -0
  36. package/src/tool/voice-spectrogram-analyzer/ui.ts +49 -0
  37. package/src/tool/voice-spectrogram-analyzer/voice-spectrogram-analyzer.css +547 -0
  38. package/src/tools.ts +3 -1
@@ -0,0 +1,135 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { VoiceSpectrogramLocaleContent } from '../entry';
3
+
4
+ const slug = "voice-spectrogram-analyzer-online";
5
+ const title = "音声スペクトログラム解析ツール オンライン";
6
+ const description = "2つの音声サンプルの周波数、時間、音量強度、推定フォルマントをブラウザ内でローカルに解析・比較します。";
7
+
8
+ const howTo = [
9
+ {
10
+ "name": "音声サンプルを選択",
11
+ "text": "手元の音声ファイルまたはプリセットを読み込みます。"
12
+ },
13
+ {
14
+ "name": "周波数上限を設定",
15
+ "text": "声の性質に合わせて4kHz、6kHz、8kHzを選択します。"
16
+ },
17
+ {
18
+ "name": "スペクトログラムを確認",
19
+ "text": "時間、周波数、フォルマントの分布を観察します。"
20
+ },
21
+ {
22
+ "name": "再生して比較",
23
+ "text": "カーソルと音声を同期させながら比較します。"
24
+ }
25
+ ];
26
+
27
+ const faq = [
28
+ {
29
+ "question": "音声スペクトログラムとは何ですか?",
30
+ "answer": "横軸に時間、縦軸に周波数、色の明るさで音の強さを表したグラフです。"
31
+ },
32
+ {
33
+ "question": "録音データはサーバーに送信されますか?",
34
+ "answer": "いいえ。すべての処理はお使いのブラウザ内で完結します。"
35
+ },
36
+ {
37
+ "question": "F1、F2、F3ガイドとは?",
38
+ "answer": "声道の共鳴周波数(フォルマント)の推定位置を示す補助線です。"
39
+ },
40
+ {
41
+ "question": "このツールで話者を特定できますか?",
42
+ "answer": "いいえ。見た目の類似性だけで個人の同一性を判定することはできません。"
43
+ },
44
+ {
45
+ "question": "周波数上限を変えるとフォルマントが変わる理由は?",
46
+ "answer": "表示範囲が変わることで、検出されるピークの分離具合が変化するためです。"
47
+ }
48
+ ];
49
+
50
+ export const content: VoiceSpectrogramLocaleContent = {
51
+ slug,
52
+ title,
53
+ description,
54
+ ui: {
55
+ "privacyBadge": "ローカル専用",
56
+ "privacyNote": "音声ファイルは外部サーバーに送信されません。ブラウザ内でローカル処理されます。",
57
+ "loadHeading": "解析する2つの音声ファイルを読み込み",
58
+ "sampleALabel": "サンプル A",
59
+ "sampleBLabel": "サンプル B",
60
+ "chooseFileLabel": "音声を選択",
61
+ "replaceFileLabel": "声を変更",
62
+ "dropHint": "ここに音声ファイルをドラッグ&ドロップ(最大25MB)。最初の20秒間を解析します。",
63
+ "presetHint": "合成母音サンプルですぐにテストできます。",
64
+ "presetWarmLabel": "温かみのある母音サンプル",
65
+ "presetBrightLabel": "明朗な母音サンプル",
66
+ "emptySampleLabel": "音声待機中",
67
+ "readySampleLabel": "スペクトルプレート作成完了",
68
+ "decodingSampleLabel": "スペクトルプレート解析中",
69
+ "errorSampleLabel": "解析に失敗しました",
70
+ "durationLabel": "再生時間",
71
+ "ceilingHeading": "周波数上限設定",
72
+ "ceilingFourLabel": "4 kHz",
73
+ "ceilingSixLabel": "6 kHz",
74
+ "ceilingEightLabel": "8 kHz",
75
+ "stageLabel": "ミラー表示スペクトログラムステージ",
76
+ "mirrorViewLabel": "対向表示",
77
+ "splitViewLabel": "並列表示",
78
+ "playALabel": "サンプルAを再生",
79
+ "playBLabel": "サンプルBを再生",
80
+ "stopLabel": "停止",
81
+ "timeAxisLabel": "時間",
82
+ "frequencyAxisLabel": "周波数",
83
+ "intensityLegendLabel": "明るい色ほど音響エネルギーが強力",
84
+ "formantLegendLabel": "推定フォルマントガイドライン",
85
+ "sampleAEmptyCanvasLabel": "サンプルAを読み込むとスペクトログラムが表示されます",
86
+ "sampleBEmptyCanvasLabel": "サンプルBを読み込むとスペクトログラムが表示されます",
87
+ "comparisonHeading": "共鳴周波数分析",
88
+ "comparisonNote": "有声音フレームにおける平均スペクトルピーク位置。差分は物理測定値であり同一性の証明ではありません。",
89
+ "formantOneLabel": "第1共鳴領域 (F1)",
90
+ "formantTwoLabel": "第2共鳴領域 (F2)",
91
+ "formantThreeLabel": "第3共鳴領域 (F3)",
92
+ "averageLabel": "平均値",
93
+ "differenceLabel": "差分",
94
+ "unavailableLabel": "利用不可",
95
+ "statusEmptyLabel": "音声を選択して開始",
96
+ "statusSingleLabel": "1つのプレートが準備完了",
97
+ "statusReadyLabel": "両方のプレートが準備完了",
98
+ "limitError": "ファイルサイズがローカル制限の25MBを超えています。",
99
+ "decodeError": "このブラウザでは対応していない音声形式です。",
100
+ "browserError": "Web Audio APIが非対応のブラウザです。",
101
+ "educationalNote": "学習用可視化ツールです。フォルマントガイドは簡易計算に基づくため、声紋鑑定や個人特定には使用できません。"
102
+ },
103
+ seo: [
104
+ { type: 'title', text: "スペクトログラムが音を視覚的な風景に変える仕組み", level: 2 },
105
+ { type: 'paragraph', html: "<strong>音声スペクトログラム</strong>は、録音データを横軸に時間、縦軸に周波数を配置したマップに変換します。強度の高い音響エネルギーは明るい色として表示されます。これにより、単純な波形表示よりも持続母音、高調波、無音状態、および共鳴の変化をはっきりと確認・分析できます。音響信号の視覚的理解が容易になります。" },
106
+ { type: 'paragraph', html: "本解析ツールは、信号を短いオーバーラップ区間に分割し、ハン窓を適用した上で高速フーリエ変換(FFT)を実行して周波数ごとのエネルギー分布を計算します。区間を短くすると時間的な発生タイミングが明確になり、周波数分解能を高めるとエネルギーの集中場所が判明します。不確定性原理のため時間と周波数の分解能には常にトレードオフが存在します。" },
107
+ { type: 'diagnostic', variant: 'info', title: "ブラウザ内プライベート処理", html: "2つの音声サンプルの周波数、時間、音量強度、推定フォルマントをブラウザ内でローカルに解析・比較します。" },
108
+ { type: 'stats', columns: 3, items: [
109
+ { value: "時間", label: "左から右へ読み取り" },
110
+ { value: "Hz", label: "周波数位置" },
111
+ { value: "エネルギー", label: "明るさで表現" }
112
+ ] },
113
+ { type: 'title', text: "フォルマントを正しく読み解く", level: 3 },
114
+ { type: 'paragraph', html: "フォルマントとは、声道形状によって形成される共鳴領域です。音声学においてF1とF2は母音の高さや舌の位置を表すために頻繁に使用されます。本ツールは3つの周波数領域における滑らかなピークを追跡し、視覚的な帯域とF1、F2、F3の挙動を結びつけて観察できるように設計されています。" },
115
+ { type: 'paragraph', html: "専門的なフォルマント計測では、話者に合わせて調整された線形予測符号化(LPC)手順が用いられます。 pitch高調波、鼻声化、部屋の反響、背景ノイズは簡易的なピーク推定をずらす要因となります。表示されるガイドラインは教育的な参考目安として利用し、常に背景のスペクトル表示と合わせて確認してください。" },
116
+ { type: 'table', headers: ['Guide', 'Region', 'Meaning'], rows: [["F1","180 〜 1000 Hz","第1共鳴領域。母音の口の開き具合に関連"],["F2","900 〜 3000 Hz","第2共鳴領域。舌の前後位置に関連"],["F3","2000 〜 4500 Hz","高次共鳴領域。声道全体の形状に影響を受ける"]] },
117
+ { type: 'title', text: "周波数設定が解析結果に与える影響", level: 3 },
118
+ { type: 'comparative', columns: 2, items: [
119
+ { title: "低い上限 (4 kHz)", description: "低周波数の観察に最適", points: ["母音の観察に有用", "高音域エネルギーを除外する可能性", "高精度を保証するものではありません"] },
120
+ { title: "高い上限 (6/8 kHz)", description: "高音域の詳細を表示", highlight: true, points: ["明るい声に最適", "摩擦音を表示", "低音域を垂直方向に圧縮"] }
121
+ ] },
122
+ { type: 'title', text: "2つの音声サンプルの適正な比較方法", level: 3 },
123
+ { type: 'paragraph', html: "2つのプレートの比較は、両方の録音が同様の音響環境で同じ母音やフレーズを含んでいる場合に最も効果的です。表示される差分はスペクトルピーク間の絶対的な物理測定値であり、同一性の割合や個人識別の証明を提供するものではありません。" },
124
+ { type: 'list', items: ["<strong>同じ発話内容を比較する:</strong> 繰り返された母音や単語は、異なるフレーズよりも比較が容易です。","<strong>録音条件を揃える:</strong> マイクの種類や部屋の音響特性はスペクトルに大きく影響します。","<strong>カーソルを合わせて聴く:</strong> 視覚的なイベントと実際の音の瞬間を同期させて確認します。","<strong>個人特定を避ける:</strong> 類似したスペクトログラムであっても同一人物の証明にはなりません。"] },
125
+ { type: 'summary', title: "本解析ツールの要点まとめ", items: ["ブラウザ対応ファイルからローカルでスペクトログラムを生成。","ミラー表示または並列表示で2つのサンプルを同期比較。","音響エネルギーと推定フォルマント領域の変化を学習。","鑑定ではなく記述的・教育的な目的で活用。"] }
126
+ ],
127
+ faq,
128
+ bibliography,
129
+ howTo,
130
+ schemas: [
131
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: title, description, applicationCategory: 'MultimediaApplication', operatingSystem: 'Any' },
132
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
133
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: title, step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })) }
134
+ ]
135
+ };
@@ -0,0 +1,135 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { VoiceSpectrogramLocaleContent } from '../entry';
3
+
4
+ const slug = "voice-spectrogram-analyzer-online";
5
+ const title = "음성 스펙트로그램 분석기 온라인";
6
+ const description = "두 개의 오디오 샘플의 주파수, 시간, 강도 및 추정 포르망트 패턴을 브라우저에서 개인적으로 분석하고 비교합니다.";
7
+
8
+ const howTo = [
9
+ {
10
+ "name": "두 개의 샘플 선택",
11
+ "text": "로컬 오디오 파일이나 합성 모음 예제를 선택합니다."
12
+ },
13
+ {
14
+ "name": "주파수 상한선 설정",
15
+ "text": "음성 특성에 맞게 4kHz, 6kHz, 8kHz 중 선택합니다."
16
+ },
17
+ {
18
+ "name": "스펙트로그램 분석",
19
+ "text": "시간, 주파수, 포르망트 영역을 확인합니다."
20
+ },
21
+ {
22
+ "name": "재생 및 비교",
23
+ "text": "동기화된 커서로 소리를 들으며 공명 평균값을 비교합니다."
24
+ }
25
+ ];
26
+
27
+ const faq = [
28
+ {
29
+ "question": "음성 스펙트로그램은 무엇을 보여주나요?",
30
+ "answer": "가로축은 시간, 세로축은 주파수, 색상의 밝기는 음향 에너지를 나타냅니다."
31
+ },
32
+ {
33
+ "question": "내 녹음 파일이 업로드되나요?",
34
+ "answer": "아니오. 모든 디코딩과 분석은 브라우저 내에서 로컬로 진행됩니다."
35
+ },
36
+ {
37
+ "question": "F1, F2, F3 가이드는 무엇인가요?",
38
+ "answer": "성도의 공명 주파수를 추정한 교육용 안내선입니다."
39
+ },
40
+ {
41
+ "question": "이 도구로 화자를 식별할 수 있나요?",
42
+ "answer": "아니오. 시각적 유사성만으로 화자의 동일성을 판단할 수 없습니다."
43
+ },
44
+ {
45
+ "question": "주파수 상한선에 따라 포르망트가 달라지는 이유는?",
46
+ "answer": "표시되는 주파수 범위에 따라 탐지되는 스펙트럼 피크가 달라지기 때문입니다."
47
+ }
48
+ ];
49
+
50
+ export const content: VoiceSpectrogramLocaleContent = {
51
+ slug,
52
+ title,
53
+ description,
54
+ ui: {
55
+ "privacyBadge": "로컬 전용",
56
+ "privacyNote": "녹음 파일은 이 기기에만 유지됩니다. 분석과 디코딩은 브라우저 내부에서 실행됩니다.",
57
+ "loadHeading": "분석할 두 개의 음성 선택",
58
+ "sampleALabel": "샘플 A",
59
+ "sampleBLabel": "샘플 B",
60
+ "chooseFileLabel": "오디오 선택",
61
+ "replaceFileLabel": "오디오 교체",
62
+ "dropHint": "오디오 파일을 여기에 끌어다 놓으세요 (최대 25MB). 처음 20초가 분석됩니다.",
63
+ "presetHint": "합성 모음 연구 샘플로 즉시 테스트해보세요.",
64
+ "presetWarmLabel": "따뜻한 모음 샘플",
65
+ "presetBrightLabel": "밝은 모음 샘플",
66
+ "emptySampleLabel": "오디오 대기 중",
67
+ "readySampleLabel": "스펙트럼 플레이트 생성됨",
68
+ "decodingSampleLabel": "스펙트럼 플레이트 분석 중",
69
+ "errorSampleLabel": "샘플을 분석할 수 없습니다",
70
+ "durationLabel": "재생 시간",
71
+ "ceilingHeading": "주파수 상한선",
72
+ "ceilingFourLabel": "4 kHz",
73
+ "ceilingSixLabel": "6 kHz",
74
+ "ceilingEightLabel": "8 kHz",
75
+ "stageLabel": "미러 음성 스펙트로그램 스테이지",
76
+ "mirrorViewLabel": "대칭 표시",
77
+ "splitViewLabel": "병렬 표시",
78
+ "playALabel": "샘플 A 재생",
79
+ "playBLabel": "샘플 B 재생",
80
+ "stopLabel": "정지",
81
+ "timeAxisLabel": "시간",
82
+ "frequencyAxisLabel": "주파수",
83
+ "intensityLegendLabel": "밝은 색상일수록 강한 음향 에너지를 나타냅니다",
84
+ "formantLegendLabel": "추정 포르망트 가이드",
85
+ "sampleAEmptyCanvasLabel": "샘플 A를 불러오면 스펙트럼이 표시됩니다",
86
+ "sampleBEmptyCanvasLabel": "샘플 B를 불러오면 스펙트럼이 표시됩니다",
87
+ "comparisonHeading": "공명 주파수 분석",
88
+ "comparisonNote": "유성음 구간의 평균 스펙트럼 피크 위치입니다. 차이는 물리적 측정값이며 동일성 증명이 아닙니다.",
89
+ "formantOneLabel": "첫 번째 공명 영역 (F1)",
90
+ "formantTwoLabel": "두 번째 공명 영역 (F2)",
91
+ "formantThreeLabel": "세 번째 공명 영역 (F3)",
92
+ "averageLabel": "평균",
93
+ "differenceLabel": "차이",
94
+ "unavailableLabel": "사용 불가",
95
+ "statusEmptyLabel": "샘플을 불러와 시작하세요",
96
+ "statusSingleLabel": "한 개의 플레이트가 준비되었습니다",
97
+ "statusReadyLabel": "두 개의 스펙트럼 플레이트가 모두 준비되었습니다",
98
+ "limitError": "파일 크기가 로컬 제한인 25MB를 초과합니다.",
99
+ "decodeError": "브라우저가 이 오디오 형식을 디코딩할 수 없습니다.",
100
+ "browserError": "이 브라우저에서는 Web Audio API를 사용할 수 없습니다.",
101
+ "educationalNote": "교육용 시각화 도구입니다. 포르망트 가이드는 간이 계산에 기반하므로 화자 식별용으로 사용할 수 없습니다."
102
+ },
103
+ seo: [
104
+ { type: 'title', text: "스펙트로그램이 소리를 시각적 지도로 변환하는 원리", level: 2 },
105
+ { type: 'paragraph', html: "<strong>음성 스펙트로그램</strong>은 녹음 데이터를 가로축 시간, 세로축 주파수로 배치한 시각적 지도로 변환합니다. 강한 음향 에너지는 더 밝은 색상으로 표현됩니다. 이는 단일 파형보다 지속 모음, 고조파, 정적 및 공명의 변화를 훨씬 명확하게 분석할 수 있게 해줍니다. 오디오 신호의 시각적 이해가 쉬워집니다." },
106
+ { type: 'paragraph', html: "분석기는 신호를 짧은 중첩 구간으로 나누고 해밍 창을 적용한 후 FFT를 통해 주파수별 에너지 분포를 계산합니다. 짧은 구간은 특정 사건의 정확한 시점을 판별하게 해주며, 주파수 분해능은 에너지가 집중된 위치를 보여줍니다. 신호 처리의 불확정성 원리로 인해 시간과 주파수 분해능 사이에는 절충이 존재합니다." },
107
+ { type: 'diagnostic', variant: 'info', title: "브라우저 내부 개인 처리", html: "두 개의 오디오 샘플의 주파수, 시간, 강도 및 추정 포르망트 패턴을 브라우저에서 개인적으로 분석하고 비교합니다." },
108
+ { type: 'stats', columns: 3, items: [
109
+ { value: "시간", label: "왼쪽에서 오른쪽으로 읽기" },
110
+ { value: "Hz", label: "주파수 위치" },
111
+ { value: "에너지", label: "밝기로 표현" }
112
+ ] },
113
+ { type: 'title', text: "포르망트 올바르게 해석하기", level: 3 },
114
+ { type: 'paragraph', html: "포르망트는 성도 모양에 의해 형성되는 공명 영역입니다. 음성학에서 F1과 F2는 모음의 높낮이와 혀의 위치를 설명하는 데 흔히 사용됩니다. 본 분석기는 3개 주파수 영역의 매끄러운 피크를 추적하여 시각적 대역과 F1, F2, F3의 동작을 연결하여 관찰할 수 있도록 돕습니다." },
115
+ { type: 'paragraph', html: "전문적인 포르망트 측정은 일반적으로 화자에 맞춘 선형 예측 부호화(LPC) 절차를 사용합니다. 피치 고조파, 비음화, 방 안의 울림, 배경 소음은 단순 추정치를 변형시킬 수 있습니다. 가이드라인을 교육적 참고용으로 활용하고 배경의 스펙트럼 표시를 함께 확인하세요." },
116
+ { type: 'table', headers: ['Guide', 'Region', 'Meaning'], rows: [["F1","180 ~ 1000 Hz","첫 번째 공명 영역, 모음의 구강 개포도와 관련"],["F2","900 ~ 3000 Hz","두 번째 공명 영역, 혀의 전후 위치와 관련"],["F3","2000 ~ 4500 Hz","고차 공명 영역, 성도 전체의 형상에 영향을 받음"]] },
117
+ { type: 'title', text: "주파수 설정이 분석에 미치는 영향", level: 3 },
118
+ { type: 'comparative', columns: 2, items: [
119
+ { title: "낮은 상한 (4 kHz)", description: "저주파 관찰에 용이", points: ["모음 관찰에 유용", "고주파 에너지 제외 가능성", "더 높은 정밀도를 보장하지는 않음"] },
120
+ { title: "높은 상한 (6/8 kHz)", description: "더 많은 고주파 세부정보", highlight: true, points: ["밝은 음성에 적합", "마찰음 표시", "저주파 대역 압축"] }
121
+ ] },
122
+ { type: 'title', text: "책임감 있는 두 오디오 샘플 비교", level: 3 },
123
+ { type: 'paragraph', html: "두 플레이트의 비교는 두 녹음이 동일한 모음이나 문장을 유사한 음향 조건에서 포함할 때 가장 유용합니다. 표시된 차이는 스펙트럼 피크 간의 절대적 물리 측정값이며 동일성 비율이나 생체 인식을 증명하지 않습니다." },
124
+ { type: 'list', items: ["<strong>동일한 발화 내용 비교:</strong> 반복된 모음이나 단어는 서로 다른 문장보다 비교가 용이합니다.","<strong>녹음 환경 맞추기:</strong> 마이크와 방의 음향 특성은 스펙트럼에 큰 영향을 미칩니다.","<strong>커서와 함께 청취:</strong> 시각적 사건과 실제 소리의 순간을 동기화하여 확인합니다.","<strong>화자 동일성 주장 자제:</strong> 유사하게 보이는 스펙트로그램이라도 동일 화자를 증명하지 않습니다."] },
125
+ { type: 'summary', title: "분석기 요약", items: ["지원되는 파일에서 로컬로 스펙트로그램을 생성합니다.","대칭 또는 병렬 플레이트에서 두 샘플을 시각적으로 탐색합니다.","음향 에너지와 포르망트 영역의 변화를 학습합니다.","법의학적 판정이 아닌 기술적·교육적 목적을 유지합니다."] }
126
+ ],
127
+ faq,
128
+ bibliography,
129
+ howTo,
130
+ schemas: [
131
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: title, description, applicationCategory: 'MultimediaApplication', operatingSystem: 'Any' },
132
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
133
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: title, step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })) }
134
+ ]
135
+ };
@@ -0,0 +1,136 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { VoiceSpectrogramLocaleContent } from '../entry';
3
+
4
+ const slug = "stem-spectrogram-analysator-online";
5
+ const title = "Stem Spectrogram Analysator Online";
6
+ const description = "Visualiseer frequentie, tijd, intensiteit en formantwaarden van twee geluidsfragmenten privé in uw browser.";
7
+
8
+ const howTo = [
9
+ {
10
+ "name": "Kies twee audiosamples",
11
+ "text": "Gebruik lokale bestanden of synthetische voorbeelden."
12
+ },
13
+ {
14
+ "name": "Stel frequentieplafond in",
15
+ "text": "Kies 4, 6 of 8 kHz passend bij het stemtype."
16
+ },
17
+ {
18
+ "name": "Lees het spectrogram",
19
+ "text": "Bekijk tijd, frequentie en formantgidsen."
20
+ },
21
+ {
22
+ "name": "Luister en vergelijk",
23
+ "text": "Vergelijk F1, F2 en F3 waarden op een verantwoorde manier."
24
+ }
25
+ ];
26
+
27
+ const faq = [
28
+ {
29
+ "question": "Wat toont een stemspectrogram?",
30
+ "answer": "Een spectrogram toont tijd op de horizontale as, frequentie op de verticale as en signaalintensiteit via helderheid."
31
+ },
32
+ {
33
+ "question": "Worden mijn opnamen geüpload?",
34
+ "answer": "Nee. Alles wordt lokaal berekend in uw browser."
35
+ },
36
+ {
37
+ "question": "Wat betekenen F1, F2 en F3?",
38
+ "answer": "Het zijn educatieve schattingen van de resonanties van het spraakkanaal."
39
+ },
40
+ {
41
+ "question": "Kan deze analysator een spreker identificeren?",
42
+ "answer": "Nee. Visuele gelijkenis bewijst geen identiteit."
43
+ },
44
+ {
45
+ "question": "Waarom veranderen formanten bij een ander frequentieplafond?",
46
+ "answer": "De frequentieschaal beïnvloedt hoe pieken worden gescheiden."
47
+ }
48
+ ];
49
+
50
+ export const content: VoiceSpectrogramLocaleContent = {
51
+ slug,
52
+ title,
53
+ description,
54
+ ui: {
55
+ "privacyBadge": "Alleen lokaal",
56
+ "privacyNote": "Uw opnamen blijven op dit apparaat. Analyse en decodering worden uitgevoerd in de browser.",
57
+ "loadHeading": "Laad twee geluiden om te analyseren",
58
+ "sampleALabel": "Sample A",
59
+ "sampleBLabel": "Sample B",
60
+ "chooseFileLabel": "Kies audio",
61
+ "replaceFileLabel": "Vervang audio",
62
+ "dropHint": "Sleep hier een audiobestand naartoe (max. 25 MB). De eerste 20 seconden worden geanalyseerd.",
63
+ "presetHint": "Probeer direct de twee synthetische klinkerstudies.",
64
+ "presetWarmLabel": "Warme klinkerstudie",
65
+ "presetBrightLabel": "Heldere klinkerstudie",
66
+ "emptySampleLabel": "Wachten op audio",
67
+ "readySampleLabel": "Spectraalplaat gereed",
68
+ "decodingSampleLabel": "Spectraalplaat verwerken",
69
+ "errorSampleLabel": "Sample kon niet worden geanalyseerd",
70
+ "durationLabel": "Duur",
71
+ "ceilingHeading": "Frequentieplafond",
72
+ "ceilingFourLabel": "4 kHz",
73
+ "ceilingSixLabel": "6 kHz",
74
+ "ceilingEightLabel": "8 kHz",
75
+ "stageLabel": "Gespiegelde stem spectrogram stage",
76
+ "mirrorViewLabel": "Gespiegelde platen",
77
+ "splitViewLabel": "Parallele platen",
78
+ "playALabel": "Speel sample A",
79
+ "playBLabel": "Speel sample B",
80
+ "stopLabel": "Stoppen",
81
+ "timeAxisLabel": "Tijd",
82
+ "frequencyAxisLabel": "Frequentie",
83
+ "intensityLegendLabel": "Heldere inkt duidt op hogere energie",
84
+ "formantLegendLabel": "Geschatte formantgidsen",
85
+ "sampleAEmptyCanvasLabel": "Laad sample A om het spectrum te bekijken",
86
+ "sampleBEmptyCanvasLabel": "Laad sample B om het spectrum te bekijken",
87
+ "comparisonHeading": "Analyse van resonantiepatronen",
88
+ "comparisonNote": "Gemiddelde pieken in stemhebbende fragmenten. Verschillen zijn metingen, geen identiteitsbewijs.",
89
+ "formantOneLabel": "Eerste resonantiegebied (F1)",
90
+ "formantTwoLabel": "Tweede resonantiegebied (F2)",
91
+ "formantThreeLabel": "Derde resonantiegebied (F3)",
92
+ "averageLabel": "Gemiddelde",
93
+ "differenceLabel": "Verschil",
94
+ "unavailableLabel": "Niet beschikbaar",
95
+ "statusEmptyLabel": "Laad een sample om te beginnen",
96
+ "statusSingleLabel": "Eén plaat is gereed",
97
+ "statusReadyLabel": "Beide spectraalplaten zijn gereed",
98
+ "limitError": "Bestand overschrijdt de lokale limiet van 25 MB.",
99
+ "decodeError": "Browser kon dit audioformaat niet decoderen.",
100
+ "browserError": "Web Audio API niet beschikbaar in deze browser.",
101
+ "educationalNote": "Educatieve visualisatietool. Formantgidsen zijn schattingen en niet geschikt voor forensische sprekeridentificatie."
102
+ },
103
+ seo: [
104
+ { type: 'title', text: "Hoe een spectrogram geluid omzet in een visueel landschap", level: 2 },
105
+ { type: 'paragraph', html: "Een <strong>stemspectrogram</strong> zet een opname om in een kaart met tijd op de horizontale as en frequentie op de verticale as. Sterkere energie verschijnt als een helderdere kleur. Dit maakt aangehouden klinkers, boventonen, stilte en resonanties gemakkelijker waar te nemen dan op een gewone golfvorm. Deze visualisatie vergemakkelijkt de gedetailleerde analyse van het geluidssignaal op elk moment. Hierdoor krijgen onderzoekers een helder inzicht in de akoestische kenmerken." },
106
+ { type: 'paragraph', html: "De analysator verdeelt het signaal in korte overlappende segmenten, past een Hamming-venster toe en berekent de energieverdeling per frequentie via FFT. Een kort segment bepaalt het exacte tijdstip, terwijl de frequentieresolutie toont waar energie zich concentreert. Vanwege het onzekerheidsprincipe is er altijd een afweging tussen tijd- en frequentieresolutie. Deze instellingen bepalen de scherpte." },
107
+
108
+ { type: 'diagnostic', variant: 'info', title: "Privéverwerking in de browser", html: "Visualiseer frequentie, tijd, intensiteit en formantwaarden van twee geluidsfragmenten privé in uw browser." },
109
+ { type: 'stats', columns: 3, items: [
110
+ { value: "Tijd", label: "Lees van links naar rechts" },
111
+ { value: "Hz", label: "Frequentiepositie" },
112
+ { value: "Energie", label: "Weergegeven als helderheid" }
113
+ ] },
114
+ { type: 'title', text: "Formanten interpreteren zonder overdrijving", level: 3 },
115
+ { type: 'paragraph', html: "Formanten zijn resonantiegebieden die gevormd worden door het spraakkanaal. F1 en F2 worden in de fonetiek gebruikt om klinkerhoogte en articulatieplaats gedetailleerd te beschrijven. Deze analysator volgt vloeiende pieken in drie frequentiegebieden zodat gebruikers zichtbare banden kunnen koppelen aan het gedrag van F1, F2 en F3 op een intuïtieve wijze." },
116
+ { type: 'paragraph', html: "Professionele formantmeting gebruikt meestal een Lineaire Predictieve Codering (LPC) afgestemd op de spreker. Grondtonen, nasalisatie, galm en achtergrondruis kunnen eenvoudige schattingen beïnvloeden. Gebruik deze gidsen als educatieve hulp en controleer altijd het onderliggende visuele spectrum." },
117
+ { type: 'table', headers: ['Guide', 'Region', 'Meaning'], rows: [["F1","180 tot 1000 Hz","Eerste resonantiegebied, gerelateerd aan klinkeropening"],["F2","900 tot 3000 Hz","Tweede resonantiegebied, gerelateerd aan tongpositie"],["F3","2000 tot 4500 Hz","Hoger resonantiegebied, beïnvloed door het spraakkanaal"]] },
118
+ { type: 'title', text: "De invloed van frequentie-instellingen", level: 3 },
119
+ { type: 'comparative', columns: 2, items: [
120
+ { title: "Lage grens (4 kHz)", description: "Beter zicht op lage frequenties", points: ["Nuttig voor klinkers", "Kan hoge energie uitsluiten", "Garandeert geen hogere nauwkeurigheid"] },
121
+ { title: "Hoge grens (6/8 kHz)", description: "Meer bovenste details", highlight: true, points: ["Voor heldere stemmen", "Toont wrijvingsklanken", "Comprimeert onderste banden"] }
122
+ ] },
123
+ { type: 'title', text: "Een verantwoorde vergelijking van twee audiosamples", level: 3 },
124
+ { type: 'paragraph', html: "Het vergelijken van twee platen is het meest nuttig wanneer beide opnamen dezelfde klinker of zin bevatten onder soortgelijke akoestische omstandigheden. De weergegeven verschillen zijn absolute fysieke metingen tussen de spectrale pieken. Ze vormen geen gelijkheidspercentage of biometrisch identiteitsbewijs." },
125
+ { type: 'list', items: ["<strong>Vergelijk dezelfde gesproken inhoud:</strong> herhaalde klinkers of woorden zijn eenvoudiger te vergelijken.","<strong>Gebruik gelijke opname-omstandigheden:</strong> microfoon en kamerakoestiek beïnvloeden het spectrum sterk.","<strong>Luister met de cursor:</strong> koppel visuele gebeurtenissen aan het exacte geluidsmoment.","<strong>Vermijd identiteitsclaims:</strong> een vergelijkbaar spectrogram bewijst geen sprekeridentiteit."] },
126
+ { type: 'summary', title: "Samenvatting van de analysator", items: ["Genereer lokaal een audiospectrogram uit compatibele bestanden.","Verken twee samples op gespiegelde of parallele platen.","Leer hoe spectrale energie en formantgebieden veranderen.","Houd vergelijkingen beschrijvend en educatief."] }
127
+ ],
128
+ faq,
129
+ bibliography,
130
+ howTo,
131
+ schemas: [
132
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: title, description, applicationCategory: 'MultimediaApplication', operatingSystem: 'Any' },
133
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
134
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: title, step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })) }
135
+ ]
136
+ };
@@ -0,0 +1,136 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { VoiceSpectrogramLocaleContent } from '../entry';
3
+
4
+ const slug = "analizator-spektrogramu-glosu-online";
5
+ const title = "Analizator Spektrogramu Głosu Online";
6
+ const description = "Wizualizuj częstotliwość, czas, intensywność i szacowane formanty dwóch próbek dźwiękowych prywatnie w przeglądarce.";
7
+
8
+ const howTo = [
9
+ {
10
+ "name": "Wybierz dwie próbki",
11
+ "text": "Użyj plików lokalnych lub próbki syntezy."
12
+ },
13
+ {
14
+ "name": "Ustaw granicę częstotliwości",
15
+ "text": "Wybierz 4, 6 lub 8 kHz w zależności od głosu."
16
+ },
17
+ {
18
+ "name": "Odczytaj spektrogram",
19
+ "text": "Zaobserwuj czas, częstotliwości i linie formantów."
20
+ },
21
+ {
22
+ "name": "Odsłuchaj i porównaj",
23
+ "text": "Porównaj wartości F1, F2 i F3 w celach edukacyjnych."
24
+ }
25
+ ];
26
+
27
+ const faq = [
28
+ {
29
+ "question": "Co przedstawia spektrogram głosu?",
30
+ "answer": "Spektrogram ukazuje czas na osi poziomej, częstotliwość na pionowej oraz natężenie dźwięku za pomocą jasności koloru."
31
+ },
32
+ {
33
+ "question": "Czy moje nagrania są przesyłane do sieci?",
34
+ "answer": "Nie. Cały proces odbywa się lokalnie na Twoim urządzeniu."
35
+ },
36
+ {
37
+ "question": "Czym są formant F1, F2 i F3?",
38
+ "answer": "To przybliżone częstotliwości rezonansowe traktu głosowego."
39
+ },
40
+ {
41
+ "question": "Czy to narzędzie może zidentyfikować osobę po głosie?",
42
+ "answer": "Nie. Podobieństwo wizualne nie stanowi dowodu tożsamości."
43
+ },
44
+ {
45
+ "question": "Dlaczego zmiana granicy częstotliwości zmienia formant?",
46
+ "answer": "Zmiana zakresu widma wpływa na rozdzielczość szczytów częstotliwości."
47
+ }
48
+ ];
49
+
50
+ export const content: VoiceSpectrogramLocaleContent = {
51
+ slug,
52
+ title,
53
+ description,
54
+ ui: {
55
+ "privacyBadge": "Tylko lokalnie",
56
+ "privacyNote": "Nagrania pozostają na Twoim urządzeniu. Analiza odbywa się bezpośrednio w przeglądarce.",
57
+ "loadHeading": "Wczytaj dwa pliki dźwiękowe do analizy",
58
+ "sampleALabel": "Próbka A",
59
+ "sampleBLabel": "Próbka B",
60
+ "chooseFileLabel": "Wybierz audio",
61
+ "replaceFileLabel": "Zmień audio",
62
+ "dropHint": "Przeciągnij plik audio tutaj (maks. 25 MB). Analizowane jest pierwsze 20 sekund.",
63
+ "presetHint": "Wypróbuj gotowe syntezy samogłosek.",
64
+ "presetWarmLabel": "Ciepła samogłoska",
65
+ "presetBrightLabel": "Jasna samogłoska",
66
+ "emptySampleLabel": "Oczekiwanie na plik",
67
+ "readySampleLabel": "Płyta spektrogramu gotowa",
68
+ "decodingSampleLabel": "Generowanie spektrogramu",
69
+ "errorSampleLabel": "Nie udało się przeanalizować próbki",
70
+ "durationLabel": "Czas trwania",
71
+ "ceilingHeading": "Górna granica częstotliwości",
72
+ "ceilingFourLabel": "4 kHz",
73
+ "ceilingSixLabel": "6 kHz",
74
+ "ceilingEightLabel": "8 kHz",
75
+ "stageLabel": "Lustrzane płyty spektrogramu",
76
+ "mirrorViewLabel": "Widok lustrzany",
77
+ "splitViewLabel": "Widok równoległy",
78
+ "playALabel": "Odtwórz próbkę A",
79
+ "playBLabel": "Odtwórz próbkę B",
80
+ "stopLabel": "Zatrzymaj",
81
+ "timeAxisLabel": "Czas",
82
+ "frequencyAxisLabel": "Częstotliwość",
83
+ "intensityLegendLabel": "Jaśniejszy kolor oznacza wyższą energię",
84
+ "formantLegendLabel": "Linie szacowanych formantów",
85
+ "sampleAEmptyCanvasLabel": "Wczytaj próbkę A, aby zobaczyć spektrogram",
86
+ "sampleBEmptyCanvasLabel": "Wczytaj próbkę B, aby zobaczyć spektrogram",
87
+ "comparisonHeading": "Analiza rezonansów akustycznych",
88
+ "comparisonNote": "Średnie wartości punktów rezonansowych. Różnice są pomiarami fizycznymi, a nie dowodem tożsamości.",
89
+ "formantOneLabel": "Pierwszy obszar rezonansu (F1)",
90
+ "formantTwoLabel": "Drugi obszar rezonansu (F2)",
91
+ "formantThreeLabel": "Trzeci obszar rezonansu (F3)",
92
+ "averageLabel": "Średnia",
93
+ "differenceLabel": "Różnica",
94
+ "unavailableLabel": "Niedostępne",
95
+ "statusEmptyLabel": "Wczytaj próbkę, aby rozpocząć",
96
+ "statusSingleLabel": "Jedna płyta jest gotowa",
97
+ "statusReadyLabel": "Obie płyty są gotowe",
98
+ "limitError": "Plik przekracza lokalny limit 25 MB.",
99
+ "decodeError": "Przeglądarka nie mogła zdekodować tego formatu.",
100
+ "browserError": "Brak obsługi Web Audio API.",
101
+ "educationalNote": "Narzędzie edukacyjne. Linie formantów mają charakter poglądowy i nie służą do identyfikacji głosowej."
102
+ },
103
+ seo: [
104
+ { type: 'title', text: "Jak spektrogram głosu zamienia dźwięk w obraz widmowy", level: 2 },
105
+ { type: 'paragraph', html: "<strong>Spektrogram głosu</strong> przekształca nagranie w mapę z czasem na osi poziomej i częstotliwością na pionowej. Wyższa energia jest widoczna jako jaśniejszy kolor. Ułatwia to obserwację wybrzmiewających samogłosek, alikwotów, ciszy i zmian rezonansu w porównaniu ze zwykłym falogramem. Wizualizacja wspomaga szczegółową i dogłębną analizę sygnału w każdym momencie trwania nagrania audio oraz analizę barwy dźwięku." },
106
+ { type: 'paragraph', html: "Analizator dzieli sygnał na krótkie nakładające się segmenty, stosuje okno Hamminga i oblicza rozkład energii w częstotliwościach za pomocą FFT. Krótki segment precyzyjnie określa czas, a rozdzielczość częstotliwościowa pokazuje koncentrację energii. Z powodu zasady nieoznaczoności istnieje kompromis między rozdzielczością czasową a częstotliwościową. Ustawienia te wpływają na ostrość obrazu oraz precyzję detekcji sygnału. Pozwala to na dokładne zrozumienie struktury mowy i akustyki w analizowanym materiale dźwiękowym." },
107
+
108
+ { type: 'diagnostic', variant: 'info', title: "Prywatne przetwarzanie w przeglądarce", html: "Wizualizuj częstotliwość, czas, intensywność i szacowane formanty dwóch próbek dźwiękowych prywatnie w przeglądarce. Wszystkie nagrania pozostają wyłącznie na Twoim urządzeniu bez wysyłania danych." },
109
+ { type: 'stats', columns: 3, items: [
110
+ { value: "Czas", label: "Odczyt od lewej do prawej" },
111
+ { value: "Hz", label: "Pozycja częstotliwości" },
112
+ { value: "Energia", label: "Przedstawiona jako jasność" }
113
+ ] },
114
+ { type: 'title', text: "Prawidłowe odczytywanie formantów", level: 3 },
115
+ { type: 'paragraph', html: "Formanty to obszary rezonansowe ukształtowane przez trakt głosowy. F1 i F2 są używane w fonetyce do dokładnego opisu wysokości samogłosek i miejsca artykulacji. Analizator śledzi wygładzone szczyty w trzech obszarach częstotliwości, pomagając połączyć widoczne pasma z zachowaniem F1, F2 i F3 w sposób przejrzysty i intuicyjny." },
116
+ { type: 'paragraph', html: "Profesjonalny pomiar formantów wykorzystuje zazwyczaj kodowanie predykcyjne (LPC) dostosowane do mówcy. Harmonie tonu podstawowego, szumy i pogłos mogą zniekształcać proste szacunki. Traktuj te linie jako wskazówki edukacyjne i zawsze sprawdzaj tło spektrogramu w celu weryfikacji nakładających się częstotliwości." },
117
+ { type: 'table', headers: ['Guide', 'Region', 'Meaning'], rows: [["F1","180 do 1000 Hz","Pierwszy obszar rezonansu, związany z otwarciem samogłoski"],["F2","900 do 3000 Hz","Drugi obszar rezonansu, związany z pozycją języka"],["F3","2000 do 4500 Hz","Wyższy obszar rezonansu, zależny od kształtu traktu głosu"]] },
118
+ { type: 'title', text: "Wpływ ustawień częstotliwości na analizę", level: 3 },
119
+ { type: 'comparative', columns: 2, items: [
120
+ { title: "Niska granica (4 kHz)", description: "Lepszy widok niskich częstotliwości", points: ["Przydatne dla samogłosek", "Może wykluczać wysoką energię", "Nie gwarantuje wyższej dokładności"] },
121
+ { title: "Wysoka granica (6/8 kHz)", description: "Więcej górnych detali", highlight: true, points: ["Dla jasnych głosów", "Pokazuje spółgłoski trące", "Kompresuje dolne pasma"] }
122
+ ] },
123
+ { type: 'title', text: "Odpowiedzialne porównywanie dwóch próbek głosu", level: 3 },
124
+ { type: 'paragraph', html: "Porównanie dwóch płyt jest najbardziej przydatne, gdy oba nagrania zawierają tę samą samogłoskę lub frazę w podobnych warunkach akustycznych. Wyświetlane różnice są bezwzględnymi pomiarami fizycznymi pomiędzy szczytami częstotliwości. Nie stanowią one procentu podobieństwa ani dowodu tożsamości." },
125
+ { type: 'list', items: ["<strong>Porównuj tę samą treść:</strong> powtarzane samogłoski lub słowa są łatwiejsze do porównania.","<strong>Ujednolicaj warunki nagrania:</strong> mikrofon i akustyka pomieszczenia silnie wpływają na widmo.","<strong>Słuchaj z kursorami:</strong> łącz wydarzenia wizualne z dokładnym momentem dźwięku.","<strong>Unikaj roszczeń tożsamościowych:</strong> podobny spektrogram nie dowodzi tożsamości mówcy."] },
126
+ { type: 'summary', title: "Podsumowanie analizatora", items: ["Generuj spektrogram audio lokalnie z kompatybilnych plików.","Badaj dwie próbki na płytach lustrzanych lub równoległych.","Ucz się, jak zmienia się energia widmowa i obszary formantów.","Zachowaj podejście opisowe i edukacyjne."] }
127
+ ],
128
+ faq,
129
+ bibliography,
130
+ howTo,
131
+ schemas: [
132
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: title, description, applicationCategory: 'MultimediaApplication', operatingSystem: 'Any' },
133
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
134
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: title, step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })) }
135
+ ]
136
+ };