ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ์ ๊ธ ์ฝ์ด์ฃผ๋ ์์ฑ ํฉ์ฑ ๊ธฐ๋ฅ ์ถ๊ฐํ๊ธฐ
์น์ฌ์ดํธ์์ ํ ์คํธ๋ฅผ ์์ฑ์ผ๋ก ์ฝ์ด์ฃผ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ํนํ, ์๊ฐ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์์๊ฒ ๋งค์ฐ ์ ์ฉํ๋ฉฐ, ๋ฉํฐํ์คํน์ ์ํ๋ ์ฌ์ฉ์์๊ฒ๋ ํธ๋ฆฌํฉ๋๋ค. HTML5์ SpeechSynthesis API๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ์์ฑ ํฉ์ฑ ๊ธฐ๋ฅ์ ์น์ฌ์ดํธ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ด๋ฒ ๊ธ์์๋ ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ์ ๊ธ ์ฝ์ด์ฃผ๋ ์์ฑ ํฉ์ฑ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํฉ๋๋ค.
์น์ฌ์ดํธ ํ
์คํธ ์์ฑ ํฉ์ฑ ๊ธฐ๋ฅ ๊ตฌํ
ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ ์ ์ฉ ๊ฐ์ด๋
์น์ฌ์ดํธ์์ ํ ์คํธ๋ฅผ ์์ฑ์ผ๋ก ์ฝ์ด์ฃผ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ํนํ, ์๊ฐ์ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์์๊ฒ ๋งค์ฐ ์ ์ฉํ๋ฉฐ, ๋ฉํฐํ์คํน์ ์ํ๋ ์ฌ์ฉ์์๊ฒ๋ ํธ๋ฆฌํฉ๋๋ค. HTML5์ SpeechSynthesis API๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ์์ฑ ํฉ์ฑ ๊ธฐ๋ฅ์ ์น์ฌ์ดํธ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ ์์ฑ ํฉ์ฑ ๊ธฐ๋ฅ ๊ตฌํ์ผ๋ก ์ ๊ทผ์ฑ ํฅ์์ํค๋ ๋ฒ
"์คํผ์ปค ๋ฒํผ์ ํด๋ฆญํ์ฌ ์์ฑ์ ์ฝ๊ธฐ ์์ํ๊ณ , ๋ค์ ํด๋ฆญํ๋ฉด ์์ฑ์ ๋ฉ์ถ๋" ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ ค๊ณ ํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด ์ฌ์ฉ์๋ ํ ์คํธ๊ฐ ์ฝํ๋ ๋์ ์์ฑ์ ์ ์ดํ ์ ์์ด ๋์ฑ ์ง๊ด์ ์ด๊ณ ์ ์ฉํ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
SpeechSynthesis API๋?
SpeechSynthesis API๋ ์น ๋ธ๋ผ์ฐ์ ์์ ํ ์คํธ๋ฅผ ์์ฑ์ผ๋ก ๋ณํํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์๋ ํ ์คํธ ๊ธฐ๋ฐ์ ์ฝํ ์ธ ๋ฅผ ๋ฃ๋ ๊ฒ๋ง์ผ๋ก๋ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ผ๋ฉฐ, ์ด๋ ํนํ ์ ๊ทผ์ฑ ์ธก๋ฉด์์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
์ฃผ์ ํน์ง:
- ๋ค์ํ ์ธ์ด์ ์์ฑ์ ์ง์ํฉ๋๋ค.
- ์ฌ์ฉ์ ์ค์ ์ ๋ง๊ฒ ์์ฑ ์๋, ํผ์น, ๋ณผ๋ฅจ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
- ์์ฑ ํฉ์ฑ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ ์ดํ ์ ์๋ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ธ ์ฝ์ด์ฃผ๋ ๊ธฐ๋ฅ์ ์ฅ์
์ ๊ทผ์ฑ ํฅ์ (SEO ๊ด์ ์์)
์น์ฌ์ดํธ์์ ํ ์คํธ๋ฅผ ์์ฑ์ผ๋ก ์ฝ์ด์ฃผ๋ ๊ธฐ๋ฅ์ ์๊ฐ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์์๊ฒ ์ค์ํ ์ ๊ทผ์ฑ ํฅ์์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ํตํด ์๊ฐ์ฅ์ ์ธ๋ ์ฝํ ์ธ ๋ฅผ ํธ๋ฆฌํ๊ฒ ์๋นํ ์ ์์ผ๋ฉฐ, ๊ฒ์ ์์ง์์๋ ์ด๋ฌํ ์ ๊ทผ์ฑ์ ๊ณ ๋ คํ์ฌ ์น์ฌ์ดํธ ์์๊ฐ ์์นํ ์ ์์ต๋๋ค. ์ ๊ทผ์ฑ์ด ํฅ์๋ ์น์ฌ์ดํธ๋ ๊ฒ์์์ง ์ต์ ํ(SEO)์๋ ๊ธ์ ์ ์ธ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์ด์์์ ํธ๋ฆฌํ ์ฝํ ์ธ ์ ๊ฒ
์น์ฌ์ดํธ ์ด์์๋ ์์ฑ ํฉ์ฑ ๊ธฐ๋ฅ์ ํตํด ์์ ์ด ์์ฑํ ์ฝํ ์ธ ๋ฅผ ์์ฑ์ผ๋ก ์ ๊ฒํ ์ ์์ต๋๋ค. ์ฝํ ์ธ ์ ํ๋ฆ์ด๋ ์ดํฌ, ๋ง์ถค๋ฒ ๋ฑ์ ์ฝ๊ฒ ํ์ธํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ํ ์คํธ์ ๊ฐ๋ ์ฑ์ ๋์ด๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
์ฌ์ฉ์ ํธ์์ฑ ๋ฐ ์ฒด๋ฅ ์๊ฐ ํฅ์
์ฌ์ฉ์๋ ์์ฑ ํฉ์ฑ ๊ธฐ๋ฅ์ ํตํด ๋ค๋ฅธ ์์ ์ ํ๋ฉด์๋ ์ฝํ ์ธ ๋ฅผ ์ฝ๊ฒ ๋ค์ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ๊ธ์ ๋๊ฐ ์ฝ๋ ๊ฒ๋ณด๋ค ๋์ฑ ํจ์จ์ ์ผ๋ก ์ ๋ณด์ ์ ๊ทผํ ์ ์์ผ๋ฉฐ, ์น์ฌ์ดํธ์ ๋ํ ์ฒด๋ฅ ์๊ฐ์ด ๋์ด๋ ์ ์์ต๋๋ค. ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ ํฅ์๋ฟ๋ง ์๋๋ผ SEO์๋ ๊ธ์ ์ ์ธ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
๊ฒ์ ์ต์ ํ(SEO) ๊ณ ๋ ค ์ฌํญ
- ํค์๋ ์ฌ์ฉ: ๊ธ ์ ๋ชฉ๊ณผ ๋ณธ๋ฌธ์ โ์์ฑ ํฉ์ฑโ, โ์น ์์ฑ ํฉ์ฑโ, โ์คํผ์ปค ๋ฒํผโ, โSpeechSynthesis APIโ ๋ฑ ๊ด๋ จ ํค์๋๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ๋ฐฐ์นํฉ๋๋ค.
- ๋ฉํ ํ๊ทธ ์ต์ ํ: ์น ํ์ด์ง์ ๋ฉํ ํ๊ทธ์ ๊ด๋ จ ํค์๋๋ฅผ ๋ฃ์ด ๊ฒ์ ์์ง์์ ์ ์ธ์๋ ์ ์๋๋ก ํฉ๋๋ค.
- ํค๋ ํ๊ทธ ์ฌ์ฉ: ์ค์ํ ์ ๋ชฉ์๋ ํ๊ทธ๋ฅผ ์ฌ์ฉํด ๊ตฌ์กฐ์ ์ผ๋ก ๊ธ์ ์์ฑํฉ๋๋ค.
- ๋ด๋ถ ๋งํฌ ํ์ฉ: ๊ด๋ จ๋ ๋ค๋ฅธ ๋ธ๋ก๊ทธ ๊ธ์ด๋ ํ์ด์ง๋ก์ ๋ด๋ถ ๋งํฌ๋ฅผ ์ถ๊ฐํ์ฌ ์ฌ์ดํธ์ ๋ค๋ฅธ ํ์ด์ง๋ก ์ ์ ์ ์ ๋ํฉ๋๋ค.
๋ฐ๋ผ์ ์ด ๊ธฐ๋ฅ์ SEO, ์ ๊ทผ์ฑ ํฅ์, ์ฌ์ฉ์ ํธ์์ฑ ๋ชจ๋์์ ์ค์ํ ์ฅ์ ์ ์ ๊ณตํฉ๋๋ค.

ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ์ ๊ธ ์ฝ์ด์ฃผ๋ ์์ฑ ํฉ์ฑ ๊ธฐ๋ฅ ์ถ๊ฐํ๊ธฐ
ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค. ์ด์ ์ค์ ๋ก ํ ์คํธ๋ฅผ ์ฝ์ด์ฃผ๋ ์์ฑ ํฉ์ฑ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค. ๋จผ์ ๊ธฐ๋ณธ์ ์ธ ์์ฑ ํฉ์ฑ ๊ธฐ๋ฅ์ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
let isSpeaking = false;
function speakText() {
const textElements = document.querySelectorAll('.tt_article_useless_p_margin');
const utterance = new SpeechSynthesisUtterance();
utterance.lang = 'ko-KR';
let isEndReached = false;
// ํ
์คํธ๋ฅผ ํ๋๋ก ํฉ์ณ์ ์ฝ์
let textToRead = '';
textElements.forEach(element => {
textToRead += element.innerText.trim() + ' ';
});
// ์์ฑ์ ํ ๋ฒ๋ง ์ฝ๋๋ก ์ค์
function speakNextText() {
if (isSpeaking) {
utterance.text = textToRead;
speechSynthesis.speak(utterance);
utterance.onend = function() {
isSpeaking = false;
};
}
}
if (!isSpeaking) {
isSpeaking = true;
speakNextText(); // ํ
์คํธ ์ฝ๊ธฐ ์์
}
}
// ์๋ก ๊ณ ์นจ ์ ์์ฑ์ ๋ฉ์ถ๋๋ก ์ค์
window.onbeforeunload = function() {
if (isSpeaking) {
speechSynthesis.cancel();
isSpeaking = false;
}
};
// ๋ฒํผ ํด๋ฆญ ์ ์์ฑ ์ฝ๊ธฐ/์ค์ง
document.getElementById("speakerButton").addEventListener("click", function() {
if (isSpeaking) {
speechSynthesis.cancel(); // ์์ฑ์ ๋ฉ์ถค
isSpeaking = false;
} else {
speakText(); // ์์ฑ ์์
}
});
์ฝ๋ ์ค๋ช
SpeechSynthesisUtterance: ์์ฑ์ ํฉ์ฑํ ํ ์คํธ์ ์์ฑ(์ธ์ด ๋ฑ)์ ์ค์ ํฉ๋๋ค.
- utterance.lang = 'ko-KR': ์์ฑ์ ํ๊ตญ์ด๋ก ์ค์ ํฉ๋๋ค. ์ด ๋ถ๋ถ์ ์ํ๋ ์ธ์ด๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- utterance.text = textToRead: ํ ์คํธ๋ฅผ ์์ฑ์ผ๋ก ๋ณํํ ํ ์คํธ๋ก ์ค์ ํฉ๋๋ค.
speechSynthesis.speak(): ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ค์ ๋ก ์์ฑ์ ํฉ์ฑํ๊ณ ์์ํฉ๋๋ค.
- speechSynthesis.cancel(): ์์ฑ์ ์ฆ์ ๋ฉ์ถ๋ ๋ฉ์๋์ ๋๋ค. ์์ฑ ์ฝ๊ธฐ๊ฐ ์งํ ์ค์ผ ๋ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์์ฑ์ด ์ค์ง๋ฉ๋๋ค.
- isSpeaking: ์์ฑ ํฉ์ฑ ๊ธฐ๋ฅ์ด ์คํ ์ค์ธ์ง๋ฅผ ์ถ์ ํ๋ ๋ณ์์ ๋๋ค. ๋ฒํผ ํด๋ฆญ ์ ์ด ๋ณ์์ ๊ฐ์ ๋ฐ๋ผ ์์ฑ์ ์์ํ๊ฑฐ๋ ์ค์งํฉ๋๋ค.
๋ฒํผ ์ถ๊ฐ ๋ฐ ์์ฑ ์ฝ๊ธฐ ์์/์ค์ง ๊ธฐ๋ฅ ๊ตฌํ
์ฌ์ฉ์๊ฐ ํ ์คํธ ์์ฑ์ ์ฝ๊ณ ์ค์งํ ์ ์๋๋ก, ์คํผ์ปค ๋ฒํผ์ ์ถ๊ฐํฉ๋๋ค. ์ด ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์์ฑ์ด ์์๋๊ณ , ๋ค์ ํด๋ฆญํ๋ฉด ์์ฑ์ ๋ฉ์ถ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ต๋๋ค.
<div class="speaker-container">
<!-- ์คํผ์ปค ๋ฒํผ -->
<button id=speakerButton class="speaker-button">๐</button>
<!-- ์๋ด ํ
์คํธ -->
<span class="speaker-text">ํธ๋ฆฌํ๊ฒ ๊ธ์ ์ฝ์ด ๋๋ฆฝ๋๋ค.</span>
</div>
<p class="end">
์ค๋ช :
- <div class="speaker-container">: ์คํผ์ปค ๋ฒํผ๊ณผ ์๋ด ํ ์คํธ๋ฅผ ํฌํจํ๋ ์ปจํ ์ด๋์ ๋๋ค.
- <button id="speakerButton" class="speaker-button">๐</button>: ์์ฑ ํฉ์ฑ ๊ธฐ๋ฅ์ ์์/์ค์งํ๋ ์คํผ์ปค ์์ด์ฝ ๋ฒํผ์ ๋๋ค.
- <span class="speaker-text">ํธ๋ฆฌํ๊ฒ ๊ธ์ ์ฝ์ด ๋๋ฆฝ๋๋ค.</span>: ๋ฒํผ ์์ ์๋ด ํ ์คํธ๊ฐ ์์นํฉ๋๋ค.
- <p class="end">: ํ์ด์ง์ ๋ง์ง๋ง ๋ฌธ๋จ์ ๋ํ๋ด๋ฉฐ, ์์ฑ ํฉ์ฑ๊ณผ๋ ๊ด๊ณ๊ฐ ์์ต๋๋ค.
์คํ์ผ ์ ์ฉํ๊ธฐ
<style>
.speaker-button {
font-size: 40px; /* ์คํผ์ปค ์์ด์ฝ ํฌ๊ธฐ */
padding: 10px 15px; /* ๋ฒํผ์ ๋ด๋ถ ์ฌ๋ฐฑ */
border: none; /* ๋ฒํผ์ ํ
๋๋ฆฌ ์ ๊ฑฐ */
background-color: transparent; /* ๋ฒํผ ๋ฐฐ๊ฒฝ ํฌ๋ช
*/
cursor: pointer; /* ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด ํด๋ฆญ ๊ฐ๋ฅํ ๋๋ */
}
.speaker-button:hover {
color: white; /* ํธ๋ฒ ์ ์์ด์ฝ ์์ ๋ณ๊ฒฝ */
background-color: #007BFF; /* ํธ๋ฒ ์ ๋ฐฐ๊ฒฝ ์์ ๋ณ๊ฒฝ */
}
</style>
ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ์ ์ ์ฉํ๊ธฐ
ํฐ์คํ ๋ฆฌ ๊ด๋ฆฌ์ ํ์ด์ง๋ก ์ด๋:
- ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ์ ๋ก๊ทธ์ธ ํ ๊ด๋ฆฌ์ ํ์ด์ง๋ก ๋ค์ด๊ฐ๋๋ค.
HTML/JS ์ฝ๋ ์ถ๊ฐ:
- [๊ด๋ฆฌ > HTML ํธ์ง] ๋ฉ๋ด๋ก ์ด๋ํฉ๋๋ค.
- </body> ํ๊ทธ ์์ ์์ ์คํฌ๋ฆฝํธ ์ฝ๋์ ๋ฒํผ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๋ณธ๋ฌธ์ ์ ์ฉ:
- ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ์ ๊ธ์ ์์ฑํ ๋, ํ ์คํธ์ ์์ฑ ํฉ์ฑ ๊ธฐ๋ฅ์ ์ ์ฉํ๊ณ ์ถ์ ๋ถ๋ถ์ ์์ฑํฉ๋๋ค.
- ๊ธ์ .tt_article_useless_p_margin ํด๋์ค๋ฅผ ๊ฐ์ง ์์๊ฐ ํ ์คํธ๋ก ํฌํจ๋๋ฉด, ํด๋น ํ ์คํธ๊ฐ ์์ฑ์ผ๋ก ์ฝํ๋๋ค.
๊ธ์ ์์ฑ ๋ฒํผ ์ฝ์ :
- ๊ธ์ <button id="speakerButton">๐ ์์ฑ ์ฝ๊ธฐ ์์/์ค์ง</button> ๋ฒํผ์ ์ถ๊ฐํ์ฌ, ์ฌ์ฉ์๋ค์ด ์ฝ๊ฒ ์์ฑ์ ์ ์ดํ ์ ์๋๋ก ํฉ๋๋ค.
ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ์ ๋ค์ํ ๋ณํ๋ก ์ ๊ทผ์ฑ์ ํฅ์ํด ๋ณด์ธ์
ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ์์ ์คํผ์ปค ๋ฒํผ์ ์ด์ฉํ์ฌ ํ ์คํธ๋ฅผ ์์ฑ์ผ๋ก ์ฝ๊ณ , ์์ฑ์ ์ ์ดํ ์ ์๋ ๊ธฐ๋ฅ์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ํตํด ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์์ผ๋ฉฐ, ์ ๊ทผ์ฑ์ ๊ณ ๋ คํ ์น์ฌ์ดํธ ๊ฐ๋ฐ์ ํ ๋ฐ ๋ ๋์๊ฐ ์ ์์ต๋๋ค. ๋ํ, SpeechSynthesis API๋ฅผ ํ์ฉํ๋ฉด ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์์ฑ ํฉ์ฑ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ผ๋ฏ๋ก, ๋ค์ํ ์น ํ๋ก์ ํธ์์ ํ์ฉํด ๋ณด์ธ์.
์์ฑ ์ฝ๊ธฐ ์์๊ณผ ์ค์ง๋ฅผ ์ํ ๋ฒํผ์ ํด๋ฆญํ๋ ๋์์ speechSynthesis.cancel()๊ณผ ๊ฐ์ API ๋ฉ์๋๋ฅผ ํตํด ๊ฐ๋จํ ๊ตฌํํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ ๋ง์ ์ฌ๋๋ค์ด ์น ์ฝํ ์ธ ๋ฅผ ์์ฑ์ผ๋ก ์์ฝ๊ฒ ๋ค์ ์ ์๊ฒ ๋ฉ๋๋ค.