أشكال الصوت المُجَمِّد مع بلازور وLLLs المحلية (العربية (Arabic))

أشكال الصوت المُجَمِّد مع بلازور وLLLs المحلية

Monday, 05 January 2026

//

19 minute read

طريق الصفات العشر

أولاً

حيث نبني صوتاً ISH- atto-soft-System system الذي يقوم بتسليم مفاتيح المملكة AI

هذا هو الشيء عن الواجهات الصوتية ISMSK111 الجميع يريدهم IS,IS لا أحد يثق بهم

معظم أشكال الصوت تفشل في اللحظة التي يختبر فيها النموذج تاريخاً أو يقرر فيها أن يتخطى E"BL"BFD TRANS TRANSLAMS.L)( أنت تقول IS"(MY ES1984"MST MEMSK5) MEMSLMSLLMS ME ME" ME ME MES2014"ES وتقدم إلى الحقل التالي قبل أن تتمكن من تصحيحه ICC. أو أسوأ من ذلك OS: في حين أنها تهلوس الثقة وتهلوس نموذجك مع بيانات خاطئة

في اللحظة التي تسمح فيها لـ LLLM E" conversection COMMSKK1Bystem translated IS, TRANSL'; أدخلت صندوقاً أسوداً غير مقرّر من نوع LL- إلى ما يجب أن يكون من الممكن التنبؤ به من تجربة المستخدم IS.

ولكن ماذا لو كان بإمكاننا الحصول على كعكتنا وأكلها أيضاً مدخلات صوتية مُحْدْدِد لكل ما يهم في الواقع

' يعرض ما نقوم به اليوم من بناء MS' object اليوم IS-oa IS"\Ten complatments Computions IS"}نظام تشكيل الصوت باستخدام Blazor ServerServerS, wisper محلي لخطاب IS- o7 stext IS,.0 و Olama المحلي لاستخراج الحقل IS. ¶ لا تعتمد على سحابة

الوصايات العشر للأصوات

قبل أن نكتب أي شيفرة

  1. كلمة الكل كلمة هو مُدخَل لا يمكن أبداً أن يكون مصدر الحقيقة فقط طريقة واحدة لإكتساب الحقول
  2. LLLM هو مترجم إنه يستخلص بيانات منظمة من النطق الفوضوي E, لا أكثر
  3. ماكينة الدولة تملك شكل التدفق yMS-\ تحديد الكود يقرر ما هو المجال التالي
  4. هي سياسة إقرار العتبات هي تفسيرية ويتم إنفاذها بواسطة الكود EMS, لا حكم LLL
  5. لا يمكن دعم هذا صوت E- / صوت هو usespecess mes, لا إكراه
  6. كل شيء يجري محلياً لا توجد اعتمادات خارجية للمؤشرات المتعلقة بالوظيفـة الأساسيـة
  7. كل تفاعل يتم الدخول فيه مسار كامل لمراجعة الحسابات من أجل تصحيح التصحيح MSMSMSKK1, و إعادة التشغيل عندما تسير الأمور بشكل خاطئ
  8. التحقق هو نوع التصديق المستند إلى نوع EMS- o, لا يوجد تفسير لـ LLL
  9. الشكل المخطّط هو تفسيري يُعرّف JJSON الشكل الهيكل الهيكلية
  10. « فنعم هو فحق فظ ف ذلك فحق ف ذلك ف ذلك ف ذلك ف ذلك ف ذلك ف ذلك ف ذلك ف ذلك ف ذلك ف ذلك ف كثير عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عظيم عندما يفشل الاعتراف بالخطاب

هنا: MS'X كيف يبدو هذا في الممارسة العملية

