πŸ’‘ Playwrightμ—μ„œ 마이크 κΈ°λŠ₯ μžλ™ν™”ν•˜κΈ°

2025. 12. 13. 18:48Β·πŸ“‚ Quality Assurance/πŸ“„ Experience & Insight

πŸ“Œ μŒμ„± μž…λ ₯이 ν•„μš”ν•œ ν…ŒμŠ€νŠΈ ν™”λ©΄

μš”μ¦˜ νšŒμ‚¬ μ„œλΉ„μŠ€ ν…ŒμŠ€νŠΈ μžλ™ν™” μ½”λ“œλ₯Ό Playwright + TypeScript둜 μž‘μ„±ν•˜κ³  μžˆλ‹€.
λ²„νŠΌ 클릭, μž…λ ₯μ°½ 검증 같은 기본적인 UI ν…ŒμŠ€νŠΈλŠ” μ–΄λŠ 정도 μ΅μˆ™ν•΄μ‘ŒλŠ”λ°,
μ΄λ²ˆμ— 처음으둜 마이크 μž…λ ₯이 ν•„μˆ˜μΈ 화면을 μžλ™ν™”ν•΄μ•Ό ν–ˆλ‹€.

 

μ‹€μ œλ‘œ μŒμ„± μž…λ ₯이 μ—†λŠ” μƒνƒœμ—μ„œλŠ” λ‹€μŒ λ‹¨κ³„λ‘œ λ„˜μ–΄κ°ˆ 수 없도둝 λ§‰ν˜€ μžˆμ—ˆκ³ ,
맀번 μ‚¬λžŒμ΄ 직접 말해야 ν•œλ‹€λ©΄ νšŒκ·€ ν…ŒμŠ€νŠΈλ‚˜ 반볡 ν…ŒμŠ€νŠΈμ—μ„œ μžλ™ν™”μ˜ μ˜λ―Έκ°€ 크게 쀄어든닀.
κ·Έλž˜μ„œ μ–΄λ–»κ²Œλ“  μ‚¬λžŒμ˜ λͺ©μ†Œλ¦¬λ₯Ό μ“°μ§€ μ•Šκ³  ν…ŒμŠ€νŠΈν•  방법을 μ°Ύμ•„λ³΄κΈ°λ‘œ ν–ˆλ‹€.

 

πŸ“Œ μŒμ„± νŒŒμΌμ„ 마이크 μž…λ ₯처럼 μ“°λŠ” 방식

κ²°λ‘ λΆ€ν„° λ§ν•˜λ©΄, μ‹€μ œ 마이크 λŒ€μ‹  미리 μ€€λΉ„ν•œ μŒμ„± νŒŒμΌμ„ 마이크 μž…λ ₯처럼 μ‚¬μš©ν•˜λŠ” 방식을 μ„ νƒν–ˆλ‹€.

 

λ¨Όμ € ν…ŒμŠ€νŠΈμ— μ‚¬μš©ν•  λ¬Έμž₯을 μ§μ ‘ μž‘μ„±ν–ˆλ‹€.  
μ‹€μ œ μ‚¬μš©μžκ°€ λ§ν•  λ²•ν•œ λŒ€λ³Έμ„ κΈ°μ€€μœΌλ‘œ λ¬Έμž₯을 λ§Œλ“€κ³ ,
ElevenLabsλ₯Ό μ΄μš©ν•΄ mp3 μŒμ„± νŒŒμΌλ‘œ μƒμ„±ν–ˆλ‹€.

μ²˜μŒμ—” mp3 νŒŒμΌμ„ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λ©΄ λ  μ€„ μ•Œμ•˜μ§€λ§Œ,
Playwrightμ—μ„œ κ°€μ§œ λ§ˆμ΄ν¬ μž…λ ₯으둜 μ‚¬μš©ν•  μˆ˜ μžˆλŠ” νŒŒμΌ ν˜•식은 wav νŒŒμΌμ΄μ—ˆλ‹€.
κ·Έλž˜μ„œ mp3 -> wav λ³€ν™˜μ„ μ§„ν–‰ν–ˆκ³ , freeconvertλ₯Ό μ‚¬μš©ν•΄ κ°„λ‹¨νžˆ ν•΄κ²°ν–ˆλ‹€.

 

