Если вы создаете несколько кнопок, не все они должны иметь одинаковый идентификатор.
Вместо этого вы должны использовать классы.
@foreach($data as $val)
<h2><a class="word" href="/?keyword={{$val->word}}">{{$val->word}}</a></h2>
<input class="text" type="hidden" value="{{$val->word}}">
<button class="speak-btn">play</button>
@endforeach
И вы захотите запросить кнопки с селектором .speak-btn
вместо них, затем l oop поверх них.
Метод, который я использую здесь, немного неуклюжий, но пытается следовать за вашими c logi, чтобы облегчить понимание .
<script>
const speakBtns = document.querySelector('.speak-btn')
speakBtns.forEach(function(speakBtn, index) {
speakBtn.addEventListener('click', (function(index) {
return function() {
const text = document.querySelector('.text')[index]
const uttr = new SpeechSynthesisUtterance(text.value)
speechSynthesis.speak(uttr)
}
})(index))
}
</script>