flowchart LR
    A[User Speaks] --> B[Whisper STT]
    B --> C[Raw Transcript]
    C --> D[Ollama LLM]
    D --> E[Extracted Value]
    E --> F{Validation}
    F -->|Pass| G{Policy Check}
    F -->|Fail| H[Show Error]
    G -->|High Confidence| I[Auto-Confirm]
    G -->|Low Confidence| J[Ask User]
    J --> K{User Confirms?}
    K -->|Yes| L[State Machine: Next Field]
    K -->|No| M[Retry Recording]
    I --> L
    H --> M

    style D stroke:#f96,stroke-width:2px
    style F stroke:#6f6,stroke-width:2px
    style G stroke:#ff9,stroke-width:2px

لاحظ ما تقوم به LLM SimS:

ما الذي يفعله هذا ؟

ليكن هذا النظام واضحًا حول النطاق

  • لا يوجد محادثة طبيعية هذا هو TMMSSK1t a tashbotsMS.s حقل واحد في كل وقت IS.
  • لا يوجد استساق للتكيُّف الـ LLL show the IS'gt show IS-upsISMS..
  • لا يوجد رقم EMSMSK01 لا الشخصية LLM يستخلص قيم I, فإنه لا يجعل SimS'gt حديث صغير
  • عدم وجود سياق عبر ميادين كل عملية إستخراج مستقلة IS. ♪ كل عملية إستخراج مستقلة ♪ ♪ LLM لا تتذكر اسمك عندما تسأل عن البريد الإلكتروني IS.

وهذه القيود هي الملامح التي لم تكن حشرات SimS. ♪ تجعل النظام قابلاً للتنبؤ IS, Comptable Comptable MES,htm and TreaveS.L

هيكل المشروع

WeISMS' ياسر بناء خادم بلازور قائم بذاته

Mostlylucid.VoiceForm/
├── Config/
│   └── VoiceFormConfig.cs         # Configuration binding
├── Models/
│   ├── FormSchema/                # Form definitions
│   ├── State/                     # Session state
│   └── Extraction/                # LLM input/output
├── Services/
│   ├── Stt/                       # Speech-to-text (Whisper)
│   ├── Extraction/                # Field extraction (Ollama)
│   ├── Validation/                # Type-based validators
│   ├── StateMachine/              # Form flow control
│   └── Orchestration/             # Coordinates everything
├── Components/
│   └── Pages/                     # Blazor UI
└── wwwroot/js/
    └── audio-recorder.js          # Web Audio API capture

ملاحظة معمارية لا توجد خدمة تعتمد على IS" آخر other other ISMSK0 downer other other other ISMSK

إنشاء الهياكل الأساسية

أولاً: MSSK0 TM تحتاج إلى Wisper وOlama تشغيل محلي محليّاً devdeps-docker-compose.yml:

services:
  whisper:
    image: onerahmet/openai-whisper-asr-webservice:latest
    container_name: whisper-stt
    ports:
      - "9000:9000"
    environment:
      - ASR_MODEL=base.en
      - ASR_ENGINE=faster_whisper
    volumes:
      - whisper-models:/root/.cache/huggingface
    restart: unless-stopped

  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ollama-models:/root/.ollama
    restart: unless-stopped

volumes:
  whisper-models:
  ollama-models:

بعد الدوران في الأعلى Sims,, سحب نموذج لـ OlamaMS:

docker exec -it ollama ollama pull llama3.2:3b

لِمَ المحليات تشغيل كل شيء محلياً هو OS't عن التكلفة IS- IT'

ملاحظة: الـ base.en نموذج Whisper سريع ودقيق للغة الإنجليزية small.en أو medium.en من أجل تحسين الدقة

الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل الشكل

هذا هو المصدر الوحيد للحقيقة لمعرفة ما هي الحقول الموجودة وكيف تتصرف