πŸ“Œ 마이크 μžλ™ν™”μ˜ 핡심은 이 3κ°€μ§€ μ˜΅μ…˜

μ—¬λŸ¬ μ‹œν–‰μ°©μ˜€ 끝에 μ•Œκ²Œ 된 사싀은,
마이크 μžλ™ν™”μ˜ 핡심은 ν…ŒμŠ€νŠΈ μ½”λ“œλ³΄λ‹€ λΈŒλΌμš°μ € μ‹€ν–‰ μ˜΅μ…˜μ— μžˆλ‹€λŠ” κ²ƒμ΄μ—ˆλ‹€.

 

μ•„λž˜ 3κ°€μ§€ μ˜΅μ…˜μ΄ ν•„μš”ν•˜λ‹€.

--use-fake-device-for-media-stream              // νŒμ—… 차단
--use-fake-ui-for-media-stream                  // μž₯치 λŒ€μ²΄
--use-file-for-fake-audio-capture=PATH_TO_WAV   // μž…λ ₯ μ†Œλ¦¬ 제곡

이 μ˜΅μ…˜λ“€μ΄ 적용되면 ν…ŒμŠ€νŠΈ ν™˜κ²½μ—μ„œλŠ” λ‹€μŒκ³Ό 같은 일이 λ²Œμ–΄μ§„λ‹€.

  • 마이크 permission νŒμ—…μ΄ λœ¨μ§€ μ•Šκ³ 
  • Chromium이 μ‹€μ œ 마이크 λŒ€μ‹  κ°€μ§œ 마이크 μž₯치(fake mic)λ₯Ό μ‚¬μš©ν•˜λ©°
  • μ§€μ •ν•œ wav νŒŒμΌμ„ 마이크 μž…λ ₯ 슀트림으둜 ν˜λ €λ³΄λ‚Έλ‹€

μ—¬κΈ°μ„œ κ°€μž₯ μ€‘μš”ν–ˆλ˜ ν¬μΈνŠΈλŠ” 이건 ‘λ…ΉμŒ’이 μ•„λ‹ˆλΌ ‘μž…λ ₯’이닀.

wav νŒŒμΌμ„ κ·Έλƒ₯ μž¬μƒν•˜λŠ” 게 μ•„λ‹ˆλ‹€. λΈŒλΌμš°μ € μž…μž₯μ—μ„œλŠ” μ§„μ§œ μž…λ ₯ μž₯μΉ˜μ—μ„œ μ†Œλ¦¬κ°€ λ“€μ–΄μ˜€κ³  μžˆλ‹€κ³  λ―ΏλŠ” μƒνƒœκ°€ λœλ‹€.
κ·Έλž˜μ„œ STT(Speech To Text) κΈ°λŠ₯도 "μ§€κΈˆ λˆ„κ΅°κ°€ λ§ν•˜κ³  μžˆλ‹€"κ³  μΈμ‹ν•˜κ³  μ •μƒμ μœΌλ‘œ λ™μž‘ν•œλ‹€.

 

πŸ“Œ Playwright μ„€μ • (JavaScript / TypeScript κΈ°μ€€)

import { defineConfig } from '@playwright/test';

export default defineConfig({
  use: {
    browserName: 'chromium',
    launchOptions: {
      args: [
        '--use-fake-device-for-media-stream',
        '--use-fake-ui-for-media-stream',
        '--use-file-for-fake-audio-capture={wav 파일 경둜}'
      ],
    },
  },
});

 

πŸ“Œ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œλŠ” μ΄λ ‡κ²Œ λ™μž‘ν•œλ‹€

