حزمة استخدام الصوت: المؤثرات الصوتية في تطبيقات التفاعل

ربما الحقيقة هي أنني كنت مهتماً بالصوت بشكل احترافي ، لكني أريد أن تكون الويب أعلى.

أعلم أن الكثيرين لن يدعموني في هذه الرغبة. وليس بدون سبب! تاريخيا ، تم استخدام الأصوات على الإنترنت دون جدوى وقبيحة للغاية:

  • في الأيام الأولى للويب ، قامت بعض الصفحات بتشغيل موسيقى MIDI في الخلفية.
  • يستخدم المحتالون المنبثقة الأصوات لتحقيق أهدافهم السيئة. إنهم ، بمساعدة الأصوات ، يسعون إلى جذب انتباه المستخدمين وجعل الاحتيال أكثر تصديقًا.
  • الصوت موجود في مقاطع الفيديو التي تبدأ تلقائيًا (حسنًا ، هذا كابوس تمامًا).

صحيح ، أنا متأكد من أن التخلي عن الصوت تمامًا كما لو كان الطفل يرش بالماء. يمكن للأصوات أن تؤكد على إجراءات المستخدم ، ويمكن أن تعزز الملاحظات. يمكن للصوت أن يضيء بعض الإجراءات المملة. إذا تم استخدام الأصوات على صفحات الويب مع الذوق ، فيمكنها تحسين تجربة المستخدم للمشروع ، مما يجعله أكثر "ملموسًا" وواقعيًا. هذه الفكرة ليست جديدة: في الألعاب وفي تطبيقات الهاتف المحمول يتم استخدام الأصوات باستمرار. في الواقع ، الويب هو استثناء غريب للاتجاه العام. معظم المنتجات الرقمية التي تتبادر إلى ذهني تستخدم الأصوات. أنا لا أتحدث عن الاستجابة اللمسية المستخدمة في تطبيقات الهاتف المحمول لتقريبها من الواقع.





في سياق العمل على مدونتي ، أردت تجربة الصوت. تنتج العديد من عناصر واجهة مدونتي التي يتفاعل معها المستخدمون أصواتًا قصيرة هادئة. على سبيل المثال ، في الجزء العلوي الأيمن من الصفحة الرئيسية للمدونة ، يوجد زران للتبديل بين الموضوعات وتشغيل الصوت وإيقاف تشغيله.

نظرًا نادرًا ما يتم استخدام الأصوات على الويب ، يمكن أن يكون لاستخدامها تأثير كبير على إدراك المستخدمين للموقع. هذا هو نوع من الأسلحة السرية للمطور ، والذي يمكن أن يؤدي استخدامه إلى تأثير إيجابي كبير بشكل مدهش على بعض المشاريع.

من أجل تبسيط استخدام الأصوات ، صممت الخطاف الذي استخدمته للعمل مع الأصوات في شكل حزمة npm مستقلة use-soundونشرتها. هنا سأتحدث عن قدرات هذا الخطاف ومشاركة النصائح حول استخدام الصوت على الويب.

إذا كنت حريصًا على رؤية الرمز والبدء في استخدام هذا الخطاف - فإليك مستودع GitHub.

نظرة عامة


الحزمة use-soundعبارة عن خطاف تفاعل يساعد المطورين على استخدام المؤثرات الصوتية. هنا مثال:

import useSound from 'use-sound';
import boopSfx from '../../sounds/boop.mp3';
const BoopButton = () => {
  const [play] = useSound(boopSfx);
  return <button onClick={play}>Boop!</button>;
};

يضيف استخدام هذا الخطاف حوالي 1 كيلوبايت إلى بنية المشروع. صحيح ، إنه في الوضع غير المتزامن ، يقوم بتحميل تبعية Howler تابعة لجهة خارجية ، يبلغ حجمها 10 كيلوبايت.

يمنح الخطاف المطور العديد من الميزات اللطيفة. من بينها ، أود أن أشير إلى ما يلي:

  • أوقف التشغيل قبل الأوان ، بالإضافة إلى إيقاف التشغيل مؤقتًا واستئنافه.
  • تنزيل شيء مثل "ورقة الرموز المتحركة" الصوتية وتقسيمها إلى أصوات منفصلة.
  • ضبط سرعة التشغيل مع القدرة على تسريع وإبطاء تشغيل الأصوات.
  • الكثير من مستمعي الحدث.
  • تتوفر العديد من الميزات المتقدمة بفضل Howler.