{
  "id": "customer-intake",
  "name": "Customer Intake Form",
  "fields": [
    {
      "id": "fullName",
      "label": "Full Name",
      "type": "Text",
      "prompt": "Please say your full name.",
      "required": true
    },
    {
      "id": "dateOfBirth",
      "label": "Date of Birth",
      "type": "Date",
      "prompt": "What is your date of birth?",
      "required": true,
      "confirmationPolicy": {
        "alwaysConfirm": true
      }
    },
    {
      "id": "email",
      "label": "Email Address",
      "type": "Email",
      "prompt": "What is your email address?",
      "required": true
    },
    {
      "id": "phone",
      "label": "Phone Number",
      "type": "Phone",
      "prompt": "What is your phone number?",
      "required": false
    },
    {
      "id": "notes",
      "label": "Additional Notes",
      "type": "Text",
      "prompt": "Any additional notes?",
      "required": false
    }
  ]
}

نماذج CoimSMSK01s التي تمثل هذا

public record FormDefinition(
    string Id,
    string Name,
    List<FieldDefinition> Fields);

public record FieldDefinition(
    string Id,
    string Label,
    FieldType Type,
    string Prompt,
    bool Required = true,
    ConfirmationPolicy? ConfirmationPolicy = null);

public enum FieldType
{
    Text,
    Date,
    Email,
    Phone,
    Choice  // Constrained vocabulary - especially important for voice
}

public record ConfirmationPolicy(
    bool AlwaysConfirm = false,
    double ConfidenceThreshold = 0.85);

لأن المخطط هو تفسيري MS, مضافاً المجالات التي لا تتطلب أبداً لمس آلة الدولةالقي تعريفاً ميدانياً جديداً في تعريف JSONIS,، والشكل يتضمنه تلقائياً مع التحكم السليم في التدفق

جهاز الدولة

هنا: MS' الـ الدولة آلة استخدام AJIUMSK01 ITES IMS'Ress nere CIS#, Aregange الذي يحدد التحولات استناداً إلى قواعد صريحة IS.a

public class FormStateMachine : IFormStateMachine
{
    private FormSession _session = null!;
    private int _currentFieldIndex;

    public FormSession StartSession(FormDefinition form)
    {
        _session = new FormSession
        {
            Id = Guid.NewGuid().ToString(),
            Form = form,
            Status = FormStatus.InProgress,
            StartedAt = DateTime.UtcNow,
            FieldStates = form.Fields.ToDictionary(
                f => f.Id,
                f => new FieldState { FieldId = f.Id, Status = FieldStatus.Pending })
        };

        // First field starts in progress
        if (form.Fields.Count > 0)
        {
            _session.FieldStates[form.Fields[0].Id].Status = FieldStatus.InProgress;
        }

        return _session;
    }

    public FieldDefinition? GetCurrentField()
    {
        if (_currentFieldIndex >= _session.Form.Fields.Count)
            return null;

        return _session.Form.Fields[_currentFieldIndex];
    }
}

عمليات الانتقال في الدولة واضحة وقابلة للاختبار

public StateTransitionResult ProcessExtraction(
    ExtractionResponse extraction,
    ValidationResult validation)
{
    var currentField = GetCurrentField();
    if (currentField == null)
        return new StateTransitionResult(false, "No current field");

    var fieldState = _session.FieldStates[currentField.Id];
    fieldState.AttemptCount++;

    // Validation failed? Stay on current field
    if (!validation.IsValid)
    {
        return new StateTransitionResult(
            false,
            $"Validation failed: {validation.ErrorMessage}");
    }

    // Store the pending value
    fieldState.PendingValue = extraction.Value;
    fieldState.PendingConfidence = extraction.Confidence;

    // Check confirmation policy - this is rules, not AI
    var policy = currentField.ConfirmationPolicy
        ?? new ConfirmationPolicy();

    var needsConfirmation = policy.AlwaysConfirm
        || extraction.Confidence < policy.ConfidenceThreshold;

    if (needsConfirmation)
    {
        fieldState.Status = FieldStatus.AwaitingConfirmation;
        return new StateTransitionResult(
            true,
            "Please confirm this value",
            RequiresConfirmation: true);
    }

    // Auto-confirm high confidence values
    return ConfirmValue();
}