이 μƒνƒœμ—μ„œ ν…ŒμŠ€νŠΈ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ 마이크 λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄,

await page.getByRole('button', { name: '마이크' }).click();

μ‹€μ œ λ§ˆμ΄ν¬κ°€ μΌœμ§€λŠ” λŒ€μ‹ , 미리 μ€€λΉ„ν•΄ λ‘” wav 파일이 마이크 μž…λ ₯으둜 λ“€μ–΄κ°„λ‹€.

 

덕뢄에 λ‚΄κ°€ κ²ͺκ³  있던 λ¬Έμ œμ˜€λ˜, 아무 μ†Œλ¦¬κ°€ μ—†μœΌλ©΄ λ‹€μŒ λ‹¨κ³„λ‘œ λͺ» λ„˜μ–΄κ°€μ§€ λͺ»ν•˜λŠ” λ¬Έμ œκ°€ κΉ”λ”ν•˜κ²Œ 해결됐닀.
μ‚¬λžŒμ΄ 직접 λ§ν•˜μ§€ μ•Šμ•„λ„, μ‹œμŠ€ν…œμ€ μŒμ„±μ΄ μž…λ ₯λ˜μ—ˆλ‹€κ³  μΈμ‹ν•˜κ³  λ‹€μŒ λ‹¨κ³„λ‘œ λ„˜μ–΄κ°„λ‹€.

 

πŸ“Œ λ§ˆλ¬΄λ¦¬ν•˜λ©°

마이크 μž…λ ₯이 ν•„μš”ν•œ 화면은 μžλ™ν™”ν•˜κΈ° μ–΄λ ΅λ‹€κ³  λ§‰μ—°νžˆ μƒκ°ν–ˆλŠ”λ°, 막상 ꡬ쑰λ₯Ό μ΄ν•΄ν•˜κ³  λ‚˜λ‹ˆ λΈŒλΌμš°μ €κ°€ μž…λ ₯을 μ–΄λ–»κ²Œ μΈμ‹ν•˜λŠ”μ§€κ°€ ν•΅μ‹¬μ΄μ—ˆλ‹€.

λ‹€λ§Œ 이 λ°©μ‹μ˜ λͺ©μ μ„ λΆ„λͺ…νžˆ ν•΄λ‘˜ ν•„μš”κ°€ μžˆλ‹€. 이 μžλ™ν™”λŠ” 마이크 μž…λ ₯ κΈ°λŠ₯ 자체의 정확도λ₯Ό κ²€μ¦ν•˜κΈ° μœ„ν•œ μš©λ„λŠ” μ•„λ‹ˆλ‹€.

항상 λ™μΌν•œ wav 파일이 μž…λ ₯되기 λ•Œλ¬Έμ—, μŒμ„± μΈμ‹μ˜ ν’ˆμ§ˆμ΄λ‚˜ STT 결과의 정확성을 ν…ŒμŠ€νŠΈν•˜λŠ” λ°μ—λŠ” μ ν•©ν•˜μ§€ μ•Šλ‹€.

 

λ‚΄κ°€ 이 방식을 μ‚¬μš©ν•œ μ΄μœ λŠ” "μŒμ„± μž…λ ₯이 μžˆμ–΄μ•Όλ§Œ λ‹€μŒ λ‹¨κ³„λ‘œ λ„˜μ–΄κ°ˆ 수 μžˆλŠ” 화면을 μžλ™ν™”ν•˜κΈ° μœ„ν•΄μ„œ" 단 ν•˜λ‚˜μ˜€λ‹€.

즉, 마이크 κΈ°λŠ₯을 ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•œ μžλ™ν™”κ°€ μ•„λ‹ˆλΌ 마이크 μž…λ ₯μ΄λΌλŠ” 쑰건을 μ•ˆμ •μ μœΌλ‘œ ν†΅κ³Όν•˜κΈ° μœ„ν•œ μˆ˜λ‹¨μ΄μ—ˆλ‹€.

 