فيما يلي وثائق الخطاف حيث يمكنك العثور على دليل مفصل لاستخدامه ومرجع API.

أساسيات استخدام الصوت


▍ التثبيت


تحتاج أولاً إلى تثبيت الحزمة باستخدام الغزل أو npm:

#  yarn
yarn add use-sound
#  NPM
npm install use-sound

▍ استيراد


use-soundتصدر الحزمة القيمة الافتراضية الوحيدة - هذه خطاف useSound. يمكنك استيرادها على النحو التالي:

import useSound from 'use-sound';

بالإضافة إلى ذلك ، ستحتاج إلى استيراد الملفات الصوتية التي تخطط لاستخدامها.

إذا كنت ، عند العمل في مشروعات React ، تستخدم شيئًا مثل create-react-appGatsby ، فيجب أن تكون قادرًا على استيراد ملفات MP3 بنفس طريقة استيراد الموارد الأخرى - مثل الصور:

import boopSfx from '../../sounds/boop.mp3';

إذا كنت تستخدم تكوين Webpack مكتوب ذاتيًا ، فستحتاج إلى استخدام أداة تحميل الملفات لمعالجة ملفات mp3 .

بالإضافة إلى ذلك ، يمكنك العمل مع ملفات الصوت الموضوعة في مجلدات publicأو static. على سبيل المثال ، تستخدم العروض التوضيحية الموضحة في هذه المقالة ملفات ثابتة موجودة في مجلد عام.

بحث وإعداد الأصوات


تثبيت التبعيات وكتابة التعليمات البرمجية ليست سوى نصف المعركة. لتسجيل الصفحات ، نحتاج إلى تحديد الأصوات المناسبة.

المصدر المفضل لدي للبحث عن الأصوات هو freesound.org . وجدت تقريبًا جميع الأصوات المستخدمة في مدونتي. هناك العديد من الأصوات المرخصة بموجب Creative Commons Zero . لتنزيل الملفات تحتاج إلى التسجيل في المورد. يمكنك استخدام الأصوات مجانًا.

كن مستعدًا لحقيقة أنه من أجل تحديد الصوت المناسب ، يجب عليك البحث عن محتويات freesound.org بجدية. النقطة هنا هي ، على سبيل المثال ، أن العديد من الأصوات ذات جودة رديئة. يمكن مقارنة عملية البحث عن الصوت المناسب بعملية البحث عن إبرة في كومة قش. ويشبه إعداد الصوت الموجود للاستخدام الفعلي وجهًا من الألماس غير المقطوع.

reإعداد الأصوات


تحتاج العديد من الأصوات المأخوذة من freesound.org إلى بعض التحسينات:

  • يمكن تأطير الأصوات ، مثل السلاسل ، بمساحة فارغة. عادة ما يتم قطع أجزاء الصمت ، ونتيجة لذلك ، يتم إعادة إنتاج التأثير الصوتي المقابل مباشرة بعد حدوث الحدث المعبر عنه.
  • عند إعداد الأصوات ، قد تحتاج إلى ضبط مستوى صوتها ، بحيث تكون جميع الأصوات المستخدمة في مشروع واحد لها نفس مستوى الصوت.
  • يحتوي موقع Freesound.org على أصوات مخزنة بتنسيقات صوتية مختلفة. قد تحتاج إلى تحويل الأصوات التي تفضلها إلى MP3.

يمكنك استخدام Audacity لإكمال كل هذه التعديلات. هذا هو محرر صوتي مجاني مفتوح المصدر عبر الأنظمة الأساسية. لن أتحدث هنا عن كيفية استخدام هذا المحرر ، ولكن هناك العديد من الدروس الرائعة حوله.

لماذا أتحدث عن تحويل الأصوات إلى MP3؟ والحقيقة هي أنه قبل عدم وجود تنسيق صوت مدعوم من جميع المتصفحات. لذلك ، كان من الشائع تضمين ملفات MP3 و AIFF و WAV في المشاريع واستخدامها في البيئات التي تدعمها.

لحسن الحظ بالنسبة لنا ، فإن تنسيق MP3 مدعوم من قبل جميع المتصفحات الرئيسية ، بما في ذلك IE 9. كما أن الصوت المخزن بتنسيق MP3 مضغوط بشكل جيد للغاية. وهذا يسمح لك بالذهاب إلى ملفات أصغر بكثير من استخدام صيغ بديلة ترميز الصوت دون فقدان الجودة.

الصوت والتوافر