نقطة المفتاح الرئيسية: الـ _currentFieldIndex هذا يعني أن الإستخراج الفاشل أو التأكيد المرفوض يبقيك في نفس المجال

ملاحظة منطق التأكيد IS: IT EMS' alwaysConfirm Po= outo OSMSKKK1 outo imstems- concuference o حقل حساس منخفض الثقة IS=

LLLLLLLMSMSK05s جوب

لدى مستخرج Olama وظيفة واحدة:

public interface IFieldExtractor
{
    Task<ExtractionResponse> ExtractAsync(
        ExtractionContext context,
        CancellationToken ct = default);
}

public record ExtractionContext(
    FieldDefinition Field,
    string Prompt,
    string Transcript);

public record ExtractionResponse(
    string FieldId,
    string? Value,
    double Confidence,
    bool NeedsConfirmation,  // Suggestion only - policy has final say
    string? Reason);

المهمس (KMSK) قد يقترح المستخرج ما يلي: NeedsConfirmation: trueلكن سياسة التأكيد دائماً ما تكون لها الكلمة الأخيرة (الرأي (LLLMS' في الرأي هو الإستشاري (LLMS,) الذي ليس موثوقاً به (I.)

والتنفيذ

public class OllamaFieldExtractor : IFieldExtractor
{
    private readonly HttpClient _httpClient;
    private readonly string _model;

    public async Task<ExtractionResponse> ExtractAsync(
        ExtractionContext context,
        CancellationToken ct = default)
    {
        var systemPrompt = BuildSystemPrompt(context.Field);
        var userPrompt = $"User said: \"{context.Transcript}\"";

        var request = new
        {
            model = _model,
            messages = new[]
            {
                new { role = "system", content = systemPrompt },
                new { role = "user", content = userPrompt }
            },
            format = "json",
            stream = false,
            options = new { temperature = 0.1 }  // Low = deterministic
        };

        var response = await _httpClient.PostAsJsonAsync(
            "/api/chat", request, ct);

        return ParseResponse(response, context.Field.Id);
    }
}

لماذا درجة الحرارة؟ نحن نريد أن تكون LLLM مملة ويمكن التنبؤ بها IS.° بالنظر إلى نفس النص IS,° فإنه ينبغي استخراج نفس القيمة في كل وقت IS. T0.1 TRANS TRANSLATORS ISMSK3IRATERATION ISMSKLISH TRANSLATORS TRANSLATORS TRANSLATORS TRANSLATORS TRANSLATORS TRANSLATORS TRANSLATORS

إنّ سرعة النظام واضح حول LLMLMS' دور محدود IS:°

private string BuildSystemPrompt(FieldDefinition field)
{
    return $"""
        You are a data extraction assistant. Extract the {field.Label}
        from the user's speech.

        Field type: {field.Type}

        Return JSON only:
        {{
          "fieldId": "{field.Id}",
          "value": "<extracted value or null>",
          "confidence": <0.0-1.0>,
          "needsConfirmation": <true/false>,
          "reason": "<brief explanation>"
        }}

        Rules:
        - For dates, output ISO format (YYYY-MM-DD)
        - For emails, output lowercase
        - For phones, output digits only
        - If you can't extract, set value to null
        - Be conservative with confidence scores

        DO NOT:
        - Ask follow-up questions
        - Suggest next steps
        - Make assumptions beyond the transcript
        """;
}

مقتطفات LLLLLMSS,ezeimsux type orm orm orm orm isms: IS,, and reports conference:

المتصفح إلى WAV

الجانب المخطّط جافا يلتقط صوت الميكروفون ويحوّله إلى E16

window.voiceFormAudio = (function () {
    let mediaRecorder = null;
    let audioChunks = [];
    let audioContext = null;
    let dotNetRef = null;

    async function startRecording() {
        const stream = await navigator.mediaDevices
            .getUserMedia({ audio: true });

        audioContext = new AudioContext();
        audioChunks = [];

        const options = { mimeType: 'audio/webm;codecs=opus' };
        mediaRecorder = new MediaRecorder(stream, options);

        mediaRecorder.ondataavailable = (event) => {
            if (event.data.size > 0) {
                audioChunks.push(event.data);
            }
        };

        mediaRecorder.onstop = async () => {
            stream.getTracks().forEach(track => track.stop());

            const audioBlob = new Blob(audioChunks, { type: 'audio/webm' });
            const wavBlob = await convertToWav(audioBlob);
            const wavBytes = await wavBlob.arrayBuffer();

            // Send to Blazor
            const uint8Array = new Uint8Array(wavBytes);
            await dotNetRef.invokeMethodAsync(
                'OnRecordingComplete',
                Array.from(uint8Array));
        };

        mediaRecorder.start(100);
    }

    return { initialize, startRecording, stopRecording };
})();

لماذا التحول الى WAVEMSK01)( يقبل Whisper أشكالاً مختلفة IS,. ولكن IS16okHz unU WAV هو مثلى IS- oitS'

الـ convertToWav الدالة Respamples إلى I16okHzHzMSS-.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

مخطط بلازور UIAimsSK0 TMS-

يُظهر UI الحقل الحالي بشكل بارز على اليسار IS,° مع جميع الحقول المرئية في شريط جانبي على اليمين IS.° المسائل الجانبية للثقةيمكن للمستخدمين أن يروا أين هم في الاستمارة IS,IR ما الذي أجابوا عليه بالفعل IS'.

graph LR
    subgraph "Left Panel"
        A[Current Field Prompt]
        B[Record Button]
        C[Transcript Display]
        D[Confirmation Dialog]
    end

    subgraph "Right Sidebar"
        E[Field 1: Full Name ✓]
        F[Field 2: DOB - Active]
        G[Field 3: Email - Pending]
        H[Field 4: Phone - Pending]
    end

    style F stroke:#36f,stroke-width:2px
    style E stroke:#6f6,stroke-width:2px

هنا: MS'Is هيكل صفحة بلازور Plazor IS:

@page "/voiceform/{FormId}"
@inject IFormOrchestrator Orchestrator
@rendermode InteractiveServer

<div class="top-bar">
    <h1>Voice Form</h1>
    <button class="theme-toggle" onclick="voiceFormTheme.toggle()">
        Dark Mode
    </button>
</div>

<main>
    <div class="voice-form-layout">
        <!-- Left: Active Field -->
        <div class="active-field-panel">
            @if (_currentField != null)
            {
                <div class="current-prompt">
                    <h2>@_currentField.Label</h2>
                    <p class="prompt-text">@_message</p>
                </div>

                <AudioRecorder OnAudioCaptured="HandleAudioCaptured"
                               IsRecording="_isRecording"
                               IsProcessing="_isProcessing" />

                @if (!string.IsNullOrEmpty(_transcript))
                {
                    <TranscriptDisplay Transcript="_transcript"
                                       Confidence="_transcriptConfidence" />
                }

                @if (_showConfirmation)
                {
                    <ConfirmationDialog ExtractedValue="_pendingValue"
                                        OnConfirm="HandleConfirm"
                                        OnReject="HandleReject" />
                }
            }
        </div>

        <!-- Right: Form Overview -->
        <div class="form-sidebar">
            <h3>@_session.Form.Name</h3>
            <div class="form-fields-list">
                @foreach (var field in _session.Form.Fields)
                {
                    var state = _session.GetFieldState(field.Id);
                    <div class="form-field-item @GetFieldClass(field, state)">
                        <div class="field-status-icon">
                            @GetStatusIcon(state.Status)
                        </div>
                        <div class="field-info">
                            <div class="field-name">@field.Label</div>
                            <div class="field-value">
                                @(state.Value ?? "Waiting")
                            </div>
                        </div>
                    </div>
                }
            </div>
        </div>
    </div>
</main>

المُوَرِّج mS: ترجمة كل شيء معًا

المُنظِّم يُنسِّق الخدمات لا فرع لمنطقه الخاصEMS-jeit فقط يدعو الخدمات في سلسلة متتابعة ويمرر النتائج على طول

public class FormOrchestrator : IFormOrchestrator
{
    private readonly ISttService _sttService;
    private readonly IFieldExtractor _extractor;
    private readonly IFormValidator _validator;
    private readonly IFormStateMachine _stateMachine;
    private readonly IFormEventLog _eventLog;

    public async Task<ProcessingResult> ProcessAudioAsync(byte[] audioData)
    {
        var currentField = _stateMachine.GetCurrentField();
        if (currentField == null)
            return ProcessingResult.Error("No current field");

        // Step 1: Speech to text
        var sttResult = await _sttService.TranscribeAsync(audioData);
        await _eventLog.LogAsync(new TranscriptReceivedEvent(
            currentField.Id, sttResult.Transcript, sttResult.Confidence));

        // Step 2: Extract structured value
        var context = new ExtractionContext(
            currentField, currentField.Prompt, sttResult.Transcript);
        var extraction = await _extractor.ExtractAsync(context);
        await _eventLog.LogAsync(new ExtractionAttemptEvent(
            currentField.Id, extraction));

        // Step 3: Validate
        var validation = _validator.Validate(currentField, extraction.Value);

        // Step 4: State machine decides next step
        var transition = _stateMachine.ProcessExtraction(extraction, validation);

        return new ProcessingResult(
            Success: transition.Success,
            Message: transition.Message,
            Session: _stateMachine.GetSession(),
            RequiresConfirmation: transition.RequiresConfirmation,
            PendingValue: extraction.Value);
    }
}

كل خطوة مستقلة وقابلة للإختبار لا تلمس الشبكة أبداًالـ LLM لا تلمس الدولة أبداً.

متغيرات CSS للربح

يُنفّذ نمط الظلام مع CSS مع خصائص مخصصّة لـ CSSSMS:.

:root {
    --bg-primary: #f8fafc;
    --bg-secondary: #ffffff;
    --text-primary: #1e293b;
    --accent-blue: #3b82f6;
    --accent-green: #22c55e;
}

[data-theme="dark"] {
    --bg-primary: #0f172a;
    --bg-secondary: #1e293b;
    --text-primary: #f1f5f9;
    --accent-blue: #60a5fa;
    --accent-green: #4ade80;
}

body {
    background: var(--bg-primary);
    color: var(--text-primary);
}

لا يزال الموضوع المزدج مستمراً عن طريق Stoge المحلي MS:

window.voiceFormTheme = (function () {
    const THEME_KEY = 'voiceform-theme';

    function toggle() {
        const current = document.documentElement
            .getAttribute('data-theme') || 'light';
        const newTheme = current === 'dark' ? 'light' : 'dark';
        document.documentElement.setAttribute('data-theme', newTheme);
        localStorage.setItem(THEME_KEY, newTheme);
    }

    // Initialize from saved preference or system preference
    function init() {
        const saved = localStorage.getItem(THEME_KEY);
        const systemDark = window.matchMedia(
            '(prefers-color-scheme: dark)').matches;
        const theme = saved || (systemDark ? 'dark' : 'light');
        document.documentElement.setAttribute('data-theme', theme);
    }

    return { toggle, init };
})();

اختبار وحدة اختبار وحدة اختبار وحدة

البنيان التحديدي يُؤدّي في الاختبار IS.oHyraims'gs اختبار وحدة آلية الولاية للمسار السعيد IS:\

[Fact]
public void ProcessExtraction_HighConfidence_AutoConfirms()
{
    // Arrange
    var form = CreateTestForm();
    var stateMachine = new FormStateMachine();
    stateMachine.StartSession(form);

    var extraction = new ExtractionResponse(
        FieldId: "fullName",
        Value: "John Smith",
        Confidence: 0.95,  // High confidence
        NeedsConfirmation: false,
        Reason: "Clear speech");

    var validation = ValidationResult.Success();

    // Act
    var result = stateMachine.ProcessExtraction(extraction, validation);

    // Assert
    result.Success.Should().BeTrue();
    result.RequiresConfirmation.Should().BeFalse();

    var fieldState = stateMachine.GetSession()
        .GetFieldState("fullName");
    fieldState.Status.Should().Be(FieldStatus.Confirmed);
    fieldState.Value.Should().Be("John Smith");
}

وهنا يوجد اختبار سلبي IS- وثقة منخفضة بغض النظر عمّا تقترحه LLLMS:

[Fact]
public void ProcessExtraction_LowConfidence_RequiresConfirmation()
{
    // Arrange
    var form = CreateTestForm();
    var stateMachine = new FormStateMachine();
    stateMachine.StartSession(form);

    var extraction = new ExtractionResponse(
        FieldId: "fullName",
        Value: "John Smith",
        Confidence: 0.65,  // Below threshold
        NeedsConfirmation: false,  // LLM says no, but policy overrides
        Reason: "Noisy audio");

    var validation = ValidationResult.Success();

    // Act
    var result = stateMachine.ProcessExtraction(extraction, validation);

    // Assert
    result.RequiresConfirmation.Should().BeTrue(
        "Policy threshold (0.85) should override LLM suggestion");

    var fieldState = stateMachine.GetSession()
        .GetFieldState("fullName");
    fieldState.Status.Should().Be(FieldStatus.AwaitingConfirmation);
}

وإختبار متصفح Puppeteer Sharp الذي في الواقع يضغط على الأشياء

[Fact]
public async Task HomePage_ThemeToggle_ShouldSwitchTheme()
{
    await _page!.GoToAsync(BaseUrl);
    await _page.WaitForSelectorAsync(".theme-toggle");

    var initialTheme = await _page.EvaluateFunctionAsync<string?>(
        "() => document.documentElement.getAttribute('data-theme')");

    // Click toggle
    await _page.ClickAsync(".theme-toggle");
    await Task.Delay(100);

    var newTheme = await _page.EvaluateFunctionAsync<string?>(
        "() => document.documentElement.getAttribute('data-theme')");

    newTheme.Should().NotBe(initialTheme);
}

[Fact]
public async Task VoiceFormPage_Sidebar_ShouldShowAllFields()
{
    await _page!.GoToAsync($"{BaseUrl}/voiceform/customer-intake");
    await _page.WaitForSelectorAsync(".form-fields-list");

    var fieldItems = await _page.QuerySelectorAllAsync(".form-field-item");

    fieldItems.Should().HaveCount(5, "Customer intake form has 5 fields");
}

يُجري جناح الاختبار الكامل اختبارات وحدات اختبار ISMSKL IS-76 ' ISMSK1 ' لاختبارات تكامل المتصفح لمنطق الأعمال

لِمَ هذا العمْر مسائل

دعونا نرجع لماذا بنيناه بهذه الطريقة

graph TD
    subgraph "Traditional Voice Form"
        A1[User Speaks] --> B1[LLM]
        B1 --> C1[LLM decides field]
        C1 --> D1[LLM validates]
        D1 --> E1[LLM confirms]
        E1 --> F1[LLM advances form]
    end

    subgraph "Ten Commandments Approach"
        A2[User Speaks] --> B2[Whisper STT]
        B2 --> C2[Ollama Extract]
        C2 --> D2[C# Validator]
        D2 --> E2[Policy Check]
        E2 --> F2[State Machine]
    end

    style B1 stroke:#f96,stroke-width:2px
    style C1 stroke:#f96,stroke-width:2px
    style D1 stroke:#f96,stroke-width:2px
    style E1 stroke:#f96,stroke-width:2px
    style F1 stroke:#f96,stroke-width:2px

    style C2 stroke:#f96,stroke-width:2px
    style D2 stroke:#6f6,stroke-width:2px
    style E2 stroke:#6f6,stroke-width:2px
    style F2 stroke:#6f6,stroke-width:2px

في النهج التقليدي كل شيء هو كل شيء هو LLMEMSK01 كل قرار هو قرار غير صحيح كل اختبار هو احتمالي - كل حشرة هي IS"Jit فقط في بعض الأحيان تفعل أن IS"- unrereproproducable وغير قابل للتفسير MESK6.

في نهجنا (SMS,) فإن LLLM مُرْكَكَكَ شيءترجم الكلام إلى القيم المُهَكَّلة:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

هذا هو الوصايتان MESK0o o3, oMSK1 o o4 بوصة إجراء OS: LLLM ترجمة IS, TRANSLAT TRANSLAT TRANSLAT TRANSLAT TRANSLAT TRANSLAT TRANSLATORS

تُدْرِك نفسك

  1. ابدأ المُعتمداتSMSSK0
docker compose -f devdeps-docker-compose.yml up -d
docker exec -it ollama ollama pull llama3.2:3b
  1. تشغيل التطبيق MSMK0
cd Mostlylucid.VoiceForm
dotnet run
  1. من تاريخ إلى: http://localhost:5000

  2. انقر

ثالثاً - استنتاج

واجهات صوتية دون Don IS'itt يجب أن تكون مربعات سوداء (S.) بمعاملة الخطاب كمجرد طريقة إدخال أخرى (IS,) LLLMs كمترجمين (IS,) والاحتفاظ بتحكم تدفق في الشفرة التحديدية (S,) تحصل على (IS:)

  • السلوك الذي يمكن تحمله نفس المدخلات
  • معامل اختبارات الوحدة لقواعد العمل
  • المقررات كل حالة انتقال إلى كل ولاية مُسجّل
  • **** صوت EMS- / صوت فشل ISMS?ر8 النوع بدلاً من
  • العمليات المحلية لا تعتمدات سحابة للوظيفة الأساسية

الـ E"\Ten الوصايا الـ com't حول أن تكون مضادة لـ EMS- AIMS. ems'tre حول وضع AIA في مكانها الصحيحE:? أداة قوية تترجم بين الفوضى البشرية و دقة الحاسوب

الآن اذهب الآن إلى بناء شيء حيث أنت o

في الجزء EMS2: TM( IVRMS)

حالياً ICCMS, تصفح المستخدم لقراءة التنبيهات ويتحدث عن الردود و لكن ماذا لو كان النظام قادراً على تَحَكَّم بالعكسسيضيف الجزء e? Part I2)) النص التالي: IS-o- speech تعقيبياً IS,)) الذي سيحول هذا النص إلى نظام كامل للاستجابة للصوت التفاعلي IVR IS()) System IS:))

  • شهادت القراء من فضلك قل اسمك الكامل
  • (أ) يؤكد أن عمليات الإزالة لقد سمعت E' ochn Smithims'.? هل هذا صحيح؟
  • حالة اصوات لـ تسجيل بدء تشغيل EMS/ststst IS, o
  • العملية الخالية من العكـد الاستمارات الكاملة بدون النظر إلى الشاشة

تم بالفعل إعداد الهيكل IS: TRANSLAMSCL TRANSLATOR SY, TRANSLATOR DISSES IS. ISMSK2 ISMSK0 TRANSLATINSLATOR TRANSLATOR TRANSLATORS ISMSK2 ISMSK2 ISDORTORS هي مجرد خدمة أخرى تستمع إلى تلك الأحداث IS.)(

قريباً قريباً

& ما

الشفرة المصدرية الكاملة موجودة في Mostlylucid.VoiceForm في المشروع المشترك بين برنامج الأمم المتحدة المشترك بين

Finding related posts...
logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.