μ΄λ ‡κ²Œ μ ‘κ·Όν•˜λ‹ˆ μ‚¬λžŒμ΄ 직접 λ§ν•˜μ§€ μ•Šμ•„λ„ 되고, νšŒκ·€ ν…ŒμŠ€νŠΈλ‚˜ 반볡 ν…ŒμŠ€νŠΈμ—μ„œλ„ λ§‰νžˆμ§€ μ•ŠλŠ” μžλ™ν™” 흐름을 λ§Œλ“€ 수 μžˆμ—ˆλ‹€.

μžλ™ν™”μ—μ„œ μ€‘μš”ν•œ 건 λͺ¨λ“  κΈ°λŠ₯을 μ™„λ²½ν•˜κ²Œ κ²€μ¦ν•˜λŠ” 것보닀, μ–΄λ””κΉŒμ§€λ₯Ό μžλ™ν™”λ‘œ 컀버할지 λͺ…ν™•νžˆ μ •ν•˜λŠ” κ²ƒμ΄λΌλŠ” 생각도 ν•¨κ»˜ λ“€μ—ˆλ‹€.

 

728x90
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ λ³€κ²½κΈˆμ§€ (μƒˆμ°½μ—΄λ¦Ό)

'πŸ“‚ Quality Assurance > πŸ“„ Experience & Insight' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

🧭 λ‹€μ–‘ν•œ μΈ‘λ©΄μ—μ„œ μ„±μž₯ν•  수 μžˆμ—ˆλ˜ 릴리즈 회고  (2) 2026.01.31
🧭 λ‹€μ‚¬λ‹€λ‚œν–ˆλ˜ 릴리즈 회고  (2) 2026.01.03
πŸ’‘ about:blank, 버그가 μ•„λ‹ˆμ—ˆλ‹€  (0) 2025.12.13
🧭 감이 μ‘°κΈˆμ”© 작히기 μ‹œμž‘ν•œ 릴리즈 회고  (6) 2025.11.01
🧭 μ‹ μž… 1인 QA μ—”μ§€λ‹ˆμ–΄μ˜ 인생 첫 릴리즈 회고  (8) 2025.10.12
'πŸ“‚ Quality Assurance/πŸ“„ Experience & Insight' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • 🧭 λ‹€μ–‘ν•œ μΈ‘λ©΄μ—μ„œ μ„±μž₯ν•  수 μžˆμ—ˆλ˜ 릴리즈 회고
  • 🧭 λ‹€μ‚¬λ‹€λ‚œν–ˆλ˜ 릴리즈 회고
  • πŸ’‘ about:blank, 버그가 μ•„λ‹ˆμ—ˆλ‹€
  • 🧭 감이 μ‘°κΈˆμ”© 작히기 μ‹œμž‘ν•œ 릴리즈 회고
YeonSu02
YeonSu02
Email : rkddustn2519@naver.com
  • YeonSu02
    IsLiife2
    YeonSu02
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기
      • πŸ“‚ Computer Science
      • πŸ“‚ Unity Engine
        • πŸ“„ Unity Lecture
        • πŸ“„ Unity References
        • πŸ’» Game Development
      • πŸ“‚ Quality Assurance
        • πŸ”₯ μ—˜λ¦¬μŠ€ SW QAνŠΈλž™
        • πŸ“„ Experience & Insight
        • πŸ“„ QA References
      • πŸ“‚ Program Language
        • πŸ“„ C#
        • πŸ“„ Python
        • πŸ“„ JavaScript
        • πŸ“„ TypeScript
      • πŸ“‚ Additional
        • πŸ“„ Docker
        • πŸ“„ Jenkins
        • πŸ“„ Playwright
      • πŸ“‚ Book Review
      • πŸ“‚ License
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
  • 링크

    • GitHub
  • 인기 κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
YeonSu02
πŸ’‘ Playwrightμ—μ„œ 마이크 κΈ°λŠ₯ μžλ™ν™”ν•˜κΈ°
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”