على الرغم من أنني أدعو إلى استخدام الأصوات على الويب ، إلا أنني أعترف أنه لن يحبها جميع المستخدمين. وهنا نتحدث عن اعتبارات تتجاوز الرغبة الذاتية للصمت.

يستخدم الأشخاص الذين يعانون من مشاكل في الرؤية قارئات الشاشة لاستخدام صفحات الويب. علاوة على ذلك ، نحن لا نتحدث فقط عن أولئك الذين لا يرون الصفحات. يتم استخدام قارئات الشاشة ، على سبيل المثال ، من قبل الأشخاص الذين يعانون من عسر القراءة الذين يجدون صعوبة في إدراك النص ، والأشخاص الذين يعانون من مشاكل مماثلة أخرى. برامج قراءة الشاشة هي برامج تقوم بتحليل المستندات وقراءة النصوص. إذا كان الموقع يحتوي على الكثير من المؤثرات الصوتية ، فيمكن أن يتداخل مع التشغيل العادي للبرامج التي تقرأ النص من الشاشة. وهذا بدوره سيمنع الأشخاص الذين يعتمدون على مثل هذه البرامج من العمل مع الموقع.

لهذا السبب ، من المهم أن يتم تضمين زر لتشغيل الصوت وإيقافه في صفحات الموقع. علاوة على ذلك ، يجب أن يكون هذا الزر متاحًا للتنقل بلوحة المفاتيح (باستخدام مفتاح Tab). من الناحية المثالية ، حتى يصل المستخدم إلى مثل هذا الزر باستخدام مفتاح Tab ، لا ينبغي تشغيل أي أصوات. بالإضافة إلى ذلك ، من الضروري أن يتذكر مشروع الويب حالة هذا الزر - بحيث لا يضطر المستخدم إلى اللجوء إليه باستمرار لكتم الصوت.

من ناحية أخرى ، لن يعرف المستخدمون ضعاف السمع حتى أن بعض التفاعلات مع الصفحات مصحوبة بالصوت. وينطبق الشيء نفسه على الأشخاص الذين يعملون على الإنترنت مع إيقاف تشغيل الصوت. لهذا السبب ، من المهم عدم الاعتماد فقط على الصوت عند تنفيذ بعض الإجراءات المهمة. إذا تم استخدام الصوت كتأكيد لبعض إجراءات المستخدم ، فتأكد من عرض التأكيد المرئي لهذا الإجراء أيضًا على الصفحة. يجب أن تظل المواقع تعمل بكامل طاقتها وخالية من الصوت.

وصفات


ألق نظرة على بعض الأمثلة (في القسم المقابل من أصل هذه المقالة ، يمكنك تجربتها بشكل تفاعلي والاستماع إلى الأصوات التي تصدرها عناصر التحكم المختلفة).

▍ خانة الاختيار


انا حقا احب هذا العلم إذا كنت تستخدم الماوس ، فانقر عليه أولاً بسرعة كبيرة ، ومن ثم يكون هناك توقف طفيف بين لحظة النقر وتحرير زر الماوس.

function Demo() {
  const [isChecked, setIsChecked] = React.useState(
    false
  );

  const [playActive] = useSound(
    '/sounds/pop-down.mp3',
    { volume: 0.25 }
  );
  const [playOn] = useSound(
    '/sounds/pop-up-on.mp3',
    { volume: 0.25 }
  );
  const [playOff] = useSound(
    '/sounds/pop-up-off.mp3',
    { volume: 0.25 }
  );

  return (
    <Checkbox
      name="demo-checkbox"
      checked={isChecked}
      size={24}
      label="I agree to self-isolate"
      onChange={() => setIsChecked(!isChecked)}
      onMouseDown={playActive}
      onMouseUp={() => {
        isChecked ? playOff() : playOn();
      }}
    />
  );
}

▍ الانقطاع المبكر لاستنساخ الصوت


في بعض الأحيان تريد تشغيل الصوت فقط عندما يتفاعل المستخدم مع عنصر تحكم معين. انتبه إلى الطريقة في المثال التالي التي يتم فيها إعادة إنتاج الصوت فقط عندما يكون المؤشر أعلى عنصر التحكم.

function Demo() {
  // ,  ,  'rising-pops' :
  // - fanfare
  // - dun-dun-dun
  // - guitar-loop
  const soundUrl = '/sounds/rising-pops.mp3';

  const [play, { stop }] = useSound(
    soundUrl,
    { volume: 0.5 }
  );

  const [isHovering, setIsHovering] = React.useState(
    false
  );

  return (
    <Button
      onMouseEnter={() => {
        setIsHovering(true);
        play();
      }}
      onMouseLeave={() => {
        setIsHovering(false);
        stop();
      }}
    >
      <ButtonContents isHovering={isHovering}>
        Hover over me!
      </ButtonContents>
    </Button>
  );
}

زيادة درجة الصوت


وإليك مثال على تأثير واحد مثير للاهتمام. وهو يتألف من حقيقة أن الصوت الناتج عن النقرة التالية على زر الإعجاب أعلى من الصوت الذي تم إنتاجه بواسطة النقرة السابقة عليه:

function Demo() {
  const soundUrl = '/sounds/glug-a.mp3';

  const [playbackRate, setPlaybackRate] = React.useState(0.75);

  const [play] = useSound(soundUrl, {
    playbackRate,
    volume: 0.5,
  });

  const handleClick = () => {
    setPlaybackRate(playbackRate + 0.1);
    play();
  };

  return (
    <Button onClick={handleClick}>
      <span role="img" aria-label="Heart">
      </span>
    </Button>
  );
}

▍ زر لبدء التشغيل وإيقافه مؤقتًا


إليك رمز التنفيذ الخاص بالزر لبدء الصوت وإيقافه مؤقتًا ، والذي سيساعدك في تطوير Spotify الجديد:

function Demo() {
  const soundUrl = '/sounds/guitar-loop.mp3';

  const [play, { stop, isPlaying }] = useSound(soundUrl);

  return (
    <PlayButton
      active={isPlaying}
      size={60}
      iconColor="var(--color-background)"
      idleBackgroundColor="var(--color-text)"
      activeBackgroundColor="var(--color-primary)"
      play={play}
      stop={stop}
    />
  );
}

▍ صوت "قوائم العفريت"


إذا كنت تخطط لاستخدام الكثير من الأصوات في مكون التفاعل الخاص بك ، فقد يكون من المنطقي استخدام "قوائم الرموز المتحركة" الصوتية. قائمة sprite الصوتية هي ملف يحتوي على العديد من الأصوات المختلفة. من خلال حزمها في ملف واحد ، فإننا نزيد من سهولة العمل معها وتجنب إجراء العديد من طلبات HTTP المتوازية لتنزيل الملفات الفردية (آمل أن نتمكن يومًا ما من استخدام تعدد الإرسال HTTP / 2).

هنا نستخدم "قائمة الرموز المتحركة" الصوتية لإنشاء آلة طبل. يمكنك لعب بكرات افتراضية إما باستخدام الماوس أو باستخدام المفاتيح 1-4 على لوحة المفاتيح.

function Demo() {
  const soundUrl = '/sounds/909-drums.mp3';

  const [play] = useSound(soundUrl, {
    sprite: {
      kick: [0, 350],
      hihat: [374, 160],
      snare: [666, 290],
      cowbell: [968, 200],
    }
  });

  //  ,   'keydown',
  //    .
  useKeyboardBindings({
    1: () => play({ id: 'kick' }),
    2: () => play({ id: 'hihat' }),
    3: () => play({ id: 'snare' }),
    4: () => play({ id: 'cowbell' }),
  })

  return (
    <>
      <Button
        aria-label="kick"
        onMouseDown={() => play({ id: 'kick' })}
      >
        1
      </Button>
      <Button
        aria-label="hihat"
        onMouseDown={() => play({ id: 'hihat' })}
      >
        2
      </Button>
      <Button
        aria-label="snare"
        onMouseDown={() => play({ id: 'snare' })}
      >
        3
      </Button>
      <Button
        aria-label="cowbell"
        onMouseDown={() => play({ id: 'cowbell' })}
      >
        4
      </Button>
    </>
  );
}

التفاصيل حول استخدام الصوت "قوائم العفريت" في حزمة use-soundيمكن العثور عليها هنا .

ملخص


في مجال استخدام الأصوات عند تطوير مواقع الويب ، أنا قلق للغاية من حقيقة أن هذا المجال لم تتم دراسته إلا قليلاً. لقد جربت الأصوات لبعض الوقت ، لكنني ما زلت أشعر أنني في بداية الرحلة فقط.

لذا ، لديك الآن أدوات تحت تصرفك يمكنك استخدامها لبدء تجاربك الخاصة مع الصوت. أقترح عليك القيام بذلك ومعرفة المكان الذي سيقودك إليه.

القراء الأعزاء! ما هو شعورك حيال استخدام الأصوات على صفحات الويب؟


All Articles