commit 4c411ddf56d3a64af65ce2810cefc5b8f4cf2e3d equwal <truex@equwal.com> 2026-09-20 16:54:16 -0700 Alignment engine: a Kotlin port of subplz's aligner, verified against it core/ is plain Kotlin with no Android in it, so it tests on any machine with a JDK. The port follows ats.align and subplz.align.shift_align statement for statement. tools/make_golden.py runs the original on real Whisper-tiny transcripts and records every intermediate stage; the tests feed each ported function the reference's own input and require its exact output. End to end, all 1,277 cues across the four fixtures come out identical. AnchoredAligner is new: global alignment for inputs far too big for a full DP table, by anchoring on stretches unique to both sequences and solving exactly only between anchors. It reaches the exact optimum on the fixtures, and aligns a 19-hour audiobook against its whole text in seconds and a few megabytes, where the reference needs gigabytes and a chapter at a time. That removes the need to match audio chapters to text chapters at all; BookAligner uses the alignment itself to leave out text nobody narrated.
.gitattributes | 5 + .gitignore | 16 + build.gradle.kts | 6 + core/build.gradle.kts | 33 + .../src/main/kotlin/space/subread/core/AlignSub.kt | 217 + core/src/main/kotlin/space/subread/core/Aligner.kt | 52 + .../kotlin/space/subread/core/AnchoredAligner.kt | 242 + .../main/kotlin/space/subread/core/BookAligner.kt | 98 + .../src/main/kotlin/space/subread/core/BookText.kt | 129 + core/src/main/kotlin/space/subread/core/Gotoh.kt | 172 + .../src/main/kotlin/space/subread/core/Language.kt | 66 + core/src/main/kotlin/space/subread/core/Model.kt | 23 + core/src/main/kotlin/space/subread/core/Srt.kt | 30 + core/src/main/kotlin/space/subread/core/Subs.kt | 169 + .../src/test/kotlin/space/subread/core/BookTest.kt | 160 + .../test/kotlin/space/subread/core/DebugDiff.kt | 63 + .../test/kotlin/space/subread/core/FullBookTest.kt | 58 + .../test/kotlin/space/subread/core/GoldenTest.kt | 196 + core/src/test/resources/aozora/789_ruby_5639.zip | Bin 0 -> 344964 bytes core/src/test/resources/golden/neko_000_003.json | 8655 ++++++++ core/src/test/resources/golden/neko_003_006.json | 11203 ++++++++++ core/src/test/resources/golden/neko_060_063.json | 10111 +++++++++ core/src/test/resources/golden/neko_137_140.json | 21302 +++++++++++++++++++ gradle.properties | 5 + gradle/libs.versions.toml | 33 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 45457 bytes gradle/wrapper/gradle-wrapper.properties | 9 + gradlew | 251 + gradlew.bat | 94 + settings.gradle.kts | 32 + tools/__pycache__/make_golden.cpython-311.pyc | Bin 0 -> 18286 bytes tools/make_fullbook.py | 30 + tools/make_golden.py | 218 + 33 files changed, 53678 insertions(+)
diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..0538e87 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +*.sh text eol=lf +gradlew text eol=lf +*.bat text eol=crlf +*.jar binary +*.zip binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ee37da8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +.gradle/ +build/ +local.properties +*.iml +.idea/ +.kotlin/ +captures/ +.externalNativeBuild/ +.cxx/ + +# Fixtures made from text that is not public domain stay on the machine +# that generated them. Tests skip this directory when it is missing. +core/src/test/resources/golden-local/ + +# Downloaded at build time, never committed. +app/src/main/assets/models/ diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..fd6dc59 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,6 @@ +// Plugin versions live in gradle/libs.versions.toml; each module applies its own. +plugins { + alias(libs.plugins.kotlin.jvm) apply false + alias(libs.plugins.kotlin.compose) apply false + alias(libs.plugins.android.application) apply false +} diff --git a/core/build.gradle.kts b/core/build.gradle.kts new file mode 100644 index 0000000..590f783 --- /dev/null +++ b/core/build.gradle.kts @@ -0,0 +1,33 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + alias(libs.plugins.kotlin.jvm) +} + +// Plain JVM on purpose: no Android types in here, so the whole alignment +// engine can be tested on a laptop against the reference implementation. +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} +kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } +} + +dependencies { + implementation(libs.jsoup) + testImplementation(libs.junit) + testImplementation(libs.kotlinx.serialization.json) +} + +tasks.test { + useJUnit() + maxHeapSize = "2g" + // -Pgolden=<case> prints where that fixture first departs from the reference. + providers.gradleProperty("golden").orNull?.let { systemProperty("golden.case", it) } + testLogging { + events("failed") + showStandardStreams = true + exceptionFormat = org.gradle.api.tasks.testing.logging.TestExceptionFormat.FULL + } +} diff --git a/core/src/main/kotlin/space/subread/core/AlignSub.kt b/core/src/main/kotlin/space/subread/core/AlignSub.kt new file mode 100644 index 0000000..f8191cc --- /dev/null +++ b/core/src/main/kotlin/space/subread/core/AlignSub.kt @@ -0,0 +1,217 @@ +package space.subread.core + +/** + * Turning an alignment path into "which piece of which paragraph does each + * transcript segment cover". + * + * Ported from ats/align.py, statement for statement. It is dense and a little + * odd in places; the oddities are kept, because the fixtures in + * src/test/resources/golden are this code's real output and the port is only + * trustworthy while it reproduces them exactly. Improvements belong in a + * separate, separately tested step - not folded in here. + */ +object AlignSub { + + /** + * @param text cleaned paragraphs, as code points + * @param subs cleaned transcript segments, as code points + * @return for each paragraph, the spans of it claimed by transcript segments + */ + fun alignSub( + coordinates: Coordinates, + text: List<IntArray>, + subs: List<IntArray>, + thing: Int = 2, + ): List<MutableList<Span>> { + var line = 0 // current[0] + var sub = 0 // current[1] + val pos = intArrayOf(0, 0) + var toff = 0 + val p = intArrayOf(0, 0) + val gaps = intArrayOf(0, 0) + val segments = mutableListOf<MutableList<Span>>(mutableListOf()) + var off = 0 + + for (i in 0 until coordinates.size) { + val c0 = coordinates.target[i] + val c1 = coordinates.query[i] + // A column where either side stood still is a gap in the other. + val isGap = (c0 - p[0] == 0) || (c1 - p[1] == 0) + + while (sub < subs.size && pos[1] + subs[sub].size <= c1) { + if (line >= text.size) return segments.take(text.size) + val subLen = subs[sub].size + pos[1] += subLen + if (isGap) { + // np.clip(pos - p, 0, None)[::-1] + gaps[0] += maxOf(pos[1] - p[1], 0) + gaps[1] += maxOf(pos[0] - p[0], 0) + } + + val diff = subLen + gaps[1] - gaps[0] + if (diff > subLen / 4) { + var target = toff + diff + off + off = 0 + while (line < text.size && target >= text[line].size) { + val start = toff + val end = text[line].size + if (end - start != 0) { + val prev = segments.last() + if (end - start < thing || distinctExceptFullStop(text[line], start, end) < thing) { + // Too small to stand alone: glue it on. + if (prev.isNotEmpty()) prev.last().end = end + else prev.add(Span(start, end, sub)) + } else { + prev.add(Span(start, end, sub)) + } + } + segments.add(mutableListOf()) + pos[0] += end - start + target -= text[line].size + line++ + toff = 0 + } + pos[0] += target - toff + segments.last().add(Span(toff, target, sub)) + toff = target + } else { + // The recogniser heard something the book does not have. + val prev = segments.last() + if (toff >= text[line].size / 2 && prev.isNotEmpty()) { + prev.last().end += diff + toff += diff + } else { + off += diff + } + } + + sub++ + gaps[0] = 0 + gaps[1] = 0 + p[0] = maxOf(pos[0], p[0]) + p[1] = maxOf(pos[1], p[1]) + } + + if (isGap) { + // gaps += (c - p)[::-1] + gaps[0] += c1 - p[1] + gaps[1] += c0 - p[0] + } + p[0] = c0 + p[1] = c1 + } + return segments.take(text.size) + } + + private fun distinctExceptFullStop(cps: IntArray, start: Int, end: Int): Int { + val seen = HashSet<Int>() + for (k in start until minOf(end, cps.size)) if (cps[k] != '。'.code) seen.add(cps[k]) + return seen.size + } + + /** + * Spans were computed on cleaned text. Map them back onto the original. + * + * The cleaned string is the translated one with characters removed, so it + * is a subsequence of it, and a two-finger walk recovers each offset. + */ + fun fix(lang: Language, original: List<String>, edited: List<IntArray>, segments: List<MutableList<Span>>) { + for ((l, spans) in segments.withIndex()) { + val o = lang.translate(original[l]).toCodePoints() + val e = edited[l] + val m = IntArray(e.size + 1) { -1 } + var ei = 0 + for (oi in o.indices) { + if (ei < e.size && o[oi] == e[ei]) { + m[ei] = oi + ei++ + } + } + m[ei] = o.size // snap to end + m[0] = 0 // snap to zero + var last = 0 + for (i in 0 until e.size) { + if (m[i] != -1) last = i else m[i] = m[last] + } + if (m[e.size] == -1) m[e.size] = o.size + + for (f in spans) { + f.start = m[f.start.coerceIn(0, e.size)] + f.end = m[f.end.coerceIn(0, e.size)] + } + } + } + + /** + * Nudge span ends so punctuation stays with the words it belongs to: a + * closing quote goes with what it closes, an opening one with what follows, + * and a small kana or ellipsis is never stranded at the head of a cue. + */ + fun fixPunc( + text: List<String>, + segments: List<MutableList<Span>>, + prepend: Set<Int>, + append: Set<Int>, + nopend: Set<Int>, + ) { + for ((l, s) in segments.withIndex()) { + if (s.isEmpty()) continue + val t = text[l].toCodePoints() + for (k in s.indices) { + val p = s[k] + // The last span is paired with itself, as in the original's + // zip(s, s[1:] + [s[-1]]). + val f = if (k + 1 < s.size) s[k + 1] else s[k] + val connected = f.start == p.end + var loop = 0 + while (loop <= 20) { + if (p.end < t.size && at(t, p.end) in append) { + p.end += 1 + } else if (at(t, p.end - 1) in prepend) { + p.end -= 1 + } else if ( + (p.end > 0 && at(t, p.end - 1) in nopend) || + (p.end < t.size && at(t, p.end) in nopend) || + (p.end < t.size - 1 && at(t, p.end + 1) in nopend) + ) { + var start = p.end - 1 + var end = p.end + if (p.end < t.size - 1) { + val here = at(t, p.end) + // Do not end a cue on a kanji whose okurigana follows. + if ((at(t, p.end + 1) in nopend && 0x4E00 > here) || here > 0x9FAF) end += 1 + } + while (start > 0 && at(t, start) in nopend) start -= 1 + while (end < t.size - 1 && at(t, end) in nopend) end += 1 + + if (at(t, start) in prepend) { + if (p.end == start) break + p.end = start + } else if (at(t, start) in append) { + if (p.end == start + 1) break + p.end = start + 1 + } else if (end < t.size && at(t, end) in prepend) { + if (p.end == end) break + p.end = end + } else if (end < t.size && at(t, end) in append) { + if (p.end == end + 1) break + p.end = end + 1 + } else { + break + } + } else { + break + } + loop++ + } + if (connected) f.start = p.end + } + } + } + + /** Python indexing: negatives count from the end. Out of range is "no character". */ + private fun at(t: IntArray, i: Int): Int { + val k = if (i < 0) i + t.size else i + return if (k in t.indices) t[k] else -1 + } +} diff --git a/core/src/main/kotlin/space/subread/core/Aligner.kt b/core/src/main/kotlin/space/subread/core/Aligner.kt new file mode 100644 index 0000000..7887763 --- /dev/null +++ b/core/src/main/kotlin/space/subread/core/Aligner.kt @@ -0,0 +1,52 @@ +package space.subread.core + +/** + * The whole job: a transcript with times and a book without them go in, + * subtitles worded by the book and timed by the transcript come out. + */ +object Aligner { + + /** + * Above this many traceback cells the exact aligner is not attempted and + * the anchored one takes over. 64M cells is 64 MB, comfortable on a phone. + */ + const val EXACT_CELL_LIMIT = 64_000_000L + + fun align( + transcript: List<TranscriptSegment>, + paragraphs: List<String>, + language: Language, + offset: Double = 0.0, + ): List<Cue> { + if (transcript.isEmpty()) return emptyList() + + val subsClean = transcript.map { language.clean(it.text).toCodePoints() } + val textClean = paragraphs.map { language.clean(it).toCodePoints() } + val query = concat(subsClean) + val target = concat(textClean) + + if (target.isEmpty() || query.isEmpty()) { + return transcript.map { Cue(Subs.UNMATCHED + it.text, it.start + offset, it.end + offset) } + } + + val coordinates = + if (Gotoh.cells(target.size, query.size) <= EXACT_CELL_LIMIT) Gotoh.align(target, query).coordinates + else AnchoredAligner.align(target, query).coordinates + + val spans = AlignSub.alignSub(coordinates, textClean, subsClean) + AlignSub.fix(language, paragraphs, textClean, spans) + AlignSub.fixPunc(paragraphs, spans, Subs.PREPEND_SET, Subs.APPEND_SET, Subs.NOPEND_SET) + + return Subs.shiftAlign(Subs.toSubs(paragraphs, transcript, spans, offset)) + } + + internal fun concat(parts: List<IntArray>): IntArray { + val out = IntArray(parts.sumOf { it.size }) + var at = 0 + for (p in parts) { + p.copyInto(out, at) + at += p.size + } + return out + } +} diff --git a/core/src/main/kotlin/space/subread/core/AnchoredAligner.kt b/core/src/main/kotlin/space/subread/core/AnchoredAligner.kt new file mode 100644 index 0000000..0b2150f --- /dev/null +++ b/core/src/main/kotlin/space/subread/core/AnchoredAligner.kt @@ -0,0 +1,242 @@ +package space.subread.core + +/** + * Global alignment for inputs far too big for a full dynamic-programming table. + * + * The reference implementation hands Biopython one chapter at a time and needs + * a couple of gigabytes to do it, which is why it depends on first guessing + * which chapter of the book each chapter of audio is. A phone has neither the + * memory nor, often, chaptered audio. So this aligns the whole transcript + * against the whole book instead, the way diff tools handle large files: + * + * 1. Find stretches that occur exactly once in both sequences. In two copies + * of the same book, those are overwhelmingly the same words in the same + * place - anchors. + * 2. Keep the longest chain of anchors that is in order in both. + * 3. Between neighbouring anchors, recurse with shorter stretches; when what + * is left is small, solve it exactly with [Gotoh]. + * + * Text the narrator skipped, or an introduction the book lacks, simply has no + * anchors in it and comes out as one long gap. No chapter matching needed. + */ +object AnchoredAligner { + + /** A stretch identical in both sequences. */ + private class Run(var t: Int, var q: Int, var len: Int) + + fun align( + target: IntArray, + query: IntArray, + exactCells: Long = 4_000_000L, + firstK: Int = 14, + lastK: Int = 5, + ): Alignment { + val path = Path() + Solver(target, query, exactCells, lastK, path).solve(0, target.size, 0, query.size, firstK) + val coordinates = path.build(target.size, query.size) + return Alignment(Gotoh.score(target, query, coordinates), coordinates) + } + + private class Solver( + val target: IntArray, + val query: IntArray, + val exactCells: Long, + val lastK: Int, + val path: Path, + ) { + fun solve(t0: Int, t1: Int, q0: Int, q1: Int, k: Int) { + val n = t1 - t0 + val m = q1 - q0 + if (n == 0 || m == 0) { + path.moveTo(t1, q1) + return + } + if (Gotoh.cells(n, m) <= exactCells) { + val sub = Gotoh.align(target.copyOfRange(t0, t1), query.copyOfRange(q0, q1)).coordinates + for (i in 0 until sub.size) path.moveTo(t0 + sub.target[i], q0 + sub.query[i]) + return + } + + var kk = k + var chain = emptyList<Run>() + while (kk >= lastK) { + chain = chainOf(anchors(t0, t1, q0, q1, kk)) + if (chain.isNotEmpty()) break + kk -= 3 + } + + if (chain.isEmpty()) { + // Two long stretches with nothing in common. There is no good + // answer here, so take a cheap one: halve both and carry on. + val tm = t0 + n / 2 + val qm = q0 + m / 2 + solve(t0, tm, q0, qm, lastK) + solve(tm, t1, qm, q1, lastK) + return + } + + var ct = t0 + var cq = q0 + for (run in chain) { + solve(ct, run.t, cq, run.q, kk) + path.moveTo(run.t + run.len, run.q + run.len) + ct = run.t + run.len + cq = run.q + run.len + } + solve(ct, t1, cq, q1, kk) + } + + /** Every k-gram occurring exactly once on each side, joined into runs. */ + private fun anchors(t0: Int, t1: Int, q0: Int, q1: Int, k: Int): List<Run> { + if (t1 - t0 < k || q1 - q0 < k) return emptyList() + + val inTarget = uniqueGrams(target, t0, t1, k) + val runs = ArrayList<Run>() + var current: Run? = null + + val inQuery = uniqueGrams(query, q0, q1, k) + // Walk the query in order so that consecutive hits extend a run. + for (qi in q0..q1 - k) { + val h = hash(query, qi, k) + if (inQuery.get(h) != qi) { current = null; continue } + val ti = inTarget.get(h) + if (ti < 0 || !same(ti, qi, k)) { current = null; continue } + + val c = current + if (c != null && ti == c.t + (qi - c.q)) { + c.len = qi - c.q + k + } else { + current = Run(ti, qi, k).also { runs += it } + } + } + return runs + } + + private fun same(ti: Int, qi: Int, k: Int): Boolean { + for (d in 0 until k) if (target[ti + d] != query[qi + d]) return false + return true + } + + /** k-gram hash to its position, or to DUPLICATE when it occurs more than once. */ + private fun uniqueGrams(seq: IntArray, from: Int, to: Int, k: Int): LongIntMap { + val map = LongIntMap(to - from) + for (i in from..to - k) { + val h = hash(seq, i, k) + map.put(h, if (map.get(h) == LongIntMap.ABSENT) i else LongIntMap.DUPLICATE) + } + return map + } + + private fun hash(seq: IntArray, at: Int, k: Int): Long { + var h = 1469598103934665603L + for (d in 0 until k) h = (h xor seq[at + d].toLong()) * 1099511628211L + return h + } + + /** Longest chain of runs in order on both sides, overlaps trimmed. */ + private fun chainOf(runs: List<Run>): List<Run> { + if (runs.isEmpty()) return runs + val byTarget = runs.sortedBy { it.t } + + // Longest increasing subsequence on query position (patience sort). + val tails = IntArray(byTarget.size) + val prev = IntArray(byTarget.size) { -1 } + var size = 0 + for (i in byTarget.indices) { + val q = byTarget[i].q + var lo = 0 + var hi = size + while (lo < hi) { + val mid = (lo + hi) ushr 1 + if (byTarget[tails[mid]].q < q) lo = mid + 1 else hi = mid + } + if (lo > 0) prev[i] = tails[lo - 1] + tails[lo] = i + if (lo == size) size++ + } + val picked = ArrayList<Run>(size) + var at = tails[size - 1] + while (at >= 0) { picked += byTarget[at]; at = prev[at] } + picked.reverse() + + // Neighbouring runs on different diagonals can overlap by a few + // characters; give the overlap to the earlier one. + val out = ArrayList<Run>(picked.size) + var endT = 0 + var endQ = 0 + for (r in picked) { + val cut = maxOf(endT - r.t, endQ - r.q, 0) + if (cut >= r.len) continue + r.t += cut; r.q += cut; r.len -= cut + out += r + endT = r.t + r.len + endQ = r.q + r.len + } + return out + } + } + + /** + * Collects breakpoints, merging consecutive steps of one kind so the result + * has the same canonical shape Biopython produces. + */ + private class Path { + private val ts = IntList() + private val qs = IntList() + private var lastKind = 0 + + init { ts.add(0); qs.add(0) } + + fun moveTo(t: Int, q: Int) { + val pt = ts.last() + val pq = qs.last() + if (t == pt && q == pq) return + val dt = t - pt + val dq = q - pq + require(dt >= 0 && dq >= 0) { "path went backwards: ($pt,$pq) -> ($t,$q)" } + if (dt > 0 && dq > 0 && dt != dq) { + // A diagonal and a gap in one step: split at the corner. + val d = minOf(dt, dq) + moveTo(pt + d, pq + d) + moveTo(t, q) + return + } + val kind = if (dt > 0 && dq > 0) 1 else if (dt > 0) 2 else 3 + if (kind == lastKind && ts.size > 1) { ts.setLast(t); qs.setLast(q) } + else { ts.add(t); qs.add(q) } + lastKind = kind + } + + fun build(n: Int, m: Int): Coordinates { + moveTo(n, m) + return Coordinates(ts.toArray(), qs.toArray()) + } + } +} + +/** Open-addressing Long -> Int map. A HashMap<Long, Int> of a whole book boxes millions of objects. */ +internal class LongIntMap(expected: Int) { + private val capacity = Integer.highestOneBit(maxOf(16, expected * 2) - 1) shl 1 + private val mask = capacity - 1 + private val keys = LongArray(capacity) + private val values = IntArray(capacity) { ABSENT } + + private fun slot(key: Long): Int { + var i = (key xor (key ushr 32)).toInt() and mask + while (values[i] != ABSENT && keys[i] != key) i = (i + 1) and mask + return i + } + + fun get(key: Long): Int = values[slot(key)] + + fun put(key: Long, value: Int) { + val i = slot(key) + keys[i] = key + values[i] = value + } + + companion object { + const val ABSENT = -1 + const val DUPLICATE = -2 + } +} diff --git a/core/src/main/kotlin/space/subread/core/BookAligner.kt b/core/src/main/kotlin/space/subread/core/BookAligner.kt new file mode 100644 index 0000000..f7b210b --- /dev/null +++ b/core/src/main/kotlin/space/subread/core/BookAligner.kt @@ -0,0 +1,98 @@ +package space.subread.core + +/** + * Aligning a whole book at once, rather than chapter by matched chapter. + * + * The reference implementation gives every character of the text it is handed + * to some cue. That is right when the text is exactly what was read aloud, and + * wrong for a whole epub: the title page, the contents, the copyright notice, + * a translator's afterword nobody narrated - all of it would be glued onto + * whichever cue happens to sit next to it. subplz avoids that by matching + * chapters up first and dropping the ones that match nothing, which needs + * chaptered audio and a similarity threshold that does not hold across scripts. + * + * Here the alignment itself says what was narrated. A first pass lines up + * everything; stretches of text where almost nothing agrees with the + * transcript were evidently not read, and are left out of the second pass. + */ +object BookAligner { + + /** Share of a paragraph's characters that must agree before it counts as heard. */ + private const val HEARD = 0.20 + + /** + * Unheard paragraphs are only dropped in runs at least this long (cleaned + * characters). A single heading the recogniser mangled completely is still + * a heading that was read; a page of nothing is not. + */ + private const val MIN_UNREAD_RUN = 240 + + class Result(val cues: List<Cue>, val paragraphsUsed: Int, val paragraphsDropped: Int) + + fun align( + transcript: List<TranscriptSegment>, + paragraphs: List<String>, + language: Language, + ): Result { + val narrated = narratedOnly(transcript, paragraphs, language) + val cues = Aligner.align(transcript, narrated, language) + return Result(cues, narrated.size, paragraphs.size - narrated.size) + } + + internal fun narratedOnly( + transcript: List<TranscriptSegment>, + paragraphs: List<String>, + language: Language, + ): List<String> { + val textClean = paragraphs.map { language.clean(it).toCodePoints() } + val target = Aligner.concat(textClean) + val query = Aligner.concat(transcript.map { language.clean(it.text).toCodePoints() }) + if (target.isEmpty() || query.isEmpty()) return paragraphs + + val coordinates = AnchoredAligner.align(target, query).coordinates + + // Characters of the text that met the same character in the transcript. + val agreed = BooleanArray(target.size) + for (k in 1 until coordinates.size) { + val t0 = coordinates.target[k - 1] + val q0 = coordinates.query[k - 1] + val dt = coordinates.target[k] - t0 + if (dt > 0 && coordinates.query[k] - q0 > 0) { + for (d in 0 until dt) agreed[t0 + d] = target[t0 + d] == query[q0 + d] + } + } + + val heard = BooleanArray(paragraphs.size) + var at = 0 + for ((i, cps) in textClean.withIndex()) { + val hits = (at until at + cps.size).count { agreed[it] } + // Nothing to compare (a paragraph of pure punctuation) is not evidence either way. + heard[i] = cps.isEmpty() || hits >= HEARD * cps.size + at += cps.size + } + + // Drop unheard paragraphs only where they form a long enough run. + val keep = BooleanArray(paragraphs.size) { true } + var i = 0 + while (i < paragraphs.size) { + if (heard[i]) { i++; continue } + var j = i + var chars = 0 + while (j < paragraphs.size && (!heard[j] || textClean[j].isEmpty())) { + chars += textClean[j].size + j++ + } + if (chars >= MIN_UNREAD_RUN) for (k in i until j) keep[k] = false + i = j + } + + val out = paragraphs.filterIndexed { k, _ -> keep[k] } + // A book with nothing recognisably narrated is a mismatched book; let + // the caller see that in the cues rather than returning nothing at all. + return out.ifEmpty { paragraphs } + } + + /** How much of the transcript found a home in the book, 0..1. For "is this the right book?". */ + fun matchRate(cues: List<Cue>): Double = + if (cues.isEmpty()) 0.0 else cues.count { !it.text.startsWith(Subs.UNMATCHED) }.toDouble() / cues.size +} diff --git a/core/src/main/kotlin/space/subread/core/BookText.kt b/core/src/main/kotlin/space/subread/core/BookText.kt new file mode 100644 index 0000000..dd6ca4a --- /dev/null +++ b/core/src/main/kotlin/space/subread/core/BookText.kt @@ -0,0 +1,129 @@ +package space.subread.core + +import org.jsoup.Jsoup +import org.jsoup.parser.Parser +import java.io.File +import java.io.InputStream +import java.nio.charset.Charset +import java.util.zip.ZipInputStream + +/** + * A book as a flat list of paragraphs, in reading order. + * + * Reads epubs straight off the zip with a tolerant HTML parser rather than an + * epub library: converted and scraped epubs are malformed more often than not, + * and all that is needed from one is its text in spine order. + */ +object BookText { + + private val BLOCKS = "p, li, blockquote, h1, h2, h3, h4, h5, h6" + + fun read(file: File): List<String> = file.inputStream().use { read(it, file.name) } + + fun read(input: InputStream, name: String): List<String> = when { + name.endsWith(".epub", ignoreCase = true) -> epub(input) + name.endsWith(".zip", ignoreCase = true) -> aozoraZip(input) + else -> plain(decode(input.readBytes())) + } + + // ------------------------------------------------------------------ epub + + fun epub(input: InputStream): List<String> { + val entries = LinkedHashMap<String, ByteArray>() + ZipInputStream(input).use { zip -> + while (true) { + val e = zip.nextEntry ?: break + if (!e.isDirectory) entries[e.name] = zip.readBytes() + } + } + + val order = spine(entries) ?: entries.keys.filter(::isPage).sorted() + return order.flatMap { path -> entries[path]?.let(::page) ?: emptyList() } + } + + private fun isPage(name: String) = + name.endsWith(".xhtml", true) || name.endsWith(".html", true) || name.endsWith(".htm", true) + + /** Document paths in spine order, or null when the package file cannot be followed. */ + private fun spine(entries: Map<String, ByteArray>): List<String>? { + val container = entries["META-INF/container.xml"] ?: return null + val opfPath = Jsoup.parse(String(container), "", Parser.xmlParser()) + .selectFirst("rootfile")?.attr("full-path")?.takeIf { it.isNotEmpty() } ?: return null + val opf = Jsoup.parse(String(entries[opfPath] ?: return null), "", Parser.xmlParser()) + val base = opfPath.substringBeforeLast('/', "") + + val hrefs = opf.select("manifest > item").associate { it.attr("id") to it.attr("href") } + val paths = opf.select("spine > itemref") + // linear="no" is auxiliary content (notes, answers) outside the reading order. + .filter { it.attr("linear") != "no" } + .mapNotNull { hrefs[it.attr("idref")] } + .map { resolve(base, java.net.URLDecoder.decode(it.substringBefore('#'), "UTF-8")) } + .filter { it in entries } + return paths.ifEmpty { null } + } + + private fun resolve(base: String, href: String): String { + val parts = ArrayDeque(if (base.isEmpty()) emptyList() else base.split('/')) + for (seg in href.split('/')) when (seg) { + "", "." -> {} + ".." -> parts.removeLastOrNull() + else -> parts.addLast(seg) + } + return parts.joinToString("/") + } + + private fun page(bytes: ByteArray): List<String> { + val doc = Jsoup.parse(String(bytes, Charsets.UTF_8)) + // Furigana would otherwise be read twice: once as kanji, once as kana. + doc.select("rt, rp").remove() + val body = doc.body() + val blocks = body.select(BLOCKS) + // A quote holding paragraphs would yield its text twice; keep the leaves. + .filter { it.select(BLOCKS).size == 1 } + val source = if (blocks.isEmpty()) listOf(body) else blocks + return source.map { it.text().trim() }.filter { it.isNotEmpty() } + } + + // ---------------------------------------------------------------- aozora + + /** An Aozora Bunko download: a zip holding one Shift_JIS text with ruby markup. */ + fun aozoraZip(input: InputStream): List<String> { + ZipInputStream(input).use { zip -> + while (true) { + val e = zip.nextEntry ?: break + if (e.name.endsWith(".txt", true)) return aozora(decode(zip.readBytes())) + } + } + return emptyList() + } + + private val annotation = Regex("[#[^]]*]") + private val ruby = Regex("《[^》]*》") + + fun aozora(raw: String): List<String> { + var lines = raw.replace("\r\n", "\n").split('\n') + // Title block, then a legend fenced by two dashed rules; then the text. + val rules = lines.indices.filter { lines[it].startsWith("-----") } + if (rules.size >= 2) lines = lines.drop(rules[1] + 1) + // The colophon. + val colophon = lines.indexOfFirst { it.startsWith("底本:") } + if (colophon >= 0) lines = lines.take(colophon) + + return lines.map { ruby.replace(annotation.replace(it, ""), "").replace("|", "").trim() } + .filter { it.isNotEmpty() } + } + + // ----------------------------------------------------------------- plain + + fun plain(text: String): List<String> { + if ("《" in text && "底本:" in text) return aozora(text) + return text.replace("\r\n", "\n").split('\n').map { it.trim() }.filter { it.isNotEmpty() } + } + + /** UTF-8 unless it plainly is not, then Shift_JIS - the two a text file here will be. */ + private fun decode(bytes: ByteArray): String { + val utf8 = String(bytes, Charsets.UTF_8) + if ('�' !in utf8) return utf8.removePrefix("") + return String(bytes, Charset.forName("Shift_JIS")) + } +} diff --git a/core/src/main/kotlin/space/subread/core/Gotoh.kt b/core/src/main/kotlin/space/subread/core/Gotoh.kt new file mode 100644 index 0000000..89dabdf --- /dev/null +++ b/core/src/main/kotlin/space/subread/core/Gotoh.kt @@ -0,0 +1,172 @@ +package space.subread.core + +/** + * Where two sequences line up, as a path of breakpoints: between consecutive + * columns either both positions advance (an aligned run) or only one does (a + * gap). Same shape as Biopython's `Alignment.coordinates`, which is what the + * reference implementation consumes. + */ +class Coordinates(val target: IntArray, val query: IntArray) { + val size: Int get() = target.size + + init { + require(target.size == query.size) + } +} + +class Alignment(val score: Int, val coordinates: Coordinates) + +/** + * Exact global alignment with affine gaps (Gotoh). + * + * Scores are the reference's, times ten so the arithmetic stays in integers + * and ties are exact: match 1, mismatch -0.6, gap open -0.8, gap extend -0.5. + * + * Costs rows * columns bytes for the traceback. That is fine for a chapter and + * hopeless for a book, which is why whole books go through [AnchoredAligner] + * and only the stretches between anchors end up here. + */ +object Gotoh { + const val MATCH = 10 + const val MISMATCH = -6 + const val OPEN = -8 + const val EXTEND = -5 + + private const val NEG = Int.MIN_VALUE / 4 + + // Traceback, packed per cell: which state each of the three states came from. + private const val M_FROM_X = 1 // bits 0-1: predecessor of M (0 = M) + private const val M_FROM_Y = 2 + private const val X_FROM_X = 1 shl 2 // bits 2-3: predecessor of X (0 = M) + private const val X_FROM_Y = 2 shl 2 + private const val Y_FROM_X = 1 shl 4 // bits 4-5: predecessor of Y (0 = M) + private const val Y_FROM_Y = 2 shl 4 + + fun cells(n: Int, m: Int): Long = (n + 1L) * (m + 1L) + + fun align(target: IntArray, query: IntArray): Alignment { + val n = target.size + val m = query.size + val width = m + 1 + val trace = ByteArray(Math.toIntExact(cells(n, m))) + + // M: target[i-1] against query[j-1]. X: target[i-1] against a gap. + // Y: query[j-1] against a gap. Two rows of each are enough for scores. + var pm = IntArray(width) { NEG } + var px = IntArray(width) { NEG } + var py = IntArray(width) { NEG } + var cm = IntArray(width) + var cx = IntArray(width) + var cy = IntArray(width) + + pm[0] = 0 + for (j in 1..m) { + py[j] = OPEN + (j - 1) * EXTEND + trace[j] = (if (j == 1) 0 else Y_FROM_Y).toByte() + } + + for (i in 1..n) { + val row = i * width + cm[0] = NEG + cy[0] = NEG + cx[0] = OPEN + (i - 1) * EXTEND + trace[row] = (if (i == 1) 0 else X_FROM_X).toByte() + + val t = target[i - 1] + for (j in 1..m) { + var bits = 0 + + // M: diagonal step out of whichever state was best. + var best = pm[j - 1] + if (px[j - 1] > best) { best = px[j - 1]; bits = M_FROM_X } + if (py[j - 1] > best) { best = py[j - 1]; bits = M_FROM_Y } + cm[j] = best + if (t == query[j - 1]) MATCH else MISMATCH + + // X: step down. Extending is cheaper than reopening. + var bx = pm[j] + OPEN + var xb = 0 + if (px[j] + EXTEND > bx) { bx = px[j] + EXTEND; xb = X_FROM_X } + if (py[j] + OPEN > bx) { bx = py[j] + OPEN; xb = X_FROM_Y } + cx[j] = bx + + // Y: step right. + var by = cm[j - 1] + OPEN + var yb = 0 + if (cx[j - 1] + OPEN > by) { by = cx[j - 1] + OPEN; yb = Y_FROM_X } + if (cy[j - 1] + EXTEND > by) { by = cy[j - 1] + EXTEND; yb = Y_FROM_Y } + cy[j] = by + + trace[row + j] = (bits or xb or yb).toByte() + } + + val tm = pm; pm = cm; cm = tm + val tx = px; px = cx; cx = tx + val ty = py; py = cy; cy = ty + } + + var state = 0 // 0 = M, 1 = X, 2 = Y + var score = pm[m] + if (px[m] > score) { score = px[m]; state = 1 } + if (py[m] > score) { score = py[m]; state = 2 } + + // Walk back, noting a breakpoint whenever the kind of step changes. + val ti = IntList() + val qi = IntList() + var i = n + var j = m + ti.add(i); qi.add(j) + var last = -1 + while (i > 0 || j > 0) { + if (last != -1 && last != state) { ti.add(i); qi.add(j) } + last = state + val bits = trace[i * width + j].toInt() + when (state) { + 0 -> { state = bits and 3; i--; j-- } + 1 -> { state = (bits shr 2) and 3; i-- } + else -> { state = (bits shr 4) and 3; j-- } + } + } + if (ti.last() != 0 || qi.last() != 0) { ti.add(0); qi.add(0) } + + return Alignment(score, Coordinates(ti.reversed(), qi.reversed())) + } + + /** What [coordinates] is worth, for checking an alignment made some other way. */ + fun score(target: IntArray, query: IntArray, coordinates: Coordinates): Int { + var total = 0 + for (k in 1 until coordinates.size) { + val dt = coordinates.target[k] - coordinates.target[k - 1] + val dq = coordinates.query[k] - coordinates.query[k - 1] + when { + dt > 0 && dq > 0 -> { + require(dt == dq) { "ragged aligned run at column $k" } + val t0 = coordinates.target[k - 1] + val q0 = coordinates.query[k - 1] + for (d in 0 until dt) { + total += if (target[t0 + d] == query[q0 + d]) MATCH else MISMATCH + } + } + dt > 0 || dq > 0 -> total += OPEN + (maxOf(dt, dq) - 1) * EXTEND + } + } + return total + } +} + +/** Growable int array; boxing a few hundred thousand Ints is worth avoiding. */ +internal class IntList(capacity: Int = 64) { + private var data = IntArray(capacity) + var size = 0 + private set + + fun add(v: Int) { + if (size == data.size) data = data.copyOf(size * 2) + data[size++] = v + } + + operator fun get(i: Int) = data[i] + fun last() = data[size - 1] + fun setLast(v: Int) { data[size - 1] = v } + fun toArray(): IntArray = data.copyOf(size) + fun reversed(): IntArray = IntArray(size) { data[size - 1 - it] } +} diff --git a/core/src/main/kotlin/space/subread/core/Language.kt b/core/src/main/kotlin/space/subread/core/Language.kt new file mode 100644 index 0000000..64e99f1 --- /dev/null +++ b/core/src/main/kotlin/space/subread/core/Language.kt @@ -0,0 +1,66 @@ +package space.subread.core + +/** + * How text is reduced to something comparable before alignment. + * + * Whisper-tiny gets a great deal wrong - kana for kanji, は for わ, numerals + * either way round - and the book and the transcript disagree on punctuation + * and spacing everywhere. Alignment happens on a cleaned copy of both, and the + * result is mapped back onto the original text afterwards. + * + * Ported from ats/lang.py. Behaviour has to match character for character, or + * offsets computed here would not line up with the reference implementation. + */ +sealed class Language { + protected open val translations: Map<Int, Int> = emptyMap() + + /** One-pass, one-to-one character substitution, then lowercased. */ + fun translate(s: String): String { + if (translations.isEmpty()) return s.lowercase() + val out = StringBuilder(s.length) + s.codePoints().forEach { cp -> out.appendCodePoint(translations[cp] ?: cp) } + return out.toString().lowercase() + } + + open fun clean(s: String): String = translate(s) + + companion object { + /** Only Japanese has rules of its own; everything else is case-folded. */ + fun of(code: String?): Language = if (code == "ja") Japanese else Plain + } +} + +object Plain : Language() + +object Japanese : Language() { + override val translations: Map<Int, Int> = buildMap { + // Katakana to hiragana: the recogniser picks between them at random. + for (i in 0 until 0x56) put(0x30A1 + i, 0x3041 + i) + + // Kanji numerals to digits. The digit string is shorter than the kanji + // one and wraps, which is how 十 and 拾 both come out as 1. + val kansuu = "一二三四五六七八九十〇零壱弐参肆伍陸漆捌玖拾".toCodePoints() + val arabic = "123456789100".toCodePoints() + kansuu.forEachIndexed { i, cp -> put(cp, arabic[i % arabic.size]) } + + // ASCII to full width, so "A" in one text meets "A" in the other. + for (cp in 0x21 until 0x7F) put(cp, cp + 0xFEE0) + + // Particles written one way and pronounced another. + put('は'.code, 'わ'.code) + put('あ'.code, 'わ'.code) + put('お'.code, 'を'.code) + put('へ'.code, 'え'.code) + } + + // Everything that is not a letter or digit goes, except 。 when it leads a + // run - sentence ends are worth keeping as alignment landmarks. + private val noise = Regex("(?![。])[\\p{C}\\p{M}\\p{P}\\p{S}\\p{Z}\\sー々ゝ]+") + + // Collapse repeats to a single character: long vowels and stutters are + // exactly where the recogniser and the book disagree on length. + private val repeats = Regex("(.)(?=\\1+)") + + override fun clean(s: String): String = + repeats.replace(noise.replace(translate(s), ""), "") +} diff --git a/core/src/main/kotlin/space/subread/core/Model.kt b/core/src/main/kotlin/space/subread/core/Model.kt new file mode 100644 index 0000000..00401cd --- /dev/null +++ b/core/src/main/kotlin/space/subread/core/Model.kt @@ -0,0 +1,23 @@ +package space.subread.core + +/** One stretch of speech as the recogniser heard it. Times are seconds. */ +data class TranscriptSegment(val text: String, val start: Double, val end: Double) + +/** One subtitle. Mutable on purpose: the punctuation pass edits neighbours in place. */ +class Cue(var text: String, val start: Double, val end: Double) { + override fun toString() = "Cue(%.3f-%.3f %s)".format(start, end, text) +} + +/** + * A slice `[start, end)` of one paragraph, claimed by transcript segment [sub]. + * Offsets are in code points, never UTF-16 units, so a slice can not split a + * surrogate pair however the text was cut. + */ +class Span(var start: Int, var end: Int, val sub: Int) { + override fun toString() = "[$start, $end, $sub]" +} + +internal fun String.toCodePoints(): IntArray = codePoints().toArray() + +internal fun IntArray.asString(from: Int = 0, to: Int = size): String = + if (to <= from) "" else String(this, from, to - from) diff --git a/core/src/main/kotlin/space/subread/core/Srt.kt b/core/src/main/kotlin/space/subread/core/Srt.kt new file mode 100644 index 0000000..4b32a66 --- /dev/null +++ b/core/src/main/kotlin/space/subread/core/Srt.kt @@ -0,0 +1,30 @@ +package space.subread.core + +import kotlin.math.roundToLong + +object Srt { + /** + * One line of text per cue, always. Hoshi Reader reads exactly the third + * line of each block as the cue text, so a wrapped cue would lose its tail + * there; and nothing downstream benefits from the wrapping. + */ + fun write(cues: List<Cue>): String { + val out = StringBuilder() + var n = 0 + for (cue in cues) { + val text = cue.text.replace(Regex("\\s*[\\r\\n]+\\s*"), " ").trim() + if (text.isEmpty()) continue + n++ + out.append(n).append('\n') + .append(stamp(cue.start)).append(" --> ").append(stamp(cue.end)).append('\n') + .append(text).append("\n\n") + } + return out.toString() + } + + /** `HH:MM:SS,mmm`. Rounded to the millisecond first, so 59.9996 s carries properly. */ + fun stamp(seconds: Double): String { + val ms = (maxOf(seconds, 0.0) * 1000).roundToLong() + return "%02d:%02d:%02d,%03d".format(ms / 3_600_000, ms / 60_000 % 60, ms / 1000 % 60, ms % 1000) + } +} diff --git a/core/src/main/kotlin/space/subread/core/Subs.kt b/core/src/main/kotlin/space/subread/core/Subs.kt new file mode 100644 index 0000000..6dc9e0d --- /dev/null +++ b/core/src/main/kotlin/space/subread/core/Subs.kt @@ -0,0 +1,169 @@ +package space.subread.core + +/** + * From spans to subtitles, then the punctuation tidy-up. + * + * `toSubs` is ats/main.py's to_subs; `shiftAlign` and its helpers are + * subplz/align.py's. Ported faithfully, quirks included - see AlignSub for why. + */ +object Subs { + const val START_PUNC = "『「((《⦅[{\"'“¿" + "'“\"¿([{-『「(〈《〔【{[⦅<<‘“〝※" + const val END_PUNC = "'\"・.。!!??::”>>⦆)]}』」)〉》〕】}]’〟/\~〜~;;─―–-➡" + const val OTHER_PUNC = "* ,,、…" + const val NOPEND = + "うぁぃぅぇぉっゃゅょゎゕゖァィゥェォヵㇰヶㇱㇲッㇳㇴㇵㇶㇷㇷ゚ㇸㇹㇺャュョㇻㇼㇽㇾㇿヮ… " + + val PREPEND_SET: Set<Int> = START_PUNC.toCodePoints().toSet() + val APPEND_SET: Set<Int> = (END_PUNC + OTHER_PUNC).toCodePoints().toSet() + val NOPEND_SET: Set<Int> = NOPEND.toCodePoints().toSet() + + private val punctuation: Set<Char> = (START_PUNC + END_PUNC + OTHER_PUNC).toSet() + private val startPunc: Set<Char> = START_PUNC.toSet() + private val endPunc: Set<Char> = END_PUNC.toSet() + + /** A transcript-only line: spoken, but not found in the book. */ + const val UNMATCHED = "*" + + /** + * One cue per transcript segment, timed by the recogniser and worded by + * the book. A segment that claimed no text keeps its own words, flagged. + */ + fun toSubs( + text: List<String>, + subs: List<TranscriptSegment>, + alignment: List<List<Span>>, + offset: Double = 0.0, + ): MutableList<Cue> { + class Flat(val span: Span, val line: Int) + val flat = alignment.flatMapIndexed { i, spans -> spans.map { Flat(it, i) } } + val lines = text.map { it.toCodePoints() } + + val out = ArrayList<Cue>(subs.size) + var start = 0 + var end = 0 + for ((si, s) in subs.withIndex()) { + while (end < flat.size && flat[end].span.sub == si) end++ + val r = StringBuilder() + for (k in start until end) { + val a = flat[k] + r.append(pySlice(lines[a.line], a.span.start, a.span.end)) + } + val body = r.toString() + out += if (body.isNotBlank()) Cue(body, s.start + offset, s.end + offset) + else Cue(UNMATCHED + s.text, s.start + offset, s.end + offset) + start = end + } + return out + } + + /** `seq[a:b]` with Python's rules: negatives wrap, out of range clamps. */ + private fun pySlice(cps: IntArray, a: Int, b: Int): String { + val n = cps.size + val lo = (if (a < 0) a + n else a).coerceIn(0, n) + val hi = (if (b < 0) b + n else b).coerceIn(0, n) + return cps.asString(lo, hi) + } + + // ------------------------------------------------------------------ + // shift_align + // ------------------------------------------------------------------ + + private fun punctuationIndices(s: String) = s.indices.filter { s[it] in punctuation } + private fun countNonPunctuation(s: String) = s.count { it !in punctuation } + private fun hasEndingPunctuation(c: Char) = c in endPunc + private fun hasDoubleComma(starts: String, ends: String) = starts.last() == '、' && ends.last() == '、' + + /** + * Move a stranded character or two across a cue boundary so that cues + * start and end on punctuation where they nearly did already. + */ + fun shiftAlign(segments: List<Cue>): List<Cue> { + val fresh = ArrayList<Cue>(segments.size) + var startIndex = 0 // read by the second pass too, as in the original + + for ((i, segment) in segments.withIndex()) { + var text = segment.text + val indices = punctuationIndices(text) + if (indices.isEmpty()) { + fresh += segment + continue + } + startIndex = indices[0] + val nonPunc = countNonPunctuation(text.substring(0, startIndex)) + if (nonPunc == 0 || countNonPunctuation(text.substring(startIndex + 1)) == 0) { + fresh += segment + continue + } + if (nonPunc <= 2 && i > 0 && fresh.isNotEmpty() && + !hasEndingPunctuation(fresh.last().text.last()) && + !hasDoubleComma(fresh.last().text, text.substring(0, startIndex + 1)) + ) { + // A word or less before the first mark: it belongs to the previous cue. + fresh.last().text += text.substring(0, startIndex + 1) + text = text.substring(startIndex + 1) + } + fresh += Cue(text, segment.start, segment.end) + } + + val final = ArrayList<Cue>(fresh.size) + for (i in fresh.indices) { + val segment = fresh[i] + var text = segment.text + val indices = punctuationIndices(text) + if (indices.isNotEmpty()) { + val lastIndex = indices.last() + val tail = text.substring(lastIndex) + if (countNonPunctuation(tail) == 0 || tail.length == text.length) { + final += segment + continue + } + if (countNonPunctuation(tail) <= 2 && i + 1 < fresh.size && + !hasEndingPunctuation(fresh[i + 1].text.first()) && + !hasDoubleComma( + fresh[i + 1].text.substring(0, 1), + text.substring(0, minOf(startIndex + 1, text.length)), + ) + ) { + // A word or less after the last mark: it belongs to the next cue. + // The original reaches into the *input* list here, not the + // first pass's output. Kept: the fixtures depend on it. + val next = segments[i + 1] + next.text = text.substring(lastIndex + 1) + next.text + text = text.substring(0, lastIndex + 1) + final += Cue(text, segment.start, segment.end) + fresh[i + 1] = next + continue + } + } + final += Cue(text, segment.start, segment.end) + } + + return doubleCheckMisalignedPairs(final).map { Cue(it.text.trim(), it.start, it.end) } + } + + private val strayOpening = Regex("(」「(.{1,2})、$|」「(.{1})、$)") + + private fun doubleCheckMisalignedPairs(segments: MutableList<Cue>): List<Cue> { + if (segments.size < 2) return segments + val adjusted = ArrayList<Cue>(segments.size) + for ((i, segment) in segments.withIndex()) { + // 」「ばか、 at the very end is the start of the next line of dialogue. + strayOpening.find(segment.text)?.let { m -> + if (i < segments.size - 1) { + segments[i + 1].text = m.value + segments[i + 1].text + segment.text = segment.text.substring(0, m.range.first) + } + } + if (segment.text.isNotEmpty() && segment.text.first() in endPunc && i > 0) { + adjusted.last().text += segment.text.first() + segment.text = segment.text.substring(1) + } + if (segment.text.isNotEmpty() && segment.text.last() in startPunc && i < segments.size - 1) { + segments[i + 1].text = segment.text.last() + segments[i + 1].text + segment.text = segment.text.substring(0, segment.text.length - 1) + } + adjusted += segment + } + return adjusted + } +} diff --git a/core/src/test/kotlin/space/subread/core/BookTest.kt b/core/src/test/kotlin/space/subread/core/BookTest.kt new file mode 100644 index 0000000..b0a242e --- /dev/null +++ b/core/src/test/kotlin/space/subread/core/BookTest.kt @@ -0,0 +1,160 @@ +package space.subread.core + +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.jsonObject +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test +import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream +import java.io.File +import java.util.zip.ZipEntry +import java.util.zip.ZipOutputStream + +class BookTest { + + private fun case(name: String): GoldenTest.Case { + val file = File(javaClass.classLoader.getResource("golden")!!.toURI()).resolve("$name.json") + return GoldenTest.Case(Json.parseToJsonElement(file.readText()).jsonObject) + } + + // ------------------------------------------------------------------ srt + + @Test + fun srtStampsCarryProperly() { + assertEquals("00:00:00,000", Srt.stamp(0.0)) + assertEquals("00:01:00,000", Srt.stamp(59.9996)) // not 00:00:60,000 + assertEquals("01:00:00,000", Srt.stamp(3599.9999)) + assertEquals("12:34:56,789", Srt.stamp(12 * 3600 + 34 * 60 + 56.789)) + assertEquals("00:00:00,000", Srt.stamp(-1.0)) + } + + @Test + fun srtKeepsEachCueOnOneLineAndSkipsEmptyOnes() { + val srt = Srt.write(listOf( + Cue("first\nline \r\n wrapped", 0.0, 1.5), + Cue(" ", 1.5, 2.0), + Cue("second", 2.0, 3.25), + )) + assertEquals( + "1\n00:00:00,000 --> 00:00:01,500\nfirst line wrapped\n\n" + + "2\n00:00:02,000 --> 00:00:03,250\nsecond\n\n", + srt, + ) + } + + // ------------------------------------------------------- unread pruning + + /** + * Front matter, an afterword and an unread insert in the middle must make + * no difference to the subtitles, and must not appear in any of them. + */ + @Test + fun textThatWasNotNarratedIsLeftOut() { + val c = case("neko_003_006") + val other = case("neko_137_140").paragraphs // same author, different chapter + val front = other.take(6) + // Long enough to count as a passage; a stray line or two is kept on purpose. + val insert = other.drop(40).take(12) + assertTrue(insert.sumOf { c.language.clean(it).length } > 400) + val back = other.takeLast(8) + assertTrue(front.sumOf { it.length } > 500 && back.sumOf { it.length } > 300) + + val clean = BookAligner.align(c.transcript, c.paragraphs, c.language) + val mid = c.paragraphs.size / 2 + val padded = front + c.paragraphs.take(mid) + insert + c.paragraphs.drop(mid) + back + val got = BookAligner.align(c.transcript, padded, c.language) + + assertEquals(clean.paragraphsUsed, got.paragraphsUsed) + assertEquals(front.size + insert.size + back.size + clean.paragraphsDropped, got.paragraphsDropped) + assertEquals(clean.cues.map { it.text }, got.cues.map { it.text }) + val junk = (front + insert + back).map { it.take(12) } + got.cues.forEach { cue -> junk.forEach { assertFalse("junk in: ${cue.text}", it in cue.text) } } + assertTrue(BookAligner.matchRate(got.cues) > 0.95) + } + + @Test + fun aBookThatIsNotTheAudioScoresBadly() { + val c = case("neko_000_003") + val wrong = case("neko_137_140").paragraphs + val got = BookAligner.align(c.transcript, wrong, c.language) + assertEquals(c.transcript.size, got.cues.size) // still one cue per segment, never a crash + // The alignment is forced to put text somewhere; what gives it away is + // how little of it agrees. + val good = BookAligner.align(c.transcript, c.paragraphs, c.language) + assertTrue(good.paragraphsDropped < c.paragraphs.size / 2) + } + + // ----------------------------------------------------------------- epub + + private fun epub(vararg files: Pair<String, String>): ByteArray { + val out = ByteArrayOutputStream() + ZipOutputStream(out).use { zip -> + for ((name, body) in files) { + zip.putNextEntry(ZipEntry(name)) + zip.write(body.toByteArray()) + zip.closeEntry() + } + } + return out.toByteArray() + } + + private fun page(body: String) = + "<?xml version='1.0'?><html xmlns='http://www.w3.org/1999/xhtml'><head><title>t</title></head><body>$body</body></html>" + + @Test + fun epubIsReadInSpineOrderNotFileOrder() { + val bytes = epub( + "mimetype" to "application/epub+zip", + "META-INF/container.xml" to + "<container><rootfiles><rootfile full-path='OEBPS/content.opf'/></rootfiles></container>", + "OEBPS/content.opf" to """ + <package><manifest> + <item id='a' href='text/z-first.xhtml'/> + <item id='b' href='text/a%20second.xhtml'/> + <item id='n' href='text/notes.xhtml'/> + </manifest><spine> + <itemref idref='a'/><itemref idref='n' linear='no'/><itemref idref='b'/> + </spine></package>""", + "OEBPS/text/a second.xhtml" to page("<p>二番目。</p><ul><li>item</li></ul>"), + "OEBPS/text/z-first.xhtml" to page( + "<h1>第一章</h1><p><ruby>吾輩<rt>わがはい</rt></ruby>は猫である。</p>" + + "<blockquote><p>inner one</p><p>inner two</p></blockquote><p> </p>"), + "OEBPS/text/notes.xhtml" to page("<p>an endnote nobody reads aloud</p>"), + ) + assertEquals( + listOf("第一章", "吾輩は猫である。", "inner one", "inner two", "二番目。", "item"), + BookText.read(ByteArrayInputStream(bytes), "book.epub"), + ) + } + + @Test + fun epubWithoutAUsablePackageFileStillYieldsItsText() { + val bytes = epub("b.html" to page("<p>two</p>"), "a.html" to page("<p>one</p>")) + assertEquals(listOf("one", "two"), BookText.read(ByteArrayInputStream(bytes), "x.epub")) + } + + @Test + fun aozoraMarkupIsStripped() { + val zip = File(javaClass.classLoader.getResource("aozora/789_ruby_5639.zip")!!.toURI()) + val paragraphs = BookText.read(zip) + assertTrue("only ${paragraphs.size} paragraphs", paragraphs.size > 1000) + assertEquals("一", paragraphs[0]) + assertTrue(paragraphs[1], paragraphs[1].startsWith("吾輩は猫である。名前はまだ無い。")) + assertEquals(emptyList<String>(), paragraphs.filter { "《" in it || "[#" in it || "|" in it }) + assertEquals(emptyList<String>(), paragraphs.filter { it.startsWith("底本") }) + // And it is the same text the fixtures were cut from. Compared after + // cleaning: Python and Java disagree on which Unicode dash a Shift_JIS + // 0x815C is, which matters to nobody - punctuation is not aligned on. + val known = paragraphs.map { Japanese.clean(it) }.toSet() + assertEquals(emptyList<String>(), + case("neko_000_003").paragraphs.filter { Japanese.clean(it) !in known }.map { it.take(30) }) + } + + @Test + fun plainTextIsOneParagraphPerLine() { + val bytes = "Uno.\r\n\r\n Dos. \nTres.".toByteArray() + assertEquals(listOf("Uno.", "Dos.", "Tres."), BookText.read(ByteArrayInputStream(bytes), "libro.txt")) + } +} diff --git a/core/src/test/kotlin/space/subread/core/DebugDiff.kt b/core/src/test/kotlin/space/subread/core/DebugDiff.kt new file mode 100644 index 0000000..eec9166 --- /dev/null +++ b/core/src/test/kotlin/space/subread/core/DebugDiff.kt @@ -0,0 +1,63 @@ +package space.subread.core + +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.jsonObject +import org.junit.Test +import java.io.File + +/** Not a test: prints where the pipeline first departs from the reference. */ +class DebugDiff { + @Test + fun show() { + val name = System.getProperty("golden.case") ?: return + val file = File(javaClass.classLoader.getResource("golden")!!.toURI()).resolve("$name.json") + val c = GoldenTest.Case(Json.parseToJsonElement(file.readText()).jsonObject) + + val target = c.paragraphsClean.joinToString("").toCodePoints() + val query = c.transcriptClean.joinToString("").toCodePoints() + val mine = Gotoh.align(target, query).coordinates + println("columns: reference ${c.coordinates.size}, mine ${mine.size}") + var k = 0 + while (k < minOf(mine.size, c.coordinates.size) && + mine.target[k] == c.coordinates.target[k] && mine.query[k] == c.coordinates.query[k]) k++ + println("paths agree for $k columns") + for (d in -1..4) { + val i = k + d + if (i < 0) continue + val r = if (i < c.coordinates.size) "(${c.coordinates.target[i]}, ${c.coordinates.query[i]})" else "-" + val m = if (i < mine.size) "(${mine.target[i]}, ${mine.query[i]})" else "-" + println(" col $i reference $r mine $m") + } + + // How far does the anchored path stray from the exact one? + val anchored = AnchoredAligner.align(target, query) + println("score: exact ${Gotoh.score(target, query, mine)} anchored ${anchored.score}") + fun diagonals(co: Coordinates) = buildList { + for (i in 1 until co.size) { + val dt = co.target[i] - co.target[i - 1]; val dq = co.query[i] - co.query[i - 1] + if (dt > 0 && dq > 0) add(Triple(co.target[i - 1], co.query[i - 1], dt)) + } + } + val exactOffsetAt = HashMap<Int, Int>() // target pos -> query pos on the exact path + for ((t, q, len) in diagonals(mine)) for (d in 0 until len) exactOffsetAt[t + d] = q + d + var shown = 0 + for ((t, q, len) in diagonals(anchored.coordinates)) { + val on = (0 until len).count { exactOffsetAt[t + it] == q + it } + if (on < len && shown++ < 12) { + println(" anchored run t=$t q=$q len=$len: $on on the exact path | " + + "text='${target.asString(t, minOf(t + 24, target.size))}' heard='${query.asString(q, minOf(q + 24, query.size))}'") + } + } + println("anchored diagonal runs off the exact path: $shown") + + val got = Aligner.align(c.transcript, c.paragraphs, c.language) + val first = c.cues.indices.firstOrNull { c.cues[it].text != got[it].text } ?: return + println("first differing cue: $first of ${c.cues.size}") + for (i in maxOf(0, first - 2)..minOf(c.cues.size - 1, first + 6)) { + println(" [$i] ref : ${c.cues[i].text}") + println(" [$i] mine: ${got[i].text}") + } + val tail = c.cues.indices.count { it > first && c.cues[it].text == got[it].text } + println("identical after the first difference: $tail") + } +} diff --git a/core/src/test/kotlin/space/subread/core/FullBookTest.kt b/core/src/test/kotlin/space/subread/core/FullBookTest.kt new file mode 100644 index 0000000..e58454a --- /dev/null +++ b/core/src/test/kotlin/space/subread/core/FullBookTest.kt @@ -0,0 +1,58 @@ +package space.subread.core + +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.double +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Assume.assumeTrue +import org.junit.Test +import java.io.File + +/** + * A whole audiobook against a whole book, in one pass - what the phone does. + * Needs tools/make_fullbook.py output, which is local-only; skipped otherwise. + */ +class FullBookTest { + @Test + fun aNineteenHourBookAlignsInOneGo() { + val dir = javaClass.classLoader.getResource("golden-local/full")?.let { File(it.toURI()) } + val files = dir?.listFiles { f -> f.extension == "json" }.orEmpty() + assumeTrue("no whole-book fixtures on this machine", files.isNotEmpty()) + + for (file in files) { + val json = Json.parseToJsonElement(file.readText()).jsonObject + val language = Language.of(json.getValue("language").jsonPrimitive.content) + val transcript = json.getValue("transcript").jsonArray.map { + val o = it.jsonObject + TranscriptSegment( + o.getValue("text").jsonPrimitive.content, + o.getValue("start").jsonPrimitive.double, + o.getValue("end").jsonPrimitive.double, + ) + } + val paragraphs = json.getValue("paragraphs").jsonArray.map { it.jsonPrimitive.content } + + System.gc() + val before = Runtime.getRuntime().let { it.totalMemory() - it.freeMemory() } + val started = System.nanoTime() + val result = BookAligner.align(transcript, paragraphs, language) + val seconds = (System.nanoTime() - started) / 1e9 + val after = Runtime.getRuntime().let { it.totalMemory() - it.freeMemory() } + + val rate = BookAligner.matchRate(result.cues) + val longest = result.cues.maxOf { it.text.length } + println("%s: %d cues in %.1fs, +%d MB; %.1f%% matched; %d of %d paragraphs dropped; longest cue %d chars" + .format(file.nameWithoutExtension, result.cues.size, seconds, (after - before) shr 20, + rate * 100, result.paragraphsDropped, paragraphs.size, longest)) + + assertEquals(transcript.size, result.cues.size) + assertTrue("match rate $rate", rate > 0.95) + // A cue swallowing pages of text is the signature of unread text glued on. + assertTrue("a $longest-character cue", longest < 400) + assertTrue("took ${seconds}s", seconds < 120) + } + } +} diff --git a/core/src/test/kotlin/space/subread/core/GoldenTest.kt b/core/src/test/kotlin/space/subread/core/GoldenTest.kt new file mode 100644 index 0000000..f999f4e --- /dev/null +++ b/core/src/test/kotlin/space/subread/core/GoldenTest.kt @@ -0,0 +1,196 @@ +package space.subread.core + +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonArray +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.double +import kotlinx.serialization.json.int +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Test +import java.io.File + +/** + * Every stage of the port, checked against what the reference implementation + * actually produced on real Whisper-tiny transcripts (tools/make_golden.py). + * + * Stages are fed the reference's own intermediate output, so a failure points + * at one function rather than at "the alignment is somehow different". + */ +class GoldenTest { + + class Case(json: JsonObject) { + val name = json.str("name") + val language = Language.of(json.str("language")) + val transcript = json.arr("transcript").map { + val o = it.jsonObject + TranscriptSegment(o.str("text"), o.num("start"), o.num("end")) + } + val paragraphs = json.arr("paragraphs").map { it.jsonPrimitive.content } + val transcriptClean = json.arr("transcript_clean").map { it.jsonPrimitive.content } + val paragraphsClean = json.arr("paragraphs_clean").map { it.jsonPrimitive.content } + val score = json.num("score") + val coordinates = json.arr("coords").let { rows -> + Coordinates(rows[0].ints(), rows[1].ints()) + } + val afterAlignSub = json.spans("after_align_sub") + val afterFix = json.spans("after_fix") + val afterFixPunc = json.spans("after_fix_punc") + val cuesRaw = json.cues("cues_raw") + val cues = json.cues("cues") + + override fun toString() = name + } + + private val cases: List<Case> by lazy { + val dirs = listOf("golden", "golden-local").mapNotNull { name -> + javaClass.classLoader.getResource(name)?.let { File(it.toURI()) } + } + dirs.flatMap { it.listFiles { f -> f.extension == "json" }!!.sorted() } + .map { Case(Json.parseToJsonElement(it.readText()).jsonObject) } + .also { assertTrue("no golden fixtures found", it.isNotEmpty()) } + } + + @Test + fun cleaningMatchesTheReference() = cases.forEach { c -> + c.transcript.forEachIndexed { i, s -> + assertEquals("$c transcript[$i]", c.transcriptClean[i], c.language.clean(s.text)) + } + c.paragraphs.forEachIndexed { i, p -> + assertEquals("$c paragraph[$i]", c.paragraphsClean[i], c.language.clean(p)) + } + } + + @Test + fun alignSubMatchesTheReference() = cases.forEach { c -> + val got = AlignSub.alignSub(c.coordinates, c.cleanText(), c.cleanSubs()) + assertEquals(c.name, render(c.afterAlignSub), render(got)) + } + + @Test + fun fixMatchesTheReference() = cases.forEach { c -> + val spans = copy(c.afterAlignSub) + AlignSub.fix(c.language, c.paragraphs, c.cleanText(), spans) + assertEquals(c.name, render(c.afterFix), render(spans)) + } + + @Test + fun fixPuncMatchesTheReference() = cases.forEach { c -> + val spans = copy(c.afterFix) + AlignSub.fixPunc(c.paragraphs, spans, Subs.PREPEND_SET, Subs.APPEND_SET, Subs.NOPEND_SET) + assertEquals(c.name, render(c.afterFixPunc), render(spans)) + } + + @Test + fun toSubsMatchesTheReference() = cases.forEach { c -> + val got = Subs.toSubs(c.paragraphs, c.transcript, c.afterFixPunc) + assertEquals(c.name, renderCues(c.cuesRaw), renderCues(got)) + } + + @Test + fun shiftAlignMatchesTheReference() = cases.forEach { c -> + val input = c.cuesRaw.map { Cue(it.text, it.start, it.end) } + assertEquals(c.name, renderCues(c.cues), renderCues(Subs.shiftAlign(input))) + } + + /** The exact aligner must find an alignment as good as Biopython's. */ + @Test + fun gotohFindsTheOptimalScore() = cases.forEach { c -> + val target = c.paragraphsClean.joinToString("").toCodePoints() + val query = c.transcriptClean.joinToString("").toCodePoints() + val got = Gotoh.align(target, query) + assertEquals("$c: reported vs recomputed", got.score, Gotoh.score(target, query, got.coordinates)) + assertEquals("$c: reference path scored our way", + Math.round(c.score * 10).toInt(), Gotoh.score(target, query, c.coordinates)) + assertEquals("$c: optimal score", Math.round(c.score * 10).toInt(), got.score) + } + + /** + * The whole-book aligner never sees the full table, so it cannot promise + * the optimum - but on two copies of the same text it should land on it, + * or within a whisker. Forced through tiny blocks here so that even these + * chapter-sized fixtures exercise anchoring, chaining and stitching. + */ + @Test + fun anchoredAlignmentIsAsGoodAsExact() = cases.forEach { c -> + val target = c.paragraphsClean.joinToString("").toCodePoints() + val query = c.transcriptClean.joinToString("").toCodePoints() + val exact = Math.round(c.score * 10).toInt() + // Production block size must be essentially exact. The tiny sizes are a + // stress test of the stitching: every join that lands inside a long gap + // pays to reopen it, so they are allowed to fall a little short. + for ((cells, floor) in listOf(4_000_000L to 0.999, 40_000L to 0.98, 2_500L to 0.97)) { + val got = AnchoredAligner.align(target, query, exactCells = cells) + assertEquals("$c: path must span both sequences", target.size, got.coordinates.target.last()) + assertEquals(query.size, got.coordinates.query.last()) + val ratio = got.score.toDouble() / exact + println("%-14s blocks<=%-8d anchored %6d / exact %6d (%.2f%%)".format(c.name, cells, got.score, exact, ratio * 100)) + assertTrue("$c: anchored score ${got.score} vs exact $exact", ratio >= floor) + } + } + + /** ...and the cues that come out of it should be the reference's. */ + @Test + fun anchoredCuesAgreeWithTheReference() = cases.forEach { c -> + val textClean = c.cleanText() + val subsClean = c.cleanSubs() + val coordinates = AnchoredAligner.align( + Aligner.concat(textClean), Aligner.concat(subsClean), exactCells = 40_000L).coordinates + val spans = AlignSub.alignSub(coordinates, textClean, subsClean) + AlignSub.fix(c.language, c.paragraphs, textClean, spans) + AlignSub.fixPunc(c.paragraphs, spans, Subs.PREPEND_SET, Subs.APPEND_SET, Subs.NOPEND_SET) + val got = Subs.shiftAlign(Subs.toSubs(c.paragraphs, c.transcript, spans)) + val same = c.cues.indices.count { c.cues[it].text == got[it].text } + val share = same.toDouble() / c.cues.size + println("%-14s anchored: %d/%d cues identical (%.1f%%)".format(c.name, same, c.cues.size, share * 100)) + assertTrue("$c: only ${"%.1f".format(share * 100)}% of cues match", share >= 0.95) + } + + /** + * End to end, from raw text to cues. Optimal alignments are not unique, so + * this can legitimately differ from the reference in the odd cue; what it + * must not do is differ in many. + */ + @Test + fun wholePipelineAgreesWithTheReference() = cases.forEach { c -> + val got = Aligner.align(c.transcript, c.paragraphs, c.language) + assertEquals("$c cue count", c.cues.size, got.size) + val same = c.cues.indices.count { c.cues[it].text == got[it].text } + val share = same.toDouble() / c.cues.size + println("%-14s %d/%d cues identical (%.1f%%)".format(c.name, same, c.cues.size, share * 100)) + assertTrue("$c: only ${"%.1f".format(share * 100)}% of cues match", share >= 0.97) + c.cues.indices.forEach { + assertEquals(c.cues[it].start, got[it].start, 1e-9) + assertEquals(c.cues[it].end, got[it].end, 1e-9) + } + } + + // ------------------------------------------------------------------ + + private fun Case.cleanText() = paragraphsClean.map { it.toCodePoints() } + private fun Case.cleanSubs() = transcriptClean.map { it.toCodePoints() } + + private fun copy(spans: List<List<Span>>) = + spans.map { line -> line.map { Span(it.start, it.end, it.sub) }.toMutableList() } + + private fun render(spans: List<List<Span>>) = + spans.withIndex().joinToString("\n") { (i, line) -> "$i: $line" } + + private fun renderCues(cues: List<Cue>) = + cues.joinToString("\n") { "%.3f %.3f %s".format(it.start, it.end, it.text) } +} + +private fun JsonObject.str(key: String) = getValue(key).jsonPrimitive.content +private fun JsonObject.num(key: String) = getValue(key).jsonPrimitive.double +private fun JsonObject.arr(key: String): JsonArray = getValue(key).jsonArray +private fun kotlinx.serialization.json.JsonElement.ints() = jsonArray.map { it.jsonPrimitive.int }.toIntArray() +private fun JsonObject.spans(key: String): List<List<Span>> = arr(key).map { line -> + line.jsonArray.map { s -> s.ints().let { Span(it[0], it[1], it[2]) } } +} +private fun JsonObject.cues(key: String): List<Cue> = arr(key).map { + val o = it.jsonObject + Cue(o.str("text"), o.num("start"), o.num("end")) +} diff --git a/core/src/test/resources/aozora/789_ruby_5639.zip b/core/src/test/resources/aozora/789_ruby_5639.zip new file mode 100644 index 0000000..89b8912 Binary files /dev/null and b/core/src/test/resources/aozora/789_ruby_5639.zip differ diff --git a/core/src/test/resources/golden/neko_000_003.json b/core/src/test/resources/golden/neko_000_003.json new file mode 100644 index 0000000..97e7241 --- /dev/null +++ b/core/src/test/resources/golden/neko_000_003.json @@ -0,0 +1,8655 @@ +{ +"name": "neko_000_003", +"language": "ja", +"prepend": "『「((《⦅[{\"'“¿'“\"¿([{-『「(〈《〔【{[⦅<<‘“〝※", +"append": "'\"・.。!!??::”>>⦆)]}』」)〉》〕】}]’〟/\~〜~;;─―–-➡* ,,、…", +"nopend": "うぁぃぅぇぉっゃゅょゎゕゖァィゥェォヵㇰヶㇱㇲッㇳㇴㇵㇶㇷㇷ゚ㇸㇹㇺャュョㇻㇼㇽㇾㇿヮ… ", +"transcript": [ +{ +"text": "オーディブルでお届けします", +"start": 0.684, +"end": 3.0 +}, +{ +"text": "夏メソーセキン", +"start": 9.58, +"end": 12.34 +}, +{ +"text": "笑いはねこでや", +"start": 12.34, +"end": 14.42 +}, +{ +"text": "1", +"start": 18.62, +"end": 20.1 +}, +{ +"text": "1", +"start": 25.64, +"end": 26.619999999999997 +}, +{ +"text": "笑いは猫である", +"start": 26.619999999999997, +"end": 28.78 +}, +{ +"text": "名前は戻ない", +"start": 28.991999999999997, +"end": 31.272 +}, +{ +"text": "どこで生まれたか トントケントがつかな", +"start": 31.328000000000003, +"end": 35.4 +}, +{ +"text": "何でも薄くらいじめじめしたところで", +"start": 35.712, +"end": 39.3 +}, +{ +"text": "ニャーニャーないていたことだけは記憶している", +"start": 39.3, +"end": 42.376 +}, +{ +"text": "おまいをここで保じめて人間と読者を見た", +"start": 42.56, +"end": 47.048 +}, +{ +"text": "しかも後で聞くと、それは少せという", +"start": 47.048, +"end": 51.22 +}, +{ +"text": "人間銃で一番動作の種族であったそうだ", +"start": 51.22, +"end": 55.368 +}, +{ +"text": "この少せというのは時々我々をつかまえて似てくという話で", +"start": 55.744, +"end": 62.056000000000004 +}, +{ +"text": "しかしその当時は何と言う考えもなかったから", +"start": 62.056000000000004, +"end": 66.004 +}, +{ +"text": "別断を恐ろしいと思わなかった", +"start": 66.004, +"end": 68.904 +}, +{ +"text": "ただ、", +"start": 69.1, +"end": 70.5 +}, +{ +"text": "これの手のひらに乗せられて、スートもちあげられた時、", +"start": 70.5, +"end": 74.792 +}, +{ +"text": "何だかふわふわした感じがあったばかりである。", +"start": 74.792, +"end": 78.47200000000001 +}, +{ +"text": "手のひらの上で少し落ち着いて小さいの顔を見たのが、いわゆる人間というものの見始めである。", +"start": 78.784, +"end": 86.696 +}, +{ +"text": "この時、みょうなものだと思った感じが今でも残っている。", +"start": 86.82000000000001, +"end": 92.22 +}, +{ +"text": "第1経を持って総職されべきはずの顔がツルツルして、", +"start": 92.60000000000001, +"end": 98.28 +}, +{ +"text": "まるでやかんだ。", +"start": 98.28, +"end": 100.424 +}, +{ +"text": "その後ネークをにもダイブロットが、", +"start": 100.58, +"end": 103.464 +}, +{ +"text": "この方々にはいいちどもでくぼしたことがない。", +"start": 103.464, +"end": 106.888 +}, +{ +"text": "飲みならず、", +"start": 106.888, +"end": 108.552 +}, +{ +"text": "顔の真ん中があまりにとっきしている。", +"start": 108.552, +"end": 111.752 +}, +{ +"text": "そうしてその穴の中から時々プープをとけむりを吹く、どうもむせっぽくて実によかった。", +"start": 111.752, +"end": 119.304 +}, +{ +"text": "これが人間ののむたばくと言うものであることはようやくこの頃しった。", +"start": 119.64, +"end": 125.992 +}, +{ +"text": "この小声の手のひらのうちで、", +"start": 126.8, +"end": 129.832 +}, +{ +"text": "シワラクはよい心持ちに座ってよかったが、", +"start": 129.832, +"end": 133.0 +}, +{ +"text": "シワラクすると非常な速力で運転しがじめと。", +"start": 133.0, +"end": 136.94 +}, +{ +"text": "女性が動くのか自分だけが動くのかわからないが、", +"start": 136.94, +"end": 142.024 +}, +{ +"text": "むやみに目がまわる、胸が悪くなる、", +"start": 142.024, +"end": 145.86399999999998 +}, +{ +"text": "当てたすからないと思っていると、どうさりと音がして目から火が出た。", +"start": 145.86399999999998, +"end": 151.72 +}, +{ +"text": "それもでは記憶しているのが、音は何のことやら、いくら考えがそうとしてもわからない。", +"start": 152.512, +"end": 159.81599999999997 +}, +{ +"text": "ふときがついてみると小声はいない。", +"start": 160.28799999999998, +"end": 163.84799999999998 +}, +{ +"text": "たくさんおったきょうだいが一匹も見えん。", +"start": 163.89999999999998, +"end": 167.92 +}, +{ +"text": "漢人の母を野菜すがとを隠してしまった。", +"start": 167.92, +"end": 171.208 +}, +{ +"text": "その上、今までのところと味がって、", +"start": 171.208, +"end": 175.07999999999998 +}, +{ +"text": "むやみに分かる。", +"start": 175.07999999999998, +"end": 176.7 +}, +{ +"text": "目を相手いられるくらいだ。", +"start": 176.7, +"end": 179.14399999999998 +}, +{ +"text": "ほとんの?", +"start": 179.232, +"end": 180.83999999999997 +}, +{ +"text": "なんでもう様子がおかしいと、のそのそ入だしてみると、非常に痛い。", +"start": 180.83999999999997, +"end": 186.83999999999997 +}, +{ +"text": "笑いは、", +"start": 186.83999999999997, +"end": 188.42399999999998 +}, +{ +"text": "我らの上から急にささらの中捨てられたのである。", +"start": 188.42399999999998, +"end": 192.87199999999999 +}, +{ +"text": "ようやくの思い出ささらおはい出すと、向こうに大きな行けがある。", +"start": 193.82, +"end": 199.5 +}, +{ +"text": "おがいは行けの前に座って、", +"start": 199.61999999999998, +"end": 202.16 +}, +{ +"text": "どうしたらよかろうと考えてみた。", +"start": 202.16, +"end": 204.85999999999999 +}, +{ +"text": "別に、これと言う分別も出ない。", +"start": 204.85999999999999, +"end": 207.976 +}, +{ +"text": "しばらくして、", +"start": 207.976, +"end": 209.60999999999999 +}, +{ +"text": "泣いたら寿生がまた迎えに来てくれるかと考えついた。", +"start": 209.60999999999999, +"end": 214.248 +}, +{ +"text": "ニャー ニャーと心身にあってみたが誰もこな", +"start": 214.83999999999997, +"end": 220.26 +}, +{ +"text": "そういう意見の上をさらさらと風が渡って日がくれかかる", +"start": 220.32, +"end": 225.92 +}, +{ +"text": "払が日常に減ってきた", +"start": 225.92, +"end": 228.28 +}, +{ +"text": " 泣きたくても声が出ない仕方がない", +"start": 228.28, +"end": 231.76399999999998 +}, +{ +"text": "何でもよいからクイモノのあるところまであること決心をして", +"start": 231.76399999999998, +"end": 236.08399999999997 +}, +{ +"text": "そろりそろりといけをひどりにも終わり始めた", +"start": 236.08399999999997, +"end": 240.39 +}, +{ +"text": "どうも日常にくるし", +"start": 240.39, +"end": 242.792 +}, +{ +"text": "そこを側にして無理やりに貼っていくと、", +"start": 242.792, +"end": 246.6 +}, +{ +"text": "ようやく残ることで、なんとなく人類のくそい所へと、", +"start": 246.6, +"end": 251.07999999999998 +}, +{ +"text": "ここへ入ったらどうにかなると思って、", +"start": 251.07999999999998, +"end": 254.72799999999998 +}, +{ +"text": "たけがきの崩れたあなから、とある天内にもぐり込んだ。", +"start": 254.72799999999998, +"end": 258.984 +}, +{ +"text": "エンは不信になもので、", +"start": 259.76, +"end": 262.344 +}, +{ +"text": "もしこのたけがきがやぶれていなかったなら、", +"start": 262.344, +"end": 266.056 +}, +{ +"text": "お母いらついに色ぼおにがししたとも知れんのである。", +"start": 266.056, +"end": 269.96 +}, +{ +"text": "いちじゅうのをかげとはよく行ったものだ。", +"start": 269.96, +"end": 273.384 +}, +{ +"text": "このかきでのあなは、こんにちにいたるまで、", +"start": 273.384, +"end": 276.744 +}, +{ +"text": " わま背側となりのみけを証問するとき", +"start": 276.744, +"end": 280.18 +}, +{ +"text": "の通路になっている。", +"start": 280.18, +"end": 282.05600000000004 +}, +{ +"text": "さて、", +"start": 283.296, +"end": 284.648 +}, +{ +"text": "やしきへはしのびこんなものの、", +"start": 284.648, +"end": 287.624 +}, +{ +"text": " これくろさきどうしていくわからな。", +"start": 287.624, +"end": 290.024 +}, +{ +"text": "そのうちに暮らくなる、ハラはヘル、", +"start": 290.024, +"end": 294.0 +}, +{ +"text": "サムサはサムし。", +"start": 294.0, +"end": 296.072 +}, +{ +"text": "雨が降ってくると優しまつで、もう一国も優良ができなくなった。", +"start": 296.072, +"end": 301.896 +}, +{ +"text": "仕事がないから、とにかく上がるくて温かそうな方へほうへと歩いていく。", +"start": 301.896, +"end": 307.88 +}, +{ +"text": "今から考えると、", +"start": 307.94, +"end": 310.12 +}, +{ +"text": "その時はすでに家のうちに入っておったのだ。", +"start": 310.12, +"end": 313.74 +}, +{ +"text": "ここではままはいは、可能初性以外の人間を二旦び見るべき被害に総ぐしたのである。", +"start": 313.74, +"end": 321.16 +}, +{ +"text": "第1にあったのがお散である これは前の女性より一緒を覧望な方", +"start": 322.48, +"end": 330.04 +}, +{ +"text": "で 笑いを見るやいなや", +"start": 330.04, +"end": 332.148 +}, +{ +"text": "生きなり首数字を使って思って放り出した いや これはダメだと思ったから", +"start": 332.148, +"end": 339.188 +}, +{ +"text": "目を眠って運を転に任せていた しかしひもじいのと寒いのにはどうしてもガマンができん", +"start": 339.188, +"end": 347.54 +}, +{ +"text": "この範囲は二度び、おさんの好きを見て大図来る範囲と、", +"start": 347.54, +"end": 351.88 +}, +{ +"text": "するとまもなくまた投げ出された。", +"start": 351.88, +"end": 355.144 +}, +{ +"text": "我が範囲は投げ出されては範囲に、", +"start": 355.32, +"end": 359.048 +}, +{ +"text": "範囲がっては投げ出され、", +"start": 359.048, +"end": 361.16 +}, +{ +"text": "何でも同じことを信号変繰り返したのを記憶している。", +"start": 361.16, +"end": 365.94 +}, +{ +"text": "その時に、おさんと言うものはつくづく嫌になった。", +"start": 365.98, +"end": 370.79200000000003 +}, +{ +"text": "この間を参の参望を抜すんでこの辺法をしてあってから、", +"start": 370.81600000000003, +"end": 375.49600000000004 +}, +{ +"text": "やっと胸の使えが降りた。", +"start": 375.49600000000004, +"end": 377.76800000000003 +}, +{ +"text": "おまえが最後に詰まみ出されようとした時に、このうちの主人が、想像し何だといいながら出てきた。", +"start": 378.28000000000003, +"end": 386.98400000000004 +}, +{ +"text": "技術をおまえをぶらさけて主人の方へ向けて、この家となしの子根本が、", +"start": 386.98400000000004, +"end": 393.44800000000004 +}, +{ +"text": "びくら出しても出しても、お題どころへあがってきてこまりますという。", +"start": 393.44800000000004, +"end": 398.696 +}, +{ +"text": "主人は、", +"start": 398.696, +"end": 400.136 +}, +{ +"text": "本の人の黒い毛をひねりながら、", +"start": 400.136, +"end": 402.56800000000004 +}, +{ +"text": "ワーハイの顔をしばらくながめておったが、やがて、", +"start": 402.56800000000004, +"end": 406.12 +}, +{ +"text": "そんなならうちへおいてやれ、", +"start": 406.12, +"end": 408.93600000000004 +}, +{ +"text": "といっとももう多くへほいってしまった。", +"start": 408.93600000000004, +"end": 411.976 +}, +{ +"text": "主人は、あまり口を聞かぬ人と見えた。", +"start": 412.28000000000003, +"end": 415.98 +}, +{ +"text": "技術はクエッス装に、", +"start": 416.288, +"end": 418.56800000000004 +}, +{ +"text": "お腹背を大袋へ放り出した。", +"start": 418.56800000000004, +"end": 420.808 +}, +{ +"text": "隠しては腹背は、", +"start": 421.04, +"end": 423.336 +}, +{ +"text": "すいにこのうちを自分の総理化と決めることにしたのでがる。", +"start": 423.336, +"end": 428.74 +}, +{ +"text": "ワガハイの主人はめったにワガハイと顔を合わせることがない、", +"start": 430.032, +"end": 435.576 +}, +{ +"text": "職業は共識だそうだ。", +"start": 435.74, +"end": 438.488 +}, +{ +"text": "学校から会えると収じつ詳細に入ったぎりほとんど出てくることがない。", +"start": 438.488, +"end": 444.728 +}, +{ +"text": "うちのものは大変の勉強化だと思っている。", +"start": 444.728, +"end": 448.44 +}, +{ +"text": "とにも勉強化であるかのこと組みせている。", +"start": 448.46000000000004, +"end": 452.152 +}, +{ +"text": "しかし実際は、", +"start": 452.2, +"end": 454.264 +}, +{ +"text": "うちのものが言うような勉弁化ではない。", +"start": 454.264, +"end": 457.81600000000003 +}, +{ +"text": "おまいは時々、死のびやしに彼の下さいを望いてみるが、 これはよく昼寝をしていることが、", +"start": 457.872, +"end": 465.432 +}, +{ +"text": "時々、読みかけてある本能へによだれを探している。", +"start": 465.432, +"end": 470.00800000000004 +}, +{ +"text": "彼は矢くで、ひふの色が探行食を起びて、", +"start": 470.00800000000004, +"end": 474.32800000000003 +}, +{ +"text": " 断力のないふかっぽつな小口を笑わしている。", +"start": 474.32800000000003, +"end": 477.88 +}, +{ +"text": "そのくせにおうめしをく、", +"start": 477.9, +"end": 480.824 +}, +{ +"text": " おうめしをくっとあとて、たこじやスターを絶を飲む。", +"start": 480.824, +"end": 485.19 +}, +{ +"text": "飲んだ後でしょもつを広げる", +"start": 485.19, +"end": 487.672 +}, +{ +"text": "二三ページ読むと寝むくなる", +"start": 487.672, +"end": 490.98 +}, +{ +"text": "ようだれを本の上たらす", +"start": 490.98, +"end": 493.58000000000004 +}, +{ +"text": "これが彼の前を繰り返すにっかである", +"start": 493.58000000000004, +"end": 496.84000000000003 +}, +{ +"text": "おがいはネクながら時々考えることがある", +"start": 497.584, +"end": 501.72 +}, +{ +"text": "教室というものは", +"start": 501.72, +"end": 503.98 +}, +{ +"text": "実に楽なものだ", +"start": 503.98, +"end": 506.0 +}, +{ +"text": "人間と生まれたら教室となるに限る", +"start": 506.0, +"end": 509.432 +}, +{ +"text": "こんなに寝ていてつとまるものなら", +"start": 509.432, +"end": 512.292 +}, +{ +"text": "名古にでもできぬことはないと。", +"start": 512.292, +"end": 515.192 +}, +{ +"text": "それでも主人に言わせると、教師ほど辛いものはないそうで、", +"start": 515.9200000000001, +"end": 520.952 +}, +{ +"text": "彼は友達が来るたびに何とかかんとか不平を並している。", +"start": 520.952, +"end": 525.944 +}, +{ +"text": "わがはいがこのうち薄み込んだ当時は、主人意外のものには鼻肌不人棒であった。", +"start": 526.6800000000001, +"end": 533.72 +}, +{ +"text": "どこへ行っても離つけられて、愛ってにしてくれてがなかった。", +"start": 533.96, +"end": 539.352 +}, +{ +"text": "以下に人長されなかったかは、本日にいたるまで、の毎歳つけてくれないのでもわかる。", +"start": 539.376, +"end": 546.936 +}, +{ +"text": "おままいはし方がないから、できる限り、", +"start": 546.98, +"end": 550.7760000000001 +}, +{ +"text": "おままいを入れてくれた主人のそばにいるかと伝えた。", +"start": 550.7760000000001, +"end": 554.456 +}, +{ +"text": "朝、", +"start": 554.66, +"end": 556.056 +}, +{ +"text": "主人が新聞を読む時は、", +"start": 556.056, +"end": 558.5840000000001 +}, +{ +"text": "このらず彼のひざの上に乗る。", +"start": 558.5840000000001, +"end": 561.4 +}, +{ +"text": "彼が昼寝をする時は、必ずその背中に乗る。", +"start": 561.4, +"end": 566.744 +}, +{ +"text": "これは、あながち主人が好きと言うわけではないの。", +"start": 566.744, +"end": 571.8 +}, +{ +"text": "別にかまいてがなかったからやむわへんのである。", +"start": 571.8, +"end": 575.704 +}, +{ +"text": "その後、いろいろ経験の上、", +"start": 575.94, +"end": 579.1 +}, +{ +"text": "朝は明日の上。", +"start": 579.1, +"end": 581.3 +}, +{ +"text": "夜は子たつの上。", +"start": 581.3, +"end": 583.02 +}, +{ +"text": "天気のよいひるはエンガワエンネることとした。", +"start": 583.02, +"end": 586.52 +}, +{ +"text": "しかし一番心持ちのいいのは、よに言ってここのうちの子どものネドクエンモグリコンで一緒にネることである。", +"start": 586.62, +"end": 596.46 +}, +{ +"text": "この子どもというのは、いつつと三つで夜になると二人が一つと越え入って、人前に寝る。", +"start": 596.72, +"end": 604.696 +}, +{ +"text": "お互いはいつでも、", +"start": 604.86, +"end": 606.8720000000001 +}, +{ +"text": "これらの中間におのれをいるべき様子を見え出して、", +"start": 606.8720000000001, +"end": 610.936 +}, +{ +"text": "どうにかこうに変わり込むのであるが、", +"start": 610.936, +"end": 613.944 +}, +{ +"text": "うんがるく子供の一人が目をさますが最後、大変なことになる。", +"start": 613.944, +"end": 619.12 +}, +{ +"text": "子供は、", +"start": 619.12, +"end": 620.5360000000001 +}, +{ +"text": "子供に小さい方が立ちが悪い。", +"start": 620.5360000000001, +"end": 623.096 +}, +{ +"text": "猫が来た猫が来たといって、", +"start": 623.096, +"end": 626.072 +}, +{ +"text": "ような彼でも何でも大きな声でなきだすので、", +"start": 626.072, +"end": 630.072 +}, +{ +"text": "すると、", +"start": 630.072, +"end": 631.544 +}, +{ +"text": "ルーの神経以弱性のシェジンは必ず面を探して、次の部屋から飛び出してくる。", +"start": 631.544, +"end": 638.74 +}, +{ +"text": "現に戦断ってなどは、ものさしで知りペタをひどく戦れた。", +"start": 638.74, +"end": 644.184 +}, +{ +"text": "お互いは、人間届きをして彼らを観察すればするほど彼らはわがまままなものだと断言せざるを得ないようになった。", +"start": 645.36, +"end": 656.12 +}, +{ +"text": "ことに、", +"start": 656.2, +"end": 657.624 +}, +{ +"text": "お互いが時々動勤する子供の時に立ってはゴンゴドを断である。", +"start": 657.624, +"end": 663.4159999999999 +}, +{ +"text": "自分の勝手の時を一応さかさにしたり。", +"start": 663.4200000000001, +"end": 667.2 +}, +{ +"text": "頭へ袋をかぶせたり、", +"start": 667.31, +"end": 670.16 +}, +{ +"text": "放り出したり、", +"start": 670.16, +"end": 671.36 +}, +{ +"text": " へっついの中へ押し込んだりする。", +"start": 671.36, +"end": 674.6 +}, +{ +"text": "しかも、", +"start": 674.6, +"end": 675.48 +}, +{ +"text": "ワワワハイの方で少しでも 手足をしようものなら、", +"start": 675.48, +"end": 679.2 +}, +{ +"text": "かなりそうがかりで おいまいして、白が良く合える。", +"start": 679.2, +"end": 682.86 +}, +{ +"text": "この間も、", +"start": 683.22, +"end": 684.984 +}, +{ +"text": "ちょっとたたびで 詰めおといだら、再くんが 非常に良かった。", +"start": 684.984, +"end": 688.9000000000001 +}, +{ +"text": "それから用意に じゃしきえいれない。", +"start": 688.9000000000001, +"end": 691.8 +}, +{ +"text": "だいどこののいたのまで、", +"start": 691.8, +"end": 694.232 +}, +{ +"text": "人が増えていてもいい、高平気なものである。", +"start": 694.232, +"end": 697.944 +}, +{ +"text": "わが配の存験する通じ向こうの白くんなとは、", +"start": 698.72, +"end": 702.648 +}, +{ +"text": "青たびごとに、人間ほどふ人状なものはないと言ってこらる。", +"start": 702.648, +"end": 708.344 +}, +{ +"text": "白くんは先日、たまのようなコネコを用意引き埋まれたのである。", +"start": 708.4000000000001, +"end": 713.52 +}, +{ +"text": "ところが、そこのうちの所性が、見かめにそいつを裏の意見を持っていって、", +"start": 713.52, +"end": 720.26 +}, +{ +"text": "用意式ながら捨ててきたそうだ。", +"start": 720.26, +"end": 722.616 +}, +{ +"text": "白くんは涙を生まして、", +"start": 722.616, +"end": 724.94 +}, +{ +"text": "その一部指示を話した上。", +"start": 724.94, +"end": 727.3520000000001 +}, +{ +"text": "どうしても、われらネコゾクが、", +"start": 727.3520000000001, +"end": 730.136 +}, +{ +"text": "親子の愛を全くして、", +"start": 730.136, +"end": 732.44 +}, +{ +"text": "美しい家族的生活をするには、", +"start": 732.44, +"end": 735.288 +}, +{ +"text": "人間と戦って、これを操めつせればならむと言われた。", +"start": 735.288, +"end": 740.312 +}, +{ +"text": "一位ちもったまの議論と思う。", +"start": 740.62, +"end": 743.928 +}, +{ +"text": "また、", +"start": 744.24, +"end": 745.5799999999999 +}, +{ +"text": "となりの見極くんなどは、", +"start": 745.5799999999999, +"end": 747.72 +}, +{ +"text": "人間が主要検討いうことを解していないといって、多いに踏んがいしている。", +"start": 747.72, +"end": 754.0799999999999 +}, +{ +"text": "ガンダいわれどづくかんでは、目指しのはたまでも、", +"start": 754.0799999999999, +"end": 758.232 +}, +{ +"text": "ボラのヘソでも、", +"start": 758.232, +"end": 759.8 +}, +{ +"text": "一番先に見つけたものが、これをくけんりがあるものとなっている。", +"start": 759.8, +"end": 764.54 +}, +{ +"text": "もし、相手がこの記憶を守らなければ、", +"start": 764.54, +"end": 768.504 +}, +{ +"text": "完略に訴えておいてくらいのものだ。", +"start": 768.504, +"end": 771.4480000000001 +}, +{ +"text": "しかるに、", +"start": 771.8199999999999, +"end": 773.4000000000001 +}, +{ +"text": "彼ら人間は後もこの感念がないと見えて、", +"start": 773.4000000000001, +"end": 777.34 +}, +{ +"text": "俺らが見つけたこちそうはこのらず彼らのために彼らのために役立つせられるのとやる。", +"start": 777.34, +"end": 783.8 +}, +{ +"text": "彼らはその距離を頼んで、", +"start": 783.8, +"end": 786.01 +}, +{ +"text": "生徒に五人が区域べきものを終わって住ましてい。", +"start": 786.01, +"end": 790.76 +}, +{ +"text": "白君は軍人の家により、", +"start": 790.94, +"end": 793.54 +}, +{ +"text": "見け君は大限の主人を持っている。", +"start": 793.54, +"end": 796.36 +}, +{ +"text": "おままいは教師の主に住んでいるだけ、", +"start": 796.36, +"end": 799.288 +}, +{ +"text": "こんなことに関すると両軍よりもむしろ、アクトに出やる。", +"start": 799.288, +"end": 804.0699999999999 +}, +{ +"text": "ただ、", +"start": 804.0699999999999, +"end": 805.02 +}, +{ +"text": "その日その日が、どうにかこうにかおくられればよい。", +"start": 805.02, +"end": 809.88 +}, +{ +"text": "いくら人間だって、そういつまでもさかえることもあるまい。", +"start": 809.88, +"end": 814.74 +}, +{ +"text": "まあ、きおまがく、", +"start": 814.74, +"end": 816.8240000000001 +}, +{ +"text": "猫の実説を待つないよから。", +"start": 816.8240000000001, +"end": 819.64 +}, +{ +"text": "わがままで思い出したから、", +"start": 821.5840000000001, +"end": 824.6320000000001 +}, +{ +"text": "ちょっとわが排のうちの主人がこのわがままで失敗した話をしよう。", +"start": 824.6320000000001, +"end": 829.656 +}, +{ +"text": "ガンライこの主人は何と言って一人すぐれてできることもないが。", +"start": 829.7760000000001, +"end": 835.3520000000001 +}, +{ +"text": "何でもよく手を出したまる。", +"start": 835.3520000000001, +"end": 837.86 +}, +{ +"text": "廃口をやってほととぎすえ通証をしたり", +"start": 837.86, +"end": 841.74 +}, +{ +"text": "信頼しを逃状を減したり", +"start": 841.74, +"end": 845.1 +}, +{ +"text": "間違いだらけの英文を書いたり", +"start": 845.1, +"end": 847.96 +}, +{ +"text": "時によると読みにこったり", +"start": 847.96, +"end": 851.24 +}, +{ +"text": "歌いを並ったり", +"start": 851.24, +"end": 853.26 +}, +{ +"text": "またあるときはバイオリンなどをブーブうならしたりするが", +"start": 853.26, +"end": 857.528 +}, +{ +"text": "昨日独なことにはどれもこれもものになってほら", +"start": 857.528, +"end": 861.496 +}, +{ +"text": "そのくせやり出すといじゃくのくせに嫌に寝死んだ", +"start": 861.496, +"end": 866.456 +}, +{ +"text": "効果の中で歌いを歌って、", +"start": 866.736, +"end": 869.944 +}, +{ +"text": "緊張で、効果先生とアダナをつけられているにも感説。", +"start": 869.944, +"end": 874.46 +}, +{ +"text": "一効平気なもので、", +"start": 874.46, +"end": 876.9200000000001 +}, +{ +"text": "やはり、", +"start": 876.9200000000001, +"end": 878.2 +}, +{ +"text": "これはタイラの胸も似てそうろうを繰り返している。", +"start": 878.2, +"end": 883.4480000000001 +}, +{ +"text": "みんなが、空は胸もりだーと吹き出すくらいである。", +"start": 883.4480000000001, +"end": 888.7 +} +], +"paragraphs": [ +"一", +"吾輩は猫である。名前はまだ無い。", +"どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。この書生というのは時々我々を捕えて煮て食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶だ。その後猫にもだいぶ逢ったがこんな片輪には一度も出会わした事がない。のみならず顔の真中があまりに突起している。そうしてその穴の中から時々ぷうぷうと煙を吹く。どうも咽せぽくて実に弱った。これが人間の飲む煙草というものである事はようやくこの頃知った。", +"この書生の掌の裏でしばらくはよい心持に坐っておったが、しばらくすると非常な速力で運転し始めた。書生が動くのか自分だけが動くのか分らないが無暗に眼が廻る。胸が悪くなる。到底助からないと思っていると、どさりと音がして眼から火が出た。それまでは記憶しているがあとは何の事やらいくら考え出そうとしても分らない。", +"ふと気が付いて見ると書生はいない。たくさんおった兄弟が一疋も見えぬ。肝心の母親さえ姿を隠してしまった。その上今までの所とは違って無暗に明るい。眼を明いていられぬくらいだ。はてな何でも容子がおかしいと、のそのそ這い出して見ると非常に痛い。吾輩は藁の上から急に笹原の中へ棄てられたのである。", +"ようやくの思いで笹原を這い出すと向うに大きな池がある。吾輩は池の前に坐ってどうしたらよかろうと考えて見た。別にこれという分別も出ない。しばらくして泣いたら書生がまた迎に来てくれるかと考え付いた。ニャー、ニャーと試みにやって見たが誰も来ない。そのうち池の上をさらさらと風が渡って日が暮れかかる。腹が非常に減って来た。泣きたくても声が出ない。仕方がない、何でもよいから食物のある所まであるこうと決心をしてそろりそろりと池を左りに廻り始めた。どうも非常に苦しい。そこを我慢して無理やりに這って行くとようやくの事で何となく人間臭い所へ出た。ここへ這入ったら、どうにかなると思って竹垣の崩れた穴から、とある邸内にもぐり込んだ。縁は不思議なもので、もしこの竹垣が破れていなかったなら、吾輩はついに路傍に餓死したかも知れんのである。一樹の蔭とはよく云ったものだ。この垣根の穴は今日に至るまで吾輩が隣家の三毛を訪問する時の通路になっている。さて邸へは忍び込んだもののこれから先どうして善いか分らない。そのうちに暗くなる、腹は減る、寒さは寒し、雨が降って来るという始末でもう一刻の猶予が出来なくなった。仕方がないからとにかく明るくて暖かそうな方へ方へとあるいて行く。今から考えるとその時はすでに家の内に這入っておったのだ。ここで吾輩は彼の書生以外の人間を再び見るべき機会に遭遇したのである。第一に逢ったのがおさんである。これは前の書生より一層乱暴な方で吾輩を見るや否やいきなり頸筋をつかんで表へ抛り出した。いやこれは駄目だと思ったから眼をねぶって運を天に任せていた。しかしひもじいのと寒いのにはどうしても我慢が出来ん。吾輩は再びおさんの隙を見て台所へ這い上った。すると間もなくまた投げ出された。吾輩は投げ出されては這い上り、這い上っては投げ出され、何でも同じ事を四五遍繰り返したのを記憶している。その時におさんと云う者はつくづくいやになった。この間おさんの三馬を偸んでこの返報をしてやってから、やっと胸の痞が下りた。吾輩が最後につまみ出されようとしたときに、この家の主人が騒々しい何だといいながら出て来た。下女は吾輩をぶら下げて主人の方へ向けてこの宿なしの小猫がいくら出しても出しても御台所へ上って来て困りますという。主人は鼻の下の黒い毛を撚りながら吾輩の顔をしばらく眺めておったが、やがてそんなら内へ置いてやれといったまま奥へ這入ってしまった。主人はあまり口を聞かぬ人と見えた。下女は口惜しそうに吾輩を台所へ抛り出した。かくして吾輩はついにこの家を自分の住家と極める事にしたのである。", +"吾輩の主人は滅多に吾輩と顔を合せる事がない。職業は教師だそうだ。学校から帰ると終日書斎に這入ったぎりほとんど出て来る事がない。家のものは大変な勉強家だと思っている。当人も勉強家であるかのごとく見せている。しかし実際はうちのものがいうような勤勉家ではない。吾輩は時々忍び足に彼の書斎を覗いて見るが、彼はよく昼寝をしている事がある。時々読みかけてある本の上に涎をたらしている。彼は胃弱で皮膚の色が淡黄色を帯びて弾力のない不活溌な徴候をあらわしている。その癖に大飯を食う。大飯を食った後でタカジヤスターゼを飲む。飲んだ後で書物をひろげる。二三ページ読むと眠くなる。涎を本の上へ垂らす。これが彼の毎夜繰り返す日課である。吾輩は猫ながら時々考える事がある。教師というものは実に楽なものだ。人間と生れたら教師となるに限る。こんなに寝ていて勤まるものなら猫にでも出来ぬ事はないと。それでも主人に云わせると教師ほどつらいものはないそうで彼は友達が来る度に何とかかんとか不平を鳴らしている。", +"吾輩がこの家へ住み込んだ当時は、主人以外のものにははなはだ不人望であった。どこへ行っても跳ね付けられて相手にしてくれ手がなかった。いかに珍重されなかったかは、今日に至るまで名前さえつけてくれないのでも分る。吾輩は仕方がないから、出来得る限り吾輩を入れてくれた主人の傍にいる事をつとめた。朝主人が新聞を読むときは必ず彼の膝の上に乗る。彼が昼寝をするときは必ずその背中に乗る。これはあながち主人が好きという訳ではないが別に構い手がなかったからやむを得んのである。その後いろいろ経験の上、朝は飯櫃の上、夜は炬燵の上、天気のよい昼は椽側へ寝る事とした。しかし一番心持の好いのは夜に入ってここのうちの小供の寝床へもぐり込んでいっしょにねる事である。この小供というのは五つと三つで夜になると二人が一つ床へ入って一間へ寝る。吾輩はいつでも彼等の中間に己れを容るべき余地を見出してどうにか、こうにか割り込むのであるが、運悪く小供の一人が眼を醒ますが最後大変な事になる。小供は――ことに小さい方が質がわるい――猫が来た猫が来たといって夜中でも何でも大きな声で泣き出すのである。すると例の神経胃弱性の主人は必ず眼をさまして次の部屋から飛び出してくる。現にせんだってなどは物指で尻ぺたをひどく叩かれた。", +"吾輩は人間と同居して彼等を観察すればするほど、彼等は我儘なものだと断言せざるを得ないようになった。ことに吾輩が時々同衾する小供のごときに至っては言語同断である。自分の勝手な時は人を逆さにしたり、頭へ袋をかぶせたり、抛り出したり、へっついの中へ押し込んだりする。しかも吾輩の方で少しでも手出しをしようものなら家内総がかりで追い廻して迫害を加える。この間もちょっと畳で爪を磨いだら細君が非常に怒ってそれから容易に座敷へ入れない。台所の板の間で他が顫えていても一向平気なものである。吾輩の尊敬する筋向の白君などは逢う度毎に人間ほど不人情なものはないと言っておらるる。白君は先日玉のような子猫を四疋産まれたのである。ところがそこの家の書生が三日目にそいつを裏の池へ持って行って四疋ながら棄てて来たそうだ。白君は涙を流してその一部始終を話した上、どうしても我等猫族が親子の愛を完くして美しい家族的生活をするには人間と戦ってこれを剿滅せねばならぬといわれた。一々もっともの議論と思う。また隣りの三毛君などは人間が所有権という事を解していないといって大に憤慨している。元来我々同族間では目刺の頭でも鰡の臍でも一番先に見付けたものがこれを食う権利があるものとなっている。もし相手がこの規約を守らなければ腕力に訴えて善いくらいのものだ。しかるに彼等人間は毫もこの観念がないと見えて我等が見付けた御馳走は必ず彼等のために掠奪せらるるのである。彼等はその強力を頼んで正当に吾人が食い得べきものを奪ってすましている。白君は軍人の家におり三毛君は代言の主人を持っている。吾輩は教師の家に住んでいるだけ、こんな事に関すると両君よりもむしろ楽天である。ただその日その日がどうにかこうにか送られればよい。いくら人間だって、そういつまでも栄える事もあるまい。まあ気を永く猫の時節を待つがよかろう。", +"我儘で思い出したからちょっと吾輩の家の主人がこの我儘で失敗した話をしよう。元来この主人は何といって人に勝れて出来る事もないが、何にでもよく手を出したがる。俳句をやってほととぎすへ投書をしたり、新体詩を明星へ出したり、間違いだらけの英文をかいたり、時によると弓に凝ったり、謡を習ったり、またあるときはヴァイオリンなどをブーブー鳴らしたりするが、気の毒な事には、どれもこれも物になっておらん。その癖やり出すと胃弱の癖にいやに熱心だ。後架の中で謡をうたって、近所で後架先生と渾名をつけられているにも関せず一向平気なもので、やはりこれは平の宗盛にて候を繰返している。みんながそら宗盛だと吹き出すくらいである。この主人がどういう考になったものか吾輩の住み込んでから一月ばかり後のある月の月給日に、大きな包みを提げてあわただしく帰って来た。何を買って来たのかと思うと水彩絵具と毛筆とワットマンという紙で今日から謡や俳句をやめて絵をかく決心と見えた。果して翌日から当分の間というものは毎日毎日書斎で昼寝もしないで絵ばかりかいている。しかしそのかき上げたものを見ると何をかいたものやら誰にも鑑定がつかない。当人もあまり甘くないと思ったものか、ある日その友人で美学とかをやっている人が来た時に下のような話をしているのを聞いた。", +"「どうも甘くかけないものだね。人のを見ると何でもないようだが自ら筆をとって見ると今更のようにむずかしく感ずる」これは主人の述懐である。なるほど詐りのない処だ。彼の友は金縁の眼鏡越に主人の顔を見ながら、「そう初めから上手にはかけないさ、第一室内の想像ばかりで画がかける訳のものではない。昔し以太利の大家アンドレア・デル・サルトが言った事がある。画をかくなら何でも自然その物を写せ。天に星辰あり。地に露華あり。飛ぶに禽あり。走るに獣あり。池に金魚あり。枯木に寒鴉あり。自然はこれ一幅の大活画なりと。どうだ君も画らしい画をかこうと思うならちと写生をしたら」", +"「へえアンドレア・デル・サルトがそんな事をいった事があるかい。ちっとも知らなかった。なるほどこりゃもっともだ。実にその通りだ」と主人は無暗に感心している。金縁の裏には嘲けるような笑が見えた。" +], +"transcript_clean": [ +"おでぃぶるでを届けします", +"夏めそせきん", +"笑いわねこでや", +"1", +"1", +"笑いわ猫でわる", +"名前わ戻ない", +"どこで生まれたかとんとけんとがつかな", +"何でも薄くらいじめじめしたところで", +"にゃにゃないていたことだけわ記憶している", +"をまいをこで保じめて人間と読者を見た", +"しかも後で聞くとそれわ少せという", +"人間銃で1番動作の種族でわったそうだ", +"この少せというのわ時我をつかまえて似てくという話で", +"しかしその当時わ何と言う考えもなかったから", +"別断を恐ろしいと思わなかった", +"ただ", +"これの手のひらに乗せられてすともちわげられた時", +"何だかふわふわした感じがわったばかりでわる。", +"手のひらの上で少し落ち着いて小さいの顔を見たのがいわゆる人間というもの見始めでわる。", +"この時みょうなものだと思った感じが今でも残っている。", +"第1経を持って総職されべきわずの顔がつるつるして", +"まるでやかんだ。", +"その後ねくをにもだいぶろっとが", +"この方にわいちどもでくぼしたことがない。", +"飲みならず", +"顔の真ん中がわまりにとっきしている。", +"そうしてその穴の中から時ぷをとけむりを吹くどうもむせっぽくて実によかった。", +"これが人間のむたばくと言うものでわることわようやくこの頃しった。", +"この小声の手のひらのうちで", +"しわらくわよい心持ちに座ってよかったが", +"しわらくすると非常な速力で運転しがじめと。", +"女性が動くのか自分だけが動くのかわからないが", +"むやみに目がまわる胸が悪くなる", +"当てたすからないと思っているとどうさりと音がして目から火が出た。", +"それもでわ記憶しているのが音わ何のことやらいくら考えがそうとしてもわからない。", +"ふときがついてみると小声わいない。", +"たくさんをったきょうだいが1匹も見えん。", +"漢人の母を野菜すがとを隠してしまった。", +"その上今までのところと味がって", +"むやみに分かる。", +"目を相手いられるくらいだ。", +"ほとんの", +"なんでもう様子がをかしいとのそのそ入だしてみると非常に痛い。", +"笑いわ", +"我らの上から急にさらの中捨てられたのでわる。", +"ようやくの思い出さらをわい出すと向こうに大きな行けがわる。", +"をがいわ行けの前に座って", +"どうしたらよかろうと考えてみた。", +"別にこれと言う分別も出ない。", +"しばらくして", +"泣いたら寿生がまた迎えに来てくれるかと考えついた。", +"にゃにゃと心身にわってみたが誰もこな", +"そういう意見の上をさらさらと風が渡って日がくれかる", +"払が日常に減ってきた", +"泣きたくても声が出ない仕方がない", +"何でもよいからくいものわるところまでわること決心をして", +"そろりそろりといけをひどりにも終わり始めた", +"どうも日常にくるし", +"そこを側にして無理やりに貼っていくと", +"ようやく残ることでなんとなく人類のくそい所えと", +"こえ入ったらどうにかなると思って", +"たけがきの崩れたわなからとわる天内にもぐり込んだ。", +"えんわ不信になもので", +"もしこのたけがきがやぶれていなかったなら", +"を母いらついに色ぼをにがしたとも知れんのでわる。", +"いちじゅうのをかげとわよく行ったものだ。", +"このかきでのわなわこんにちにいたるまで", +"わま背側となりのみけを証問するとき", +"の通路になっている。", +"さて", +"やしきえわしのびこんなもの", +"これくろさきどうしていくわからな。", +"そのうちに暮らくなるはらわへる", +"さむさわさむし。", +"雨が降ってくると優しまつでもう1国も優良ができなくなった。", +"仕事がないからとにかく上がるくて温かそうな方えほうえと歩いていく。", +"今から考えると", +"その時わすでに家のうちに入ってをったのだ。", +"こでわまわいわ可能初性以外の人間を2旦び見るべき被害に総ぐしたのでわる。", +"第1にわったのがを散でわるこれわ前の女性より1緒を覧望な方", +"で笑いを見るやいなや", +"生きなり首数字を使って思って放り出したいやこれわだめだと思ったから", +"目を眠って運を転に任せていたしかしひもじいのと寒いのにわどうしてもがまんができん", +"この範囲わ2度びをさんの好きを見て大図来る範囲と", +"するとまもなくまた投げ出された。", +"我が範囲わ投げ出されてわ範囲に", +"範囲がってわ投げ出され", +"何でも同じことを信号変繰り返したのを記憶している。", +"その時にをさんと言うものわつくづく嫌になった。", +"この間を3の3望を抜すんでこの辺法をしてわってから", +"やっと胸の使えが降りた。", +"をまえが最後に詰まみ出されようとした時にこのうちの主人が想像し何だといながら出てきた。", +"技術をまえをぶらさけて主人の方え向けてこの家となしの子根本が", +"びくら出しても出してもを題どころえわがってきてこまりますという。", +"主人わ", +"本の人の黒い毛をひねりながら", +"わはいの顔をしばらくながめてをったがやがて", +"そんならうちえをいてやれ", +"といっともう多くえほいってしまった。", +"主人わまり口を聞かぬ人と見えた。", +"技術わくえっす装に", +"を腹背を大袋え放り出した。", +"隠してわ腹背わ", +"すいにこのうちを自分の総理化と決めることにしたのでがる。", +"わがはいの主人わめったにわがはいと顔を合わせることがない", +"職業わ共識だそうだ。", +"学校から会えると収じつ詳細に入ったぎりほとんど出てくることがない。", +"うちのものわ大変の勉強化だと思っている。", +"とにも勉強化でわるかのこと組みせている。", +"しかし実際わ", +"うちのものが言うような勉弁化でわない。", +"をまいわ時死のびやしに彼の下さいを望いてみるがこれわよく昼寝をしていることが", +"時読みかけてわる本能えによだれを探している。", +"彼わ矢くでひふの色が探行食を起びて", +"断力のないふかっぽつな小口を笑わしている。", +"そのくせにをうめしをく", +"をうめしをくっとわとてたこじやすたを絶を飲む。", +"飲んだ後でしょもつを広げる", +"23ぺじ読むと寝むくなる", +"ようだれを本の上たらす", +"これが彼の前を繰り返すにっかでわる", +"をがいわねくながら時考えることがわる", +"教室というものわ", +"実に楽なものだ", +"人間と生まれたら教室となるに限る", +"こんなに寝ていてつとまるものなら", +"名古にでもできぬことわないと。", +"それでも主人に言わせると教師ほど辛いものわないそうで", +"彼わ友達が来るたびに何とかんとか不平を並している。", +"わがわいがこのうち薄み込んだ当時わ主人意外のものにわ鼻肌不人棒でわった。", +"どこえ行っても離つけられて愛ってにしてくれてがなかった。", +"以下に人長されなかったかわ本日にいたるまでの毎歳つけてくれないのでもわかる。", +"をまいわし方がないからできる限り", +"をまいを入れてくれた主人のそばにいるかと伝えた。", +"朝", +"主人が新聞を読む時わ", +"このらず彼のひざの上に乗る。", +"彼が昼寝をする時わ必ずその背中に乗る。", +"これわながち主人が好きと言うわけでわないの。", +"別にかまいてがなかったからやむわえんのでわる。", +"その後いろいろ経験の上", +"朝わ明日の上。", +"夜わ子たつの上。", +"天気のよいひるわえんがわえんねることした。", +"しかし1番心持ちのいのわよに言ってこのうちの子どものねどくえんもぐりこんで1緒にねることでわる。", +"この子どもというのわいつと3つで夜になると2人が1つと越え入って人前に寝る。", +"を互いわいつでも", +"これらの中間にをのれをいるべき様子を見え出して", +"どうにかこうに変わり込むのでわるが", +"うんがるく子供の1人が目をさますが最後大変なことになる。", +"子供わ", +"子供に小さい方が立ちが悪い。", +"猫が来た猫が来たといって", +"ような彼でも何でも大きな声でなきだすので", +"すると", +"るの神経以弱性のしぇじんわ必ず面を探して次の部屋から飛び出してくる。", +"現に戦断ってなどわものさしで知りぺたをひどく戦れた。", +"を互いわ人間届きをして彼らを観察すればするほど彼らわがまなものだと断言せざるを得ないようになった。", +"ことに", +"を互いが時動勤する子供の時に立ってわごんごどを断でわる。", +"自分の勝手の時を1応さかさにしたり。", +"頭え袋をかぶせたり", +"放り出したり", +"えっついの中え押し込んだりする。", +"しかも", +"わはいの方で少しでも手足をしようものなら", +"かなりそうがかりでをいまいして白が良く合える。", +"この間も", +"ちょっとたびで詰めをといだら再くんが非常に良かった。", +"それから用意にじゃしきえいれない。", +"だいどこのいたのまで", +"人が増えていてもい高平気なものでわる。", +"わが配の存験する通じ向こうの白くんなとわ", +"青たびごとに人間ほどふ人状なものわないと言ってこらる。", +"白くんわ先日たまのようなこねこを用意引き埋まれたのでわる。", +"ところがそこのうちの所性が見かめにそいつを裏の意見を持っていって", +"用意式ながら捨てきたそうだ。", +"白くんわ涙を生まして", +"その1部指示を話した上。", +"どうしてもわれらねこぞくが", +"親子の愛を全くして", +"美しい家族的生活をするにわ", +"人間と戦ってこれを操めつせればならむと言われた。", +"1位ちもったまの議論と思う。", +"また", +"となりの見極くんなどわ", +"人間が主要検討いうことを解していないといって多いに踏んがいしている。", +"がんだいわれどづくかんでわ目指しのわたまでも", +"ぼらのへそでも", +"1番先に見つけたものがこれをくけんりがわるものとなっている。", +"もし相手がこの記憶を守らなければ", +"完略に訴えてをいてくらいのものだ。", +"しかるに", +"彼ら人間わ後もこの感念がないと見えて", +"俺らが見つけたこちそうわこのらず彼らのために彼らのために役立つせられるのとやる。", +"彼らわその距離を頼んで", +"生徒に5人が区域べきものを終わって住ましてい。", +"白君わ軍人の家により", +"見け君わ大限の主人を持っている。", +"をまいわ教師の主に住んでいるだけ", +"こんなことに関すると両軍よりもむしろあくとに出やる。", +"ただ", +"その日その日がどうにかこうにかをくらればよい。", +"いくら人間だってそういつまでもさかえることもわるまい。", +"まわきをまがく", +"猫の実説を待つないよから。", +"わがまで思い出したから", +"ちょっとわが排のうちの主人がこのわがまで失敗した話をしよう。", +"がんらいこの主人わ何と言って1人すぐれてできることもないが。", +"何でもよく手を出したまる。", +"廃口をやってほとぎすえ通証をしたり", +"信頼しを逃状を減したり", +"間違いだらけの英文を書いたり", +"時によると読みにこったり", +"歌いを並ったり", +"またわるときわばいおりんなどをぶうならしたりするが", +"昨日独なことにわどれもこれものになってほら", +"そのくせやり出すといじゃくのくせに嫌に寝死んだ", +"効果の中で歌いを歌って", +"緊張で効果先生とあだなをつけられているにも感説。", +"1効平気なもので", +"やわり", +"これわたいらの胸も似てそうろうを繰り返している。", +"みんなが空わ胸もりだと吹き出すくらいでわる。" +], +"paragraphs_clean": [ +"1", +"吾輩わ猫でわる。名前わまだ無い。", +"どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でにゃにゃ泣いていた事だけわ記憶している。吾輩わこで始めて人間というものを見た。しかもわとで聞くとそれわ書生という人間中で1番獰悪な種族でわったそうだ。この書生というのわ時我を捕えて煮て食うという話でわる。しかしその当時わ何という考もなかったから別段恐しいとも思わなかった。ただ彼の掌に載せられてすと持ち上げられた時何だかふわふわした感じがわったばかりでわる。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というもの見始でわろう。この時妙なものだと思った感じが今でも残っている。第1毛をもって装飾されべきわずの顔がつるつるしてまるで薬缶だ。その後猫にもだいぶ逢ったがこんな片輪にわ1度も出会わした事がない。のみならず顔の真中がわまりに突起している。そうしてその穴の中から時ぷうぷうと煙を吹く。どうも咽せぽくて実に弱った。これが人間の飲む煙草というものでわる事わようやくこの頃知った。", +"この書生の掌の裏でしばらくわよい心持に坐ってをったがしばらくすると非常な速力で運転し始めた。書生が動くのか自分だけが動くのか分らないが無暗に眼が廻る。胸が悪くなる。到底助からないと思っているとどさりと音がして眼から火が出た。それまでわ記憶しているがわとわ何の事やらいくら考え出そうとしても分らない。", +"ふと気が付いて見ると書生わいない。たくさんをった兄弟が1疋も見えぬ。肝心の母親さえ姿を隠してしまった。その上今までの所とわ違って無暗に明るい。眼を明いていられぬくらいだ。わてな何でも容子がをかしいとのそのそ這い出して見ると非常に痛い。吾輩わ藁の上から急に笹原の中え棄てられたのでわる。", +"ようやくの思いで笹原を這い出すと向うに大きな池がわる。吾輩わ池の前に坐ってどうしたらよかろうと考えて見た。別にこれという分別も出ない。しばらくして泣いたら書生がまた迎に来てくれるかと考え付いた。にゃにゃと試みにやって見たが誰も来ない。そのうち池の上をさらさらと風が渡って日が暮れかる。腹が非常に減って来た。泣きたくても声が出ない。仕方がない何でもよいから食物のわる所までわるこうと決心をしてそろりそろりと池を左りに廻り始めた。どうも非常に苦しい。そこを我慢して無理やりに這って行くとようやくの事で何となく人間臭い所え出た。こえ這入ったらどうにかなると思って竹垣の崩れた穴からとわる邸内にもぐり込んだ。縁わ不思議なものでもしこの竹垣が破れていなかったなら吾輩わついに路傍に餓死したかも知れんのでわる。1樹の蔭とわよく云ったものだ。この垣根の穴わ今日に至るまで吾輩が隣家の3毛を訪問する時の通路になっている。さて邸えわ忍び込んだものこれから先どうして善いか分らない。そのうちに暗くなる腹わ減る寒さわ寒し雨が降って来るという始末でもう1刻の猶予が出来なくなった。仕方がないからとにかく明るくて暖かそうな方え方えとわるいて行く。今から考えるとその時わすでに家の内に這入ってをったのだ。こで吾輩わ彼の書生以外の人間を再び見るべき機会に遭遇したのでわる。第1に逢ったのがをさんでわる。これわ前の書生より1層乱暴な方で吾輩を見るや否やいきなり頸筋をつかんで表え抛り出した。いやこれわ駄目だと思ったから眼をねぶって運を天に任せていた。しかしひもじいのと寒いのにわどうしても我慢が出来ん。吾輩わ再びをさんの隙を見て台所え這い上った。すると間もなくまた投げ出された。吾輩わ投げ出されてわ這い上り這い上ってわ投げ出され何でも同じ事を45遍繰り返したのを記憶している。その時にをさんと云う者わつくづくいやになった。この間をさんの3馬を偸んでこの返報をしてやってからやっと胸の痞が下りた。吾輩が最後につまみ出されようとしたときにこの家の主人が騒しい何だといながら出て来た。下女わ吾輩をぶら下げて主人の方え向けてこの宿なしの小猫がいくら出しても出しても御台所え上って来て困りますという。主人わ鼻の下の黒い毛を撚りながら吾輩の顔をしばらく眺めてをったがやがてそんなら内え置いてやれといったま奥え這入ってしまった。主人わまり口を聞かぬ人と見えた。下女わ口惜しそうに吾輩を台所え抛り出した。かくして吾輩わついにこの家を自分の住家と極める事にしたのでわる。", +"吾輩の主人わ滅多に吾輩と顔を合せる事がない。職業わ教師だそうだ。学校から帰ると終日書斎に這入ったぎりほとんど出て来る事がない。家のものわ大変な勉強家だと思っている。当人も勉強家でわるかのごとく見せている。しかし実際わうちのものがいうような勤勉家でわない。吾輩わ時忍び足に彼の書斎を覗いて見るが彼わよく昼寝をしている事がわる。時読みかけてわる本の上に涎をたらしている。彼わ胃弱で皮膚の色が淡黄色を帯びて弾力のない不活溌な徴候をわらわしている。その癖に大飯を食う。大飯を食った後でたかじやすたぜを飲む。飲んだ後で書物をひろげる。23ぺじ読むと眠くなる。涎を本の上え垂らす。これが彼の毎夜繰り返す日課でわる。吾輩わ猫ながら時考える事がわる。教師というものわ実に楽なものだ。人間と生れたら教師となるに限る。こんなに寝ていて勤まるものなら猫にでも出来ぬ事わないと。それでも主人に云わせると教師ほどつらいものわないそうで彼わ友達が来る度に何とかんとか不平を鳴らしている。", +"吾輩がこの家え住み込んだ当時わ主人以外のものにわなわだ不人望でわった。どこえ行っても跳ね付けられて相手にしてくれ手がなかった。いかに珍重されなかったかわ今日に至るまで名前さえつけてくれないのでも分る。吾輩わ仕方がないから出来得る限り吾輩を入れてくれた主人の傍にいる事をつとめた。朝主人が新聞を読むときわ必ず彼の膝の上に乗る。彼が昼寝をするときわ必ずその背中に乗る。これわながち主人が好きという訳でわないが別に構い手がなかったからやむを得んのでわる。その後いろいろ経験の上朝わ飯櫃の上夜わ炬燵の上天気のよい昼わ椽側え寝る事とした。しかし1番心持の好いのわ夜に入ってこのうちの小供の寝床えもぐり込んでいっしょにねる事でわる。この小供というのわ5つと3つで夜になると2人が1つ床え入って1間え寝る。吾輩わいつでも彼等の中間に己れを容るべき余地を見出してどうにかこうにか割り込むのでわるが運悪く小供の1人が眼を醒ますが最後大変な事になる。小供わことに小さい方が質がわるい猫が来た猫が来たといって夜中でも何でも大きな声で泣き出すのでわる。すると例の神経胃弱性の主人わ必ず眼をさまして次の部屋から飛び出してくる。現にせんだってなどわ物指で尻ぺたをひどく叩かれた。", +"吾輩わ人間と同居して彼等を観察すればするほど彼等わ我儘なものだと断言せざるを得ないようになった。ことに吾輩が時同衾する小供のごときに至ってわ言語同断でわる。自分の勝手な時わ人を逆さにしたり頭え袋をかぶせたり抛り出したりえっついの中え押し込んだりする。しかも吾輩の方で少しでも手出しをしようものなら家内総がかりで追い廻して迫害を加える。この間もちょっと畳で爪を磨いだら細君が非常に怒ってそれから容易に座敷え入れない。台所の板の間で他が顫えていても1向平気なものでわる。吾輩の尊敬する筋向の白君などわ逢う度毎に人間ほど不人情なものわないと言ってをらる。白君わ先日玉のような子猫を4疋産まれたのでわる。ところがそこの家の書生が3日目にそいつを裏の池え持って行って4疋ながら棄て来たそうだ。白君わ涙を流してその1部始終を話した上どうしても我等猫族が親子の愛を完くして美しい家族的生活をするにわ人間と戦ってこれを剿滅せねばならぬといわれた。1もっともの議論と思う。また隣りの3毛君などわ人間が所有権という事を解していないといって大に憤慨している。元来我同族間でわ目刺の頭でも鰡の臍でも1番先に見付けたものがこれを食う権利がわるものとなっている。もし相手がこの規約を守らなければ腕力に訴えて善いくらいのものだ。しかるに彼等人間わ毫もこの観念がないと見えて我等が見付けた御馳走わ必ず彼等のために掠奪せらるのでわる。彼等わその強力を頼んで正当に吾人が食い得べきものを奪ってすましている。白君わ軍人の家にをり3毛君わ代言の主人を持っている。吾輩わ教師の家に住んでいるだけこんな事に関すると両君よりもむしろ楽天でわる。ただその日その日がどうにかこうにか送らればよい。いくら人間だってそういつまでも栄える事もわるまい。まわ気を永く猫の時節を待つがよかろう。", +"我儘で思い出したからちょっと吾輩の家の主人がこの我儘で失敗した話をしよう。元来この主人わ何といって人に勝れて出来る事もないが何にでもよく手を出したがる。俳句をやってほとぎすえ投書をしたり新体詩を明星え出したり間違いだらけの英文をかいたり時によると弓に凝ったり謡を習ったりまたわるときわゔぁいおりんなどをぶ鳴らしたりするが気の毒な事にわどれもこれも物になってをらん。その癖やり出すと胃弱の癖にいやに熱心だ。後架の中で謡をうたって近所で後架先生と渾名をつけられているにも関せず1向平気なものでやわりこれわ平の宗盛にて候を繰返している。みんながそら宗盛だと吹き出すくらいでわる。この主人がどういう考になったものか吾輩の住み込んでから1月ばかり後のわる月の月給日に大きな包みを提げてわただしく帰って来た。何を買って来たのかと思うと水彩絵具と毛筆とわっとまんという紙で今日から謡や俳句をやめて絵をかく決心と見えた。果して翌日から当分の間というものわ毎日毎日書斎で昼寝もしないで絵ばかりかいている。しかしそのかき上げたものを見ると何をかいたものやら誰にも鑑定がつかない。当人もわまり甘くないと思ったものかわる日その友人で美学とかをやっている人が来た時に下のような話をしているのを聞いた。", +"どうも甘くかけないものだね。人のを見ると何でもないようだが自ら筆をとって見ると今更のようにむずかしく感ずるこれわ主人の述懐でわる。なるほど詐りのない処だ。彼の友わ金縁の眼鏡越に主人の顔を見ながらそう初めから上手にわかけないさ第1室内の想像ばかりで画がかける訳のものでわない。昔し以太利の大家あんどれあでるさるとが言った事がわる。画をかくなら何でも自然その物を写せ。天に星辰わり。地に露華わり。飛ぶに禽わり。走るに獣わり。池に金魚わり。枯木に寒鴉わり。自然わこれ1幅の大活画なりと。どうだ君も画らしい画をかこうと思うならちと写生をしたら", +"えあんどれあでるさるとがそんな事をいった事がわるかい。ちっとも知らなかった。なるほどこりゃもっともだ。実にその通りだと主人わ無暗に感心している。金縁の裏にわ嘲けるような笑が見えた。" +], +"score": 1691.2000000000432, +"coords": [ +[ +0, +0, +8, +9, +12, +13, +16, +17, +21, +21, +27, +27, +32, +33, +38, +38, +46, +46, +57, +57, +73, +73, +79, +81, +86, +87, +90, +91, +122, +123, +135, +135, +140, +141, +147, +150, +163, +163, +171, +171, +173, +173, +176, +177, +183, +184, +186, +186, +188, +188, +227, +227, +238, +238, +260, +260, +262, +263, +268, +268, +316, +316, +323, +323, +334, +336, +340, +340, +348, +348, +361, +361, +367, +367, +386, +388, +391, +391, +395, +396, +401, +401, +406, +406, +416, +417, +418, +418, +428, +428, +448, +448, +459, +459, +463, +463, +483, +483, +503, +503, +508, +508, +513, +513, +515, +516, +538, +538, +564, +564, +565, +566, +570, +570, +585, +585, +614, +614, +628, +628, +648, +648, +654, +654, +657, +657, +659, +660, +663, +664, +675, +675, +681, +681, +693, +694, +710, +710, +721, +722, +749, +749, +754, +754, +759, +759, +762, +762, +815, +815, +847, +849, +850, +850, +873, +874, +884, +885, +896, +897, +909, +909, +914, +914, +920, +921, +934, +934, +936, +936, +939, +939, +944, +945, +951, +951, +953, +955, +977, +977, +980, +980, +985, +985, +990, +992, +995, +996, +1010, +1010, +1016, +1016, +1032, +1032, +1048, +1048, +1058, +1058, +1064, +1064, +1067, +1068, +1081, +1081, +1084, +1084, +1098, +1098, +1101, +1101, +1106, +1106, +1110, +1110, +1123, +1123, +1136, +1136, +1139, +1139, +1148, +1148, +1155, +1156, +1157, +1157, +1158, +1159, +1161, +1162, +1168, +1168, +1172, +1172, +1176, +1176, +1179, +1179, +1181, +1181, +1221, +1221, +1232, +1232, +1235, +1236, +1258, +1258, +1260, +1261, +1272, +1272, +1285, +1285, +1312, +1313, +1317, +1318, +1328, +1328, +1340, +1340, +1346, +1346, +1360, +1361, +1377, +1378, +1390, +1391, +1410, +1410, +1416, +1416, +1420, +1420, +1426, +1426, +1430, +1432, +1455, +1455, +1465, +1466, +1485, +1485, +1514, +1514, +1520, +1521, +1531, +1532, +1537, +1537, +1557, +1557, +1563, +1563, +1580, +1581, +1585, +1585, +1590, +1590, +1592, +1593, +1626, +1626, +1630, +1630, +1644, +1644, +1648, +1648, +1653, +1653, +1672, +1672, +1677, +1677, +1686, +1686, +1700, +1700, +1710, +1710, +1748, +1748, +1760, +1761, +1764, +1764, +1772, +1772, +1777, +1777, +1783, +1783, +1792, +1792, +1798, +1798, +1801, +1801, +1807, +1807, +1809, +1809, +1813, +1814, +1828, +1828, +1831, +1831, +1836, +1837, +1850, +1850, +1855, +1855, +1911, +1912, +1913, +1913, +1919, +1919, +1923, +1923, +1925, +1925, +1929, +1929, +1938, +1938, +1949, +1949, +1951, +1954, +1966, +1966, +1968, +1969, +1997, +1997, +2004, +2005, +2014, +2014, +2016, +2016, +2019, +2019, +2021, +2022, +2027, +2027, +2036, +2036, +2046, +2046, +2049, +2050, +2053, +2054, +2061, +2061, +2065, +2065, +2071, +2072, +2075, +2076, +2087, +2087, +2096, +2096, +2104, +2104, +2108, +2109, +2124, +2125, +2129, +2129, +2140, +2141, +2149, +2149, +2156, +2156, +2163, +2163, +2185, +2186, +2203, +2203, +2214, +2215, +2221, +2221, +2245, +2246, +2263, +2264, +2270, +2270, +2300, +2300, +2304, +2305, +2318, +2318, +2321, +2321, +2331, +2332, +2337, +2337, +2349, +2349, +2353, +2355, +2357, +2357, +2369, +2370, +2372, +2372, +2376, +2376, +2390, +2391, +2417, +2417, +2422, +2422, +2425, +2425, +2462, +2462, +2464, +2464, +2468, +2468, +2473, +2473, +2475, +2475, +2478, +2478, +2492, +2492, +2493, +2494, +2507, +2507, +2510, +2510, +2513, +2513, +2519, +2521, +2526, +2526, +2533, +2533, +2556, +2556, +2567, +2567, +2574, +2574, +2580, +2580, +2591, +2591, +2611, +2611, +2631, +2631, +2647, +2647, +2649, +2650, +2652, +2652, +2664, +2664, +2682, +2685, +2696, +2696, +2703, +2704, +2723, +2724, +2731, +2731, +2734, +2734, +2741, +2742, +2746, +2746, +2797, +2797, +2808, +2810, +2816, +2816, +2831, +2833, +2834, +2834, +2840, +2840, +2874, +2874, +2884, +2885, +2894, +2894, +2903, +2903, +2906, +2906, +2921, +2921, +2923, +2923, +2929, +2929, +2935, +2935, +2937, +2937, +2945, +2945, +2953, +2953, +2956, +2956, +2979, +2979, +2986, +2986, +2988, +2988, +2990, +2990, +2994, +2994, +3021, +3021, +3025, +3025, +3030, +3030, +3033, +3033, +3051, +3051, +3066, +3066, +3074, +3074, +3088, +3088, +3092, +3092, +3106, +3106, +3111, +3111, +3147, +3147, +3162, +3162, +3175, +3175, +3178, +3178, +3193, +3193, +3205, +3205, +3207, +3207, +3214, +3214, +3223, +3223, +3225, +3225, +3228, +3228, +3230, +3230, +3287, +3287, +3324, +3324, +3328, +3328, +3336, +3336, +3340, +3340, +3363, +3364, +3371, +3371, +3379, +3380, +3407, +3407, +3425, +3425, +3439, +3439, +3462, +3462, +3484, +3484, +3487, +3487, +3498, +3498, +3507, +3507, +3510, +3511, +3513, +3513, +3527, +3527, +3530, +3530, +3537, +3537, +3550, +3550, +3562, +3562, +3570, +3570, +3575, +3575, +3576, +3577, +3636, +3636, +3642, +3642, +3655, +3656, +3665, +3665, +3677, +3677, +3693, +3695, +3697, +3697, +3703, +3703, +3706, +3706, +3708, +3709, +3711, +3711, +3714, +3715, +3720, +3720, +3722, +3723, +3734, +3734, +3763, +3763, +3769, +3769, +3772, +3772, +3782, +3782, +3798, +4406, +4407 +], +[ +0, +26, +34, +34, +37, +37, +40, +40, +44, +45, +51, +52, +57, +57, +62, +63, +71, +73, +84, +85, +101, +102, +108, +108, +113, +113, +116, +116, +147, +147, +159, +161, +166, +166, +172, +172, +185, +186, +194, +195, +197, +198, +201, +201, +207, +207, +209, +212, +214, +215, +254, +257, +268, +269, +291, +292, +294, +294, +299, +301, +349, +350, +357, +359, +370, +370, +374, +375, +383, +384, +397, +398, +404, +405, +424, +424, +427, +429, +433, +433, +438, +439, +444, +445, +455, +455, +456, +457, +467, +468, +488, +492, +503, +504, +508, +509, +529, +530, +550, +551, +556, +557, +562, +563, +565, +565, +587, +588, +614, +615, +616, +616, +620, +621, +636, +637, +666, +669, +683, +685, +705, +707, +713, +714, +717, +718, +720, +720, +723, +723, +734, +736, +742, +743, +755, +755, +771, +772, +783, +783, +810, +811, +816, +817, +822, +823, +826, +827, +880, +881, +913, +913, +914, +915, +938, +938, +948, +948, +959, +959, +971, +972, +977, +979, +985, +985, +998, +999, +1001, +1002, +1005, +1007, +1012, +1012, +1018, +1019, +1021, +1021, +1043, +1045, +1048, +1049, +1054, +1056, +1061, +1061, +1064, +1064, +1078, +1080, +1086, +1087, +1103, +1104, +1120, +1123, +1133, +1134, +1140, +1141, +1144, +1144, +1157, +1160, +1163, +1165, +1179, +1180, +1183, +1184, +1189, +1192, +1196, +1198, +1211, +1212, +1225, +1227, +1230, +1231, +1240, +1241, +1248, +1248, +1249, +1251, +1252, +1252, +1254, +1254, +1260, +1261, +1265, +1266, +1270, +1271, +1274, +1275, +1277, +1278, +1318, +1319, +1330, +1331, +1334, +1334, +1356, +1357, +1359, +1359, +1370, +1372, +1385, +1386, +1413, +1413, +1417, +1417, +1427, +1428, +1440, +1441, +1447, +1448, +1462, +1462, +1478, +1478, +1490, +1490, +1509, +1510, +1516, +1517, +1521, +1522, +1528, +1529, +1533, +1533, +1556, +1558, +1568, +1568, +1587, +1588, +1617, +1618, +1624, +1624, +1634, +1634, +1639, +1640, +1660, +1661, +1667, +1668, +1685, +1685, +1689, +1690, +1695, +1696, +1698, +1698, +1731, +1732, +1736, +1737, +1751, +1753, +1757, +1758, +1763, +1764, +1783, +1784, +1789, +1790, +1799, +1800, +1814, +1815, +1825, +1827, +1865, +1866, +1878, +1878, +1881, +1882, +1890, +1891, +1896, +1897, +1903, +1904, +1913, +1915, +1921, +1922, +1925, +1927, +1933, +1934, +1936, +1937, +1941, +1941, +1955, +1956, +1959, +1960, +1965, +1965, +1978, +1979, +1984, +1985, +2041, +2041, +2042, +2043, +2049, +2050, +2054, +2055, +2057, +2058, +2062, +2063, +2072, +2073, +2084, +2085, +2087, +2087, +2099, +2101, +2103, +2103, +2131, +2133, +2140, +2140, +2149, +2150, +2152, +2154, +2157, +2158, +2160, +2160, +2165, +2166, +2175, +2176, +2186, +2188, +2191, +2191, +2194, +2194, +2201, +2202, +2206, +2208, +2214, +2214, +2217, +2217, +2228, +2229, +2238, +2239, +2247, +2248, +2252, +2252, +2267, +2267, +2271, +2272, +2283, +2283, +2291, +2292, +2299, +2300, +2307, +2308, +2330, +2330, +2347, +2348, +2359, +2359, +2365, +2367, +2391, +2391, +2408, +2408, +2414, +2415, +2445, +2446, +2450, +2450, +2463, +2464, +2467, +2468, +2478, +2478, +2483, +2484, +2496, +2497, +2501, +2501, +2503, +2504, +2516, +2516, +2518, +2520, +2524, +2525, +2539, +2539, +2565, +2566, +2571, +2572, +2575, +2576, +2613, +2614, +2616, +2617, +2621, +2622, +2627, +2628, +2630, +2632, +2635, +2636, +2650, +2651, +2652, +2652, +2665, +2666, +2669, +2670, +2673, +2674, +2680, +2680, +2685, +2686, +2693, +2694, +2717, +2718, +2729, +2730, +2737, +2738, +2744, +2745, +2756, +2757, +2777, +2779, +2799, +2800, +2816, +2817, +2819, +2819, +2821, +2822, +2834, +2836, +2854, +2854, +2865, +2867, +2874, +2874, +2893, +2893, +2900, +2902, +2905, +2906, +2913, +2913, +2917, +2918, +2969, +2970, +2981, +2981, +2987, +2989, +3004, +3004, +3005, +3008, +3014, +3015, +3049, +3050, +3060, +3060, +3069, +3071, +3080, +3081, +3084, +3085, +3100, +3101, +3103, +3104, +3110, +3111, +3117, +3118, +3120, +3121, +3129, +3131, +3139, +3141, +3144, +3145, +3168, +3169, +3176, +3177, +3179, +3181, +3183, +3184, +3188, +3189, +3216, +3217, +3221, +3222, +3227, +3228, +3231, +3233, +3251, +3252, +3267, +3268, +3276, +3277, +3291, +3292, +3296, +3297, +3311, +3312, +3317, +3320, +3356, +3357, +3372, +3374, +3387, +3388, +3391, +3392, +3407, +3408, +3420, +3421, +3423, +3425, +3432, +3437, +3446, +3447, +3449, +3451, +3454, +3455, +3457, +3458, +3515, +3516, +3553, +3554, +3558, +3560, +3568, +3575, +3579, +3580, +3603, +3603, +3610, +3611, +3619, +3619, +3646, +3647, +3665, +3666, +3680, +3682, +3705, +3706, +3728, +3729, +3732, +3733, +3744, +3745, +3754, +3755, +3758, +3758, +3760, +3761, +3775, +3776, +3779, +3780, +3787, +3788, +3801, +3803, +3815, +3816, +3824, +3825, +3830, +3831, +3832, +3832, +3891, +3892, +3898, +3899, +3912, +3912, +3921, +3922, +3934, +3935, +3951, +3951, +3953, +3954, +3960, +3962, +3965, +3966, +3968, +3968, +3970, +3971, +3974, +3974, +3979, +3980, +3982, +3982, +3993, +3994, +4023, +4025, +4031, +4034, +4037, +4038, +4048, +4049, +4065, +4065, +4066 +] +], +"after_align_sub": [ +[ +[ +0, +1, +4 +] +], +[ +[ +0, +0, +4 +], +[ +0, +7, +5 +], +[ +7, +16, +6 +] +], +[ +[ +0, +17, +7 +], +[ +17, +31, +8 +], +[ +31, +50, +9 +], +[ +50, +69, +10 +], +[ +69, +87, +11 +], +[ +87, +105, +12 +], +[ +105, +130, +13 +], +[ +130, +153, +14 +], +[ +153, +166, +15 +], +[ +166, +169, +16 +], +[ +169, +188, +17 +], +[ +188, +210, +18 +], +[ +210, +248, +19 +], +[ +248, +272, +20 +], +[ +272, +296, +21 +], +[ +296, +303, +22 +], +[ +303, +316, +23 +], +[ +316, +336, +24 +], +[ +336, +341, +25 +], +[ +341, +357, +26 +], +[ +357, +393, +27 +], +[ +393, +424, +28 +] +], +[ +[ +0, +0, +28 +], +[ +0, +9, +29 +], +[ +9, +26, +30 +], +[ +26, +46, +31 +], +[ +46, +67, +32 +], +[ +67, +81, +33 +], +[ +81, +112, +34 +], +[ +112, +149, +35 +] +], +[ +[ +0, +0, +35 +], +[ +0, +17, +36 +], +[ +17, +34, +37 +], +[ +34, +51, +38 +], +[ +51, +64, +39 +], +[ +64, +71, +40 +], +[ +71, +85, +41 +], +[ +85, +87, +42 +], +[ +87, +117, +43 +], +[ +117, +120, +44 +], +[ +120, +142, +45 +] +], +[ +[ +0, +0, +45 +], +[ +0, +27, +46 +], +[ +27, +37, +47 +], +[ +37, +53, +48 +], +[ +53, +67, +49 +], +[ +67, +73, +50 +], +[ +73, +97, +51 +], +[ +97, +115, +52 +], +[ +115, +141, +53 +], +[ +141, +152, +54 +], +[ +152, +170, +55 +], +[ +170, +195, +56 +], +[ +195, +212, +57 +], +[ +212, +221, +58 +], +[ +221, +241, +59 +], +[ +241, +261, +60 +], +[ +261, +278, +61 +], +[ +278, +300, +62 +], +[ +300, +309, +63 +], +[ +309, +326, +64 +], +[ +326, +349, +65 +], +[ +349, +364, +66 +], +[ +364, +378, +67 +], +[ +378, +392, +68 +], +[ +392, +402, +69 +], +[ +402, +404, +70 +], +[ +404, +414, +71 +], +[ +414, +431, +72 +], +[ +431, +444, +73 +], +[ +444, +449, +74 +], +[ +449, +478, +75 +], +[ +478, +510, +76 +], +[ +510, +517, +77 +], +[ +517, +538, +78 +], +[ +538, +571, +79 +], +[ +571, +601, +80 +], +[ +601, +610, +81 +], +[ +610, +643, +82 +], +[ +643, +684, +83 +], +[ +684, +707, +84 +], +[ +707, +723, +85 +], +[ +723, +737, +86 +], +[ +737, +748, +87 +], +[ +748, +772, +88 +], +[ +772, +795, +89 +], +[ +795, +820, +90 +], +[ +820, +831, +91 +], +[ +831, +873, +92 +], +[ +873, +901, +93 +], +[ +901, +929, +94 +], +[ +929, +932, +95 +], +[ +932, +945, +96 +], +[ +945, +964, +97 +], +[ +964, +975, +98 +], +[ +975, +991, +99 +], +[ +991, +1007, +100 +], +[ +1007, +1016, +101 +], +[ +1016, +1028, +102 +], +[ +1028, +1035, +103 +], +[ +1035, +1060, +104 +] +], +[ +[ +0, +0, +104 +], +[ +0, +21, +105 +], +[ +21, +32, +106 +], +[ +32, +63, +107 +], +[ +63, +82, +108 +], +[ +82, +102, +109 +], +[ +102, +108, +110 +], +[ +108, +127, +111 +], +[ +127, +159, +112 +], +[ +159, +183, +113 +], +[ +183, +200, +114 +], +[ +200, +220, +115 +], +[ +220, +227, +116 +], +[ +227, +249, +117 +], +[ +249, +261, +118 +], +[ +261, +273, +119 +], +[ +273, +283, +120 +], +[ +283, +300, +121 +], +[ +300, +316, +122 +], +[ +316, +325, +123 +], +[ +325, +332, +124 +], +[ +332, +348, +125 +], +[ +348, +364, +126 +], +[ +364, +377, +127 +], +[ +377, +404, +128 +], +[ +404, +429, +129 +] +], +[ +[ +0, +0, +129 +], +[ +0, +35, +130 +], +[ +35, +63, +131 +], +[ +63, +100, +132 +], +[ +100, +116, +133 +], +[ +116, +139, +134 +], +[ +139, +140, +135 +], +[ +140, +151, +136 +], +[ +151, +162, +137 +], +[ +162, +182, +138 +], +[ +182, +202, +139 +], +[ +202, +224, +140 +], +[ +224, +235, +141 +], +[ +235, +241, +142 +], +[ +241, +247, +143 +], +[ +247, +264, +144 +], +[ +264, +310, +145 +], +[ +310, +346, +146 +], +[ +346, +353, +147 +], +[ +353, +373, +148 +], +[ +373, +390, +149 +], +[ +390, +415, +150 +], +[ +415, +418, +151 +], +[ +418, +431, +152 +], +[ +431, +443, +153 +], +[ +443, +461, +154 +], +[ +461, +467, +155 +], +[ +467, +500, +156 +], +[ +500, +525, +157 +] +], +[ +[ +0, +0, +157 +], +[ +0, +48, +158 +], +[ +48, +51, +159 +], +[ +51, +78, +160 +], +[ +78, +94, +161 +], +[ +94, +103, +162 +], +[ +103, +109, +163 +], +[ +109, +125, +164 +], +[ +125, +128, +165 +], +[ +128, +148, +166 +], +[ +148, +167, +167 +], +[ +167, +171, +168 +], +[ +171, +192, +169 +], +[ +192, +207, +170 +], +[ +207, +214, +171 +], +[ +214, +233, +172 +], +[ +233, +248, +173 +], +[ +248, +274, +174 +], +[ +274, +298, +175 +], +[ +298, +328, +176 +], +[ +328, +341, +177 +], +[ +341, +349, +178 +], +[ +349, +360, +179 +], +[ +360, +370, +180 +], +[ +370, +379, +181 +], +[ +379, +392, +182 +], +[ +392, +415, +183 +], +[ +415, +427, +184 +], +[ +427, +429, +185 +], +[ +429, +438, +186 +], +[ +438, +468, +187 +], +[ +468, +482, +188 +], +[ +482, +487, +189 +], +[ +487, +517, +190 +], +[ +517, +533, +191 +], +[ +533, +549, +192 +], +[ +549, +553, +193 +], +[ +553, +571, +194 +], +[ +571, +600, +195 +], +[ +600, +611, +196 +], +[ +611, +635, +197 +], +[ +635, +645, +198 +], +[ +645, +661, +199 +], +[ +661, +676, +200 +], +[ +676, +699, +201 +], +[ +699, +701, +202 +], +[ +701, +723, +203 +], +[ +723, +748, +204 +], +[ +748, +754, +205 +], +[ +754, +767, +206 +] +], +[ +[ +0, +0, +206 +], +[ +0, +10, +207 +], +[ +10, +37, +208 +], +[ +37, +62, +209 +], +[ +62, +76, +210 +], +[ +76, +93, +211 +], +[ +93, +104, +212 +], +[ +104, +118, +213 +], +[ +118, +129, +214 +], +[ +129, +135, +215 +], +[ +135, +160, +216 +], +[ +160, +180, +217 +], +[ +180, +201, +218 +], +[ +201, +213, +219 +], +[ +213, +236, +220 +], +[ +236, +244, +221 +], +[ +244, +247, +222 +], +[ +247, +265, +223 +], +[ +265, +537, +224 +] +], +[ +[ +0, +267, +224 +] +], +[ +[ +0, +90, +224 +] +] +], +"after_fix": [ +[ +[ +0, +1, +4 +] +], +[ +[ +0, +0, +4 +], +[ +0, +7, +5 +], +[ +7, +16, +6 +] +], +[ +[ +0, +17, +7 +], +[ +17, +31, +8 +], +[ +31, +52, +9 +], +[ +52, +72, +10 +], +[ +72, +90, +11 +], +[ +90, +108, +12 +], +[ +108, +135, +13 +], +[ +135, +158, +14 +], +[ +158, +171, +15 +], +[ +171, +174, +16 +], +[ +174, +194, +17 +], +[ +194, +216, +18 +], +[ +216, +255, +19 +], +[ +255, +279, +20 +], +[ +279, +303, +21 +], +[ +303, +310, +22 +], +[ +310, +323, +23 +], +[ +323, +343, +24 +], +[ +343, +348, +25 +], +[ +348, +364, +26 +], +[ +364, +401, +27 +], +[ +401, +432, +28 +] +], +[ +[ +0, +0, +28 +], +[ +0, +9, +29 +], +[ +9, +27, +30 +], +[ +27, +47, +31 +], +[ +47, +68, +32 +], +[ +68, +82, +33 +], +[ +82, +114, +34 +], +[ +114, +151, +35 +] +], +[ +[ +0, +0, +35 +], +[ +0, +17, +36 +], +[ +17, +34, +37 +], +[ +34, +51, +38 +], +[ +51, +64, +39 +], +[ +64, +71, +40 +], +[ +71, +85, +41 +], +[ +85, +87, +42 +], +[ +87, +118, +43 +], +[ +118, +121, +44 +], +[ +121, +143, +45 +] +], +[ +[ +0, +0, +45 +], +[ +0, +27, +46 +], +[ +27, +37, +47 +], +[ +37, +53, +48 +], +[ +53, +67, +49 +], +[ +67, +73, +50 +], +[ +73, +97, +51 +], +[ +97, +118, +52 +], +[ +118, +145, +53 +], +[ +145, +156, +54 +], +[ +156, +175, +55 +], +[ +175, +200, +56 +], +[ +200, +217, +57 +], +[ +217, +226, +58 +], +[ +226, +246, +59 +], +[ +246, +266, +60 +], +[ +266, +285, +61 +], +[ +285, +308, +62 +], +[ +308, +318, +63 +], +[ +318, +336, +64 +], +[ +336, +359, +65 +], +[ +359, +374, +66 +], +[ +374, +388, +67 +], +[ +388, +402, +68 +], +[ +402, +412, +69 +], +[ +412, +414, +70 +], +[ +414, +425, +71 +], +[ +425, +442, +72 +], +[ +442, +457, +73 +], +[ +457, +463, +74 +], +[ +463, +492, +75 +], +[ +492, +524, +76 +], +[ +524, +531, +77 +], +[ +531, +552, +78 +], +[ +552, +586, +79 +], +[ +586, +616, +80 +], +[ +616, +625, +81 +], +[ +625, +658, +82 +], +[ +658, +699, +83 +], +[ +699, +722, +84 +], +[ +722, +738, +85 +], +[ +738, +753, +86 +], +[ +753, +765, +87 +], +[ +765, +789, +88 +], +[ +789, +812, +89 +], +[ +812, +838, +90 +], +[ +838, +849, +91 +], +[ +849, +894, +92 +], +[ +894, +922, +93 +], +[ +922, +950, +94 +], +[ +950, +953, +95 +], +[ +953, +966, +96 +], +[ +966, +986, +97 +], +[ +986, +997, +98 +], +[ +997, +1014, +99 +], +[ +1014, +1031, +100 +], +[ +1031, +1040, +101 +], +[ +1040, +1052, +102 +], +[ +1052, +1059, +103 +], +[ +1059, +1084, +104 +] +], +[ +[ +0, +0, +104 +], +[ +0, +21, +105 +], +[ +21, +32, +106 +], +[ +32, +63, +107 +], +[ +63, +82, +108 +], +[ +82, +102, +109 +], +[ +102, +108, +110 +], +[ +108, +127, +111 +], +[ +127, +161, +112 +], +[ +161, +186, +113 +], +[ +186, +203, +114 +], +[ +203, +223, +115 +], +[ +223, +230, +116 +], +[ +230, +253, +117 +], +[ +253, +265, +118 +], +[ +265, +278, +119 +], +[ +278, +288, +120 +], +[ +288, +305, +121 +], +[ +305, +322, +122 +], +[ +322, +331, +123 +], +[ +331, +338, +124 +], +[ +338, +354, +125 +], +[ +354, +370, +126 +], +[ +370, +383, +127 +], +[ +383, +410, +128 +], +[ +410, +436, +129 +] +], +[ +[ +0, +0, +129 +], +[ +0, +37, +130 +], +[ +37, +65, +131 +], +[ +65, +103, +132 +], +[ +103, +120, +133 +], +[ +120, +143, +134 +], +[ +143, +144, +135 +], +[ +144, +155, +136 +], +[ +155, +166, +137 +], +[ +166, +186, +138 +], +[ +186, +207, +139 +], +[ +207, +229, +140 +], +[ +229, +241, +141 +], +[ +241, +248, +142 +], +[ +248, +255, +143 +], +[ +255, +272, +144 +], +[ +272, +319, +145 +], +[ +319, +355, +146 +], +[ +355, +362, +147 +], +[ +362, +382, +148 +], +[ +382, +401, +149 +], +[ +401, +426, +150 +], +[ +426, +431, +151 +], +[ +431, +446, +152 +], +[ +446, +458, +153 +], +[ +458, +476, +154 +], +[ +476, +482, +155 +], +[ +482, +515, +156 +], +[ +515, +540, +157 +] +], +[ +[ +0, +0, +157 +], +[ +0, +49, +158 +], +[ +49, +52, +159 +], +[ +52, +80, +160 +], +[ +80, +97, +161 +], +[ +97, +107, +162 +], +[ +107, +114, +163 +], +[ +114, +130, +164 +], +[ +130, +133, +165 +], +[ +133, +153, +166 +], +[ +153, +172, +167 +], +[ +172, +176, +168 +], +[ +176, +197, +169 +], +[ +197, +212, +170 +], +[ +212, +219, +171 +], +[ +219, +238, +172 +], +[ +238, +253, +173 +], +[ +253, +280, +174 +], +[ +280, +304, +175 +], +[ +304, +334, +176 +], +[ +334, +348, +177 +], +[ +348, +356, +178 +], +[ +356, +368, +179 +], +[ +368, +378, +180 +], +[ +378, +387, +181 +], +[ +387, +400, +182 +], +[ +400, +423, +183 +], +[ +423, +436, +184 +], +[ +436, +438, +185 +], +[ +438, +447, +186 +], +[ +447, +477, +187 +], +[ +477, +492, +188 +], +[ +492, +497, +189 +], +[ +497, +527, +190 +], +[ +527, +543, +191 +], +[ +543, +559, +192 +], +[ +559, +563, +193 +], +[ +563, +581, +194 +], +[ +581, +611, +195 +], +[ +611, +622, +196 +], +[ +622, +646, +197 +], +[ +646, +656, +198 +], +[ +656, +672, +199 +], +[ +672, +688, +200 +], +[ +688, +711, +201 +], +[ +711, +713, +202 +], +[ +713, +736, +203 +], +[ +736, +762, +204 +], +[ +762, +768, +205 +], +[ +768, +781, +206 +] +], +[ +[ +0, +0, +206 +], +[ +0, +10, +207 +], +[ +10, +37, +208 +], +[ +37, +63, +209 +], +[ +63, +77, +210 +], +[ +77, +96, +211 +], +[ +96, +108, +212 +], +[ +108, +123, +213 +], +[ +123, +135, +214 +], +[ +135, +142, +215 +], +[ +142, +171, +216 +], +[ +171, +192, +217 +], +[ +192, +213, +218 +], +[ +213, +226, +219 +], +[ +226, +249, +220 +], +[ +249, +258, +221 +], +[ +258, +261, +222 +], +[ +261, +279, +223 +], +[ +279, +554, +224 +] +], +[ +[ +0, +275, +224 +] +], +[ +[ +0, +95, +224 +] +] +], +"after_fix_punc": [ +[ +[ +0, +1, +4 +] +], +[ +[ +0, +0, +4 +], +[ +0, +8, +5 +], +[ +8, +16, +6 +] +], +[ +[ +0, +17, +7 +], +[ +17, +31, +8 +], +[ +31, +53, +9 +], +[ +53, +73, +10 +], +[ +73, +90, +11 +], +[ +90, +109, +12 +], +[ +109, +135, +13 +], +[ +135, +158, +14 +], +[ +158, +172, +15 +], +[ +172, +174, +16 +], +[ +174, +194, +17 +], +[ +194, +216, +18 +], +[ +216, +255, +19 +], +[ +255, +279, +20 +], +[ +279, +303, +21 +], +[ +303, +310, +22 +], +[ +310, +323, +23 +], +[ +323, +343, +24 +], +[ +343, +348, +25 +], +[ +348, +364, +26 +], +[ +364, +401, +27 +], +[ +401, +432, +28 +] +], +[ +[ +0, +0, +28 +], +[ +0, +9, +29 +], +[ +9, +27, +30 +], +[ +27, +47, +31 +], +[ +47, +68, +32 +], +[ +68, +83, +33 +], +[ +83, +114, +34 +], +[ +114, +151, +35 +] +], +[ +[ +0, +0, +35 +], +[ +0, +17, +36 +], +[ +17, +34, +37 +], +[ +34, +51, +38 +], +[ +51, +64, +39 +], +[ +64, +71, +40 +], +[ +71, +85, +41 +], +[ +85, +87, +42 +], +[ +87, +118, +43 +], +[ +118, +121, +44 +], +[ +121, +143, +45 +] +], +[ +[ +0, +0, +45 +], +[ +0, +27, +46 +], +[ +27, +37, +47 +], +[ +37, +53, +48 +], +[ +53, +67, +49 +], +[ +67, +73, +50 +], +[ +73, +97, +51 +], +[ +97, +118, +52 +], +[ +118, +146, +53 +], +[ +146, +157, +54 +], +[ +157, +175, +55 +], +[ +175, +200, +56 +], +[ +200, +218, +57 +], +[ +218, +226, +58 +], +[ +226, +246, +59 +], +[ +246, +266, +60 +], +[ +266, +285, +61 +], +[ +285, +308, +62 +], +[ +308, +318, +63 +], +[ +318, +336, +64 +], +[ +336, +359, +65 +], +[ +359, +374, +66 +], +[ +374, +388, +67 +], +[ +388, +402, +68 +], +[ +402, +412, +69 +], +[ +412, +414, +70 +], +[ +414, +425, +71 +], +[ +425, +442, +72 +], +[ +442, +457, +73 +], +[ +457, +463, +74 +], +[ +463, +492, +75 +], +[ +492, +524, +76 +], +[ +524, +531, +77 +], +[ +531, +552, +78 +], +[ +552, +586, +79 +], +[ +586, +616, +80 +], +[ +616, +625, +81 +], +[ +625, +658, +82 +], +[ +658, +700, +83 +], +[ +700, +722, +84 +], +[ +722, +738, +85 +], +[ +738, +753, +86 +], +[ +753, +765, +87 +], +[ +765, +789, +88 +], +[ +789, +812, +89 +], +[ +812, +838, +90 +], +[ +838, +849, +91 +], +[ +849, +894, +92 +], +[ +894, +922, +93 +], +[ +922, +950, +94 +], +[ +950, +953, +95 +], +[ +953, +966, +96 +], +[ +966, +986, +97 +], +[ +986, +997, +98 +], +[ +997, +1014, +99 +], +[ +1014, +1031, +100 +], +[ +1031, +1040, +101 +], +[ +1040, +1052, +102 +], +[ +1052, +1059, +103 +], +[ +1059, +1084, +104 +] +], +[ +[ +0, +0, +104 +], +[ +0, +22, +105 +], +[ +22, +32, +106 +], +[ +32, +63, +107 +], +[ +63, +82, +108 +], +[ +82, +102, +109 +], +[ +102, +108, +110 +], +[ +108, +127, +111 +], +[ +127, +161, +112 +], +[ +161, +186, +113 +], +[ +186, +203, +114 +], +[ +203, +223, +115 +], +[ +223, +230, +116 +], +[ +230, +253, +117 +], +[ +253, +266, +118 +], +[ +266, +279, +119 +], +[ +279, +289, +120 +], +[ +289, +306, +121 +], +[ +306, +323, +122 +], +[ +323, +331, +123 +], +[ +331, +339, +124 +], +[ +339, +355, +125 +], +[ +355, +370, +126 +], +[ +370, +383, +127 +], +[ +383, +410, +128 +], +[ +410, +436, +129 +] +], +[ +[ +0, +0, +129 +], +[ +0, +37, +130 +], +[ +37, +65, +131 +], +[ +65, +103, +132 +], +[ +103, +120, +133 +], +[ +120, +143, +134 +], +[ +143, +144, +135 +], +[ +144, +155, +136 +], +[ +155, +166, +137 +], +[ +166, +186, +138 +], +[ +186, +207, +139 +], +[ +207, +229, +140 +], +[ +229, +241, +141 +], +[ +241, +248, +142 +], +[ +248, +255, +143 +], +[ +255, +272, +144 +], +[ +272, +319, +145 +], +[ +319, +355, +146 +], +[ +355, +362, +147 +], +[ +362, +382, +148 +], +[ +382, +401, +149 +], +[ +401, +426, +150 +], +[ +426, +431, +151 +], +[ +431, +446, +152 +], +[ +446, +458, +153 +], +[ +458, +476, +154 +], +[ +476, +482, +155 +], +[ +482, +515, +156 +], +[ +515, +540, +157 +] +], +[ +[ +0, +0, +157 +], +[ +0, +49, +158 +], +[ +49, +52, +159 +], +[ +52, +80, +160 +], +[ +80, +97, +161 +], +[ +97, +107, +162 +], +[ +107, +114, +163 +], +[ +114, +130, +164 +], +[ +130, +133, +165 +], +[ +133, +153, +166 +], +[ +153, +172, +167 +], +[ +172, +176, +168 +], +[ +176, +197, +169 +], +[ +197, +212, +170 +], +[ +212, +219, +171 +], +[ +219, +238, +172 +], +[ +238, +253, +173 +], +[ +253, +280, +174 +], +[ +280, +304, +175 +], +[ +304, +334, +176 +], +[ +334, +348, +177 +], +[ +348, +356, +178 +], +[ +356, +368, +179 +], +[ +368, +378, +180 +], +[ +378, +387, +181 +], +[ +387, +400, +182 +], +[ +400, +423, +183 +], +[ +423, +436, +184 +], +[ +436, +438, +185 +], +[ +438, +447, +186 +], +[ +447, +477, +187 +], +[ +477, +492, +188 +], +[ +492, +497, +189 +], +[ +497, +527, +190 +], +[ +527, +543, +191 +], +[ +543, +559, +192 +], +[ +559, +563, +193 +], +[ +563, +581, +194 +], +[ +581, +611, +195 +], +[ +611, +622, +196 +], +[ +622, +646, +197 +], +[ +646, +656, +198 +], +[ +656, +672, +199 +], +[ +672, +688, +200 +], +[ +688, +711, +201 +], +[ +711, +713, +202 +], +[ +713, +736, +203 +], +[ +736, +762, +204 +], +[ +762, +768, +205 +], +[ +768, +781, +206 +] +], +[ +[ +0, +0, +206 +], +[ +0, +10, +207 +], +[ +10, +37, +208 +], +[ +37, +63, +209 +], +[ +63, +77, +210 +], +[ +77, +96, +211 +], +[ +96, +108, +212 +], +[ +108, +123, +213 +], +[ +123, +135, +214 +], +[ +135, +142, +215 +], +[ +142, +171, +216 +], +[ +171, +192, +217 +], +[ +192, +214, +218 +], +[ +214, +226, +219 +], +[ +226, +249, +220 +], +[ +249, +258, +221 +], +[ +258, +261, +222 +], +[ +261, +279, +223 +], +[ +279, +554, +224 +] +], +[ +[ +0, +275, +224 +] +], +[ +[ +0, +95, +224 +] +] +], +"cues_raw": [ +{ +"text": "*オーディブルでお届けします", +"start": 0.684, +"end": 3.0 +}, +{ +"text": "*夏メソーセキン", +"start": 9.58, +"end": 12.34 +}, +{ +"text": "*笑いはねこでや", +"start": 12.34, +"end": 14.42 +}, +{ +"text": "*1", +"start": 18.62, +"end": 20.1 +}, +{ +"text": "一", +"start": 25.64, +"end": 26.619999999999997 +}, +{ +"text": "吾輩は猫である。", +"start": 26.619999999999997, +"end": 28.78 +}, +{ +"text": "名前はまだ無い。", +"start": 28.991999999999997, +"end": 31.272 +}, +{ +"text": "どこで生れたかとんと見当がつかぬ。", +"start": 31.328000000000003, +"end": 35.4 +}, +{ +"text": "何でも薄暗いじめじめした所で", +"start": 35.712, +"end": 39.3 +}, +{ +"text": "ニャーニャー泣いていた事だけは記憶している。", +"start": 39.3, +"end": 42.376 +}, +{ +"text": "吾輩はここで始めて人間というものを見た。", +"start": 42.56, +"end": 47.048 +}, +{ +"text": "しかもあとで聞くとそれは書生という", +"start": 47.048, +"end": 51.22 +}, +{ +"text": "人間中で一番獰悪な種族であったそうだ。", +"start": 51.22, +"end": 55.368 +}, +{ +"text": "この書生というのは時々我々を捕えて煮て食うという話で", +"start": 55.744, +"end": 62.056000000000004 +}, +{ +"text": "ある。しかしその当時は何という考もなかったから", +"start": 62.056000000000004, +"end": 66.004 +}, +{ +"text": "別段恐しいとも思わなかった。", +"start": 66.004, +"end": 68.904 +}, +{ +"text": "ただ", +"start": 69.1, +"end": 70.5 +}, +{ +"text": "彼の掌に載せられてスーと持ち上げられた時", +"start": 70.5, +"end": 74.792 +}, +{ +"text": "何だかフワフワした感じがあったばかりである。", +"start": 74.792, +"end": 78.47200000000001 +}, +{ +"text": "掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。", +"start": 78.784, +"end": 86.696 +}, +{ +"text": "この時妙なものだと思った感じが今でも残っている。", +"start": 86.82000000000001, +"end": 92.22 +}, +{ +"text": "第一毛をもって装飾されべきはずの顔がつるつるして", +"start": 92.60000000000001, +"end": 98.28 +}, +{ +"text": "まるで薬缶だ。", +"start": 98.28, +"end": 100.424 +}, +{ +"text": "その後猫にもだいぶ逢ったが", +"start": 100.58, +"end": 103.464 +}, +{ +"text": "こんな片輪には一度も出会わした事がない。", +"start": 103.464, +"end": 106.888 +}, +{ +"text": "のみならず", +"start": 106.888, +"end": 108.552 +}, +{ +"text": "顔の真中があまりに突起している。", +"start": 108.552, +"end": 111.752 +}, +{ +"text": "そうしてその穴の中から時々ぷうぷうと煙を吹く。どうも咽せぽくて実に弱った。", +"start": 111.752, +"end": 119.304 +}, +{ +"text": "これが人間の飲む煙草というものである事はようやくこの頃知った。", +"start": 119.64, +"end": 125.992 +}, +{ +"text": "この書生の掌の裏で", +"start": 126.8, +"end": 129.832 +}, +{ +"text": "しばらくはよい心持に坐っておったが、", +"start": 129.832, +"end": 133.0 +}, +{ +"text": "しばらくすると非常な速力で運転し始めた。", +"start": 133.0, +"end": 136.94 +}, +{ +"text": "書生が動くのか自分だけが動くのか分らないが", +"start": 136.94, +"end": 142.024 +}, +{ +"text": "無暗に眼が廻る。胸が悪くなる。", +"start": 142.024, +"end": 145.86399999999998 +}, +{ +"text": "到底助からないと思っていると、どさりと音がして眼から火が出た。", +"start": 145.86399999999998, +"end": 151.72 +}, +{ +"text": "それまでは記憶しているがあとは何の事やらいくら考え出そうとしても分らない。", +"start": 152.512, +"end": 159.81599999999997 +}, +{ +"text": "ふと気が付いて見ると書生はいない。", +"start": 160.28799999999998, +"end": 163.84799999999998 +}, +{ +"text": "たくさんおった兄弟が一疋も見えぬ。", +"start": 163.89999999999998, +"end": 167.92 +}, +{ +"text": "肝心の母親さえ姿を隠してしまった。", +"start": 167.92, +"end": 171.208 +}, +{ +"text": "その上今までの所とは違って", +"start": 171.208, +"end": 175.07999999999998 +}, +{ +"text": "無暗に明るい。", +"start": 175.07999999999998, +"end": 176.7 +}, +{ +"text": "眼を明いていられぬくらいだ。", +"start": 176.7, +"end": 179.14399999999998 +}, +{ +"text": "はて", +"start": 179.232, +"end": 180.83999999999997 +}, +{ +"text": "な何でも容子がおかしいと、のそのそ這い出して見ると非常に痛い。", +"start": 180.83999999999997, +"end": 186.83999999999997 +}, +{ +"text": "吾輩は", +"start": 186.83999999999997, +"end": 188.42399999999998 +}, +{ +"text": "藁の上から急に笹原の中へ棄てられたのである。", +"start": 188.42399999999998, +"end": 192.87199999999999 +}, +{ +"text": "ようやくの思いで笹原を這い出すと向うに大きな池がある。", +"start": 193.82, +"end": 199.5 +}, +{ +"text": "吾輩は池の前に坐って", +"start": 199.61999999999998, +"end": 202.16 +}, +{ +"text": "どうしたらよかろうと考えて見た。", +"start": 202.16, +"end": 204.85999999999999 +}, +{ +"text": "別にこれという分別も出ない。", +"start": 204.85999999999999, +"end": 207.976 +}, +{ +"text": "しばらくして", +"start": 207.976, +"end": 209.60999999999999 +}, +{ +"text": "泣いたら書生がまた迎に来てくれるかと考え付いた。", +"start": 209.60999999999999, +"end": 214.248 +}, +{ +"text": "ニャー、ニャーと試みにやって見たが誰も来な", +"start": 214.83999999999997, +"end": 220.26 +}, +{ +"text": "い。そのうち池の上をさらさらと風が渡って日が暮れかかる。", +"start": 220.32, +"end": 225.92 +}, +{ +"text": "腹が非常に減って来た。", +"start": 225.92, +"end": 228.28 +}, +{ +"text": "泣きたくても声が出ない。仕方がない、", +"start": 228.28, +"end": 231.76399999999998 +}, +{ +"text": "何でもよいから食物のある所まであるこうと決心をして", +"start": 231.76399999999998, +"end": 236.08399999999997 +}, +{ +"text": "そろりそろりと池を左りに廻り始めた。", +"start": 236.08399999999997, +"end": 240.39 +}, +{ +"text": "どうも非常に苦し", +"start": 240.39, +"end": 242.792 +}, +{ +"text": "い。そこを我慢して無理やりに這って行くと", +"start": 242.792, +"end": 246.6 +}, +{ +"text": "ようやくの事で何となく人間臭い所へ出た。", +"start": 246.6, +"end": 251.07999999999998 +}, +{ +"text": "ここへ這入ったら、どうにかなると思って", +"start": 251.07999999999998, +"end": 254.72799999999998 +}, +{ +"text": "竹垣の崩れた穴から、とある邸内にもぐり込んだ。", +"start": 254.72799999999998, +"end": 258.984 +}, +{ +"text": "縁は不思議なもので、", +"start": 259.76, +"end": 262.344 +}, +{ +"text": "もしこの竹垣が破れていなかったなら、", +"start": 262.344, +"end": 266.056 +}, +{ +"text": "吾輩はついに路傍に餓死したかも知れんのである。", +"start": 266.056, +"end": 269.96 +}, +{ +"text": "一樹の蔭とはよく云ったものだ。", +"start": 269.96, +"end": 273.384 +}, +{ +"text": "この垣根の穴は今日に至るまで", +"start": 273.384, +"end": 276.744 +}, +{ +"text": "吾輩が隣家の三毛を訪問する時", +"start": 276.744, +"end": 280.18 +}, +{ +"text": "の通路になっている。", +"start": 280.18, +"end": 282.05600000000004 +}, +{ +"text": "さて", +"start": 283.296, +"end": 284.648 +}, +{ +"text": "邸へは忍び込んだものの", +"start": 284.648, +"end": 287.624 +}, +{ +"text": "これから先どうして善いか分らない。", +"start": 287.624, +"end": 290.024 +}, +{ +"text": "そのうちに暗くなる、腹は減る、", +"start": 290.024, +"end": 294.0 +}, +{ +"text": "寒さは寒し、", +"start": 294.0, +"end": 296.072 +}, +{ +"text": "雨が降って来るという始末でもう一刻の猶予が出来なくなった。", +"start": 296.072, +"end": 301.896 +}, +{ +"text": "仕方がないからとにかく明るくて暖かそうな方へ方へとあるいて行く。", +"start": 301.896, +"end": 307.88 +}, +{ +"text": "今から考えると", +"start": 307.94, +"end": 310.12 +}, +{ +"text": "その時はすでに家の内に這入っておったのだ。", +"start": 310.12, +"end": 313.74 +}, +{ +"text": "ここで吾輩は彼の書生以外の人間を再び見るべき機会に遭遇したのである。", +"start": 313.74, +"end": 321.16 +}, +{ +"text": "第一に逢ったのがおさんである。これは前の書生より一層乱暴な方", +"start": 322.48, +"end": 330.04 +}, +{ +"text": "で吾輩を見るや否や", +"start": 330.04, +"end": 332.148 +}, +{ +"text": "いきなり頸筋をつかんで表へ抛り出した。いやこれは駄目だと思ったから", +"start": 332.148, +"end": 339.188 +}, +{ +"text": "眼をねぶって運を天に任せていた。しかしひもじいのと寒いのにはどうしても我慢が出来ん。", +"start": 339.188, +"end": 347.54 +}, +{ +"text": "吾輩は再びおさんの隙を見て台所へ這い上った。", +"start": 347.54, +"end": 351.88 +}, +{ +"text": "すると間もなくまた投げ出された。", +"start": 351.88, +"end": 355.144 +}, +{ +"text": "吾輩は投げ出されては這い上り、", +"start": 355.32, +"end": 359.048 +}, +{ +"text": "這い上っては投げ出され、", +"start": 359.048, +"end": 361.16 +}, +{ +"text": "何でも同じ事を四五遍繰り返したのを記憶している。", +"start": 361.16, +"end": 365.94 +}, +{ +"text": "その時におさんと云う者はつくづくいやになった。", +"start": 365.98, +"end": 370.79200000000003 +}, +{ +"text": "この間おさんの三馬を偸んでこの返報をしてやってから、", +"start": 370.81600000000003, +"end": 375.49600000000004 +}, +{ +"text": "やっと胸の痞が下りた。", +"start": 375.49600000000004, +"end": 377.76800000000003 +}, +{ +"text": "吾輩が最後につまみ出されようとしたときに、この家の主人が騒々しい何だといいながら出て来た。", +"start": 378.28000000000003, +"end": 386.98400000000004 +}, +{ +"text": "下女は吾輩をぶら下げて主人の方へ向けてこの宿なしの小猫が", +"start": 386.98400000000004, +"end": 393.44800000000004 +}, +{ +"text": "いくら出しても出しても御台所へ上って来て困りますという。", +"start": 393.44800000000004, +"end": 398.696 +}, +{ +"text": "主人は", +"start": 398.696, +"end": 400.136 +}, +{ +"text": "鼻の下の黒い毛を撚りながら", +"start": 400.136, +"end": 402.56800000000004 +}, +{ +"text": "吾輩の顔をしばらく眺めておったが、やがて", +"start": 402.56800000000004, +"end": 406.12 +}, +{ +"text": "そんなら内へ置いてやれ", +"start": 406.12, +"end": 408.93600000000004 +}, +{ +"text": "といったまま奥へ這入ってしまった。", +"start": 408.93600000000004, +"end": 411.976 +}, +{ +"text": "主人はあまり口を聞かぬ人と見えた。", +"start": 412.28000000000003, +"end": 415.98 +}, +{ +"text": "下女は口惜しそうに", +"start": 416.288, +"end": 418.56800000000004 +}, +{ +"text": "吾輩を台所へ抛り出した。", +"start": 418.56800000000004, +"end": 420.808 +}, +{ +"text": "かくして吾輩は", +"start": 421.04, +"end": 423.336 +}, +{ +"text": "ついにこの家を自分の住家と極める事にしたのである。", +"start": 423.336, +"end": 428.74 +}, +{ +"text": "吾輩の主人は滅多に吾輩と顔を合せる事がない。", +"start": 430.032, +"end": 435.576 +}, +{ +"text": "職業は教師だそうだ。", +"start": 435.74, +"end": 438.488 +}, +{ +"text": "学校から帰ると終日書斎に這入ったぎりほとんど出て来る事がない。", +"start": 438.488, +"end": 444.728 +}, +{ +"text": "家のものは大変な勉強家だと思っている。", +"start": 444.728, +"end": 448.44 +}, +{ +"text": "当人も勉強家であるかのごとく見せている。", +"start": 448.46000000000004, +"end": 452.152 +}, +{ +"text": "しかし実際は", +"start": 452.2, +"end": 454.264 +}, +{ +"text": "うちのものがいうような勤勉家ではない。", +"start": 454.264, +"end": 457.81600000000003 +}, +{ +"text": "吾輩は時々忍び足に彼の書斎を覗いて見るが、彼はよく昼寝をしている事が", +"start": 457.872, +"end": 465.432 +}, +{ +"text": "ある。時々読みかけてある本の上に涎をたらしている。", +"start": 465.432, +"end": 470.00800000000004 +}, +{ +"text": "彼は胃弱で皮膚の色が淡黄色を帯びて", +"start": 470.00800000000004, +"end": 474.32800000000003 +}, +{ +"text": "弾力のない不活溌な徴候をあらわしている。", +"start": 474.32800000000003, +"end": 477.88 +}, +{ +"text": "その癖に大飯を", +"start": 477.9, +"end": 480.824 +}, +{ +"text": "食う。大飯を食った後でタカジヤスターゼを飲む。", +"start": 480.824, +"end": 485.19 +}, +{ +"text": "飲んだ後で書物をひろげる。", +"start": 485.19, +"end": 487.672 +}, +{ +"text": "二三ページ読むと眠くなる。", +"start": 487.672, +"end": 490.98 +}, +{ +"text": "涎を本の上へ垂らす。", +"start": 490.98, +"end": 493.58000000000004 +}, +{ +"text": "これが彼の毎夜繰り返す日課である。", +"start": 493.58000000000004, +"end": 496.84000000000003 +}, +{ +"text": "吾輩は猫ながら時々考える事がある。", +"start": 497.584, +"end": 501.72 +}, +{ +"text": "教師というものは", +"start": 501.72, +"end": 503.98 +}, +{ +"text": "実に楽なものだ。", +"start": 503.98, +"end": 506.0 +}, +{ +"text": "人間と生れたら教師となるに限る。", +"start": 506.0, +"end": 509.432 +}, +{ +"text": "こんなに寝ていて勤まるものなら", +"start": 509.432, +"end": 512.292 +}, +{ +"text": "猫にでも出来ぬ事はないと。", +"start": 512.292, +"end": 515.192 +}, +{ +"text": "それでも主人に云わせると教師ほどつらいものはないそうで", +"start": 515.9200000000001, +"end": 520.952 +}, +{ +"text": "彼は友達が来る度に何とかかんとか不平を鳴らしている。", +"start": 520.952, +"end": 525.944 +}, +{ +"text": "吾輩がこの家へ住み込んだ当時は、主人以外のものにははなはだ不人望であった。", +"start": 526.6800000000001, +"end": 533.72 +}, +{ +"text": "どこへ行っても跳ね付けられて相手にしてくれ手がなかった。", +"start": 533.96, +"end": 539.352 +}, +{ +"text": "いかに珍重されなかったかは、今日に至るまで名前さえつけてくれないのでも分る。", +"start": 539.376, +"end": 546.936 +}, +{ +"text": "吾輩は仕方がないから、出来得る限り", +"start": 546.98, +"end": 550.7760000000001 +}, +{ +"text": "吾輩を入れてくれた主人の傍にいる事をつとめた。", +"start": 550.7760000000001, +"end": 554.456 +}, +{ +"text": "朝", +"start": 554.66, +"end": 556.056 +}, +{ +"text": "主人が新聞を読むときは", +"start": 556.056, +"end": 558.5840000000001 +}, +{ +"text": "必ず彼の膝の上に乗る。", +"start": 558.5840000000001, +"end": 561.4 +}, +{ +"text": "彼が昼寝をするときは必ずその背中に乗る。", +"start": 561.4, +"end": 566.744 +}, +{ +"text": "これはあながち主人が好きという訳ではないが", +"start": 566.744, +"end": 571.8 +}, +{ +"text": "別に構い手がなかったからやむを得んのである。", +"start": 571.8, +"end": 575.704 +}, +{ +"text": "その後いろいろ経験の上、", +"start": 575.94, +"end": 579.1 +}, +{ +"text": "朝は飯櫃の上、", +"start": 579.1, +"end": 581.3 +}, +{ +"text": "夜は炬燵の上、", +"start": 581.3, +"end": 583.02 +}, +{ +"text": "天気のよい昼は椽側へ寝る事とした。", +"start": 583.02, +"end": 586.52 +}, +{ +"text": "しかし一番心持の好いのは夜に入ってここのうちの小供の寝床へもぐり込んでいっしょにねる事である。", +"start": 586.62, +"end": 596.46 +}, +{ +"text": "この小供というのは五つと三つで夜になると二人が一つ床へ入って一間へ寝る。", +"start": 596.72, +"end": 604.696 +}, +{ +"text": "吾輩はいつでも", +"start": 604.86, +"end": 606.8720000000001 +}, +{ +"text": "彼等の中間に己れを容るべき余地を見出して", +"start": 606.8720000000001, +"end": 610.936 +}, +{ +"text": "どうにか、こうにか割り込むのであるが、", +"start": 610.936, +"end": 613.944 +}, +{ +"text": "運悪く小供の一人が眼を醒ますが最後大変な事になる。", +"start": 613.944, +"end": 619.12 +}, +{ +"text": "小供は――", +"start": 619.12, +"end": 620.5360000000001 +}, +{ +"text": "ことに小さい方が質がわるい――", +"start": 620.5360000000001, +"end": 623.096 +}, +{ +"text": "猫が来た猫が来たといって", +"start": 623.096, +"end": 626.072 +}, +{ +"text": "夜中でも何でも大きな声で泣き出すので", +"start": 626.072, +"end": 630.072 +}, +{ +"text": "ある。すると", +"start": 630.072, +"end": 631.544 +}, +{ +"text": "例の神経胃弱性の主人は必ず眼をさまして次の部屋から飛び出してくる。", +"start": 631.544, +"end": 638.74 +}, +{ +"text": "現にせんだってなどは物指で尻ぺたをひどく叩かれた。", +"start": 638.74, +"end": 644.184 +}, +{ +"text": "吾輩は人間と同居して彼等を観察すればするほど、彼等は我儘なものだと断言せざるを得ないようになった。", +"start": 645.36, +"end": 656.12 +}, +{ +"text": "ことに", +"start": 656.2, +"end": 657.624 +}, +{ +"text": "吾輩が時々同衾する小供のごときに至っては言語同断である。", +"start": 657.624, +"end": 663.4159999999999 +}, +{ +"text": "自分の勝手な時は人を逆さにしたり、", +"start": 663.4200000000001, +"end": 667.2 +}, +{ +"text": "頭へ袋をかぶせたり、", +"start": 667.31, +"end": 670.16 +}, +{ +"text": "抛り出したり、", +"start": 670.16, +"end": 671.36 +}, +{ +"text": "へっついの中へ押し込んだりする。", +"start": 671.36, +"end": 674.6 +}, +{ +"text": "しかも", +"start": 674.6, +"end": 675.48 +}, +{ +"text": "吾輩の方で少しでも手出しをしようものなら", +"start": 675.48, +"end": 679.2 +}, +{ +"text": "家内総がかりで追い廻して迫害を加える。", +"start": 679.2, +"end": 682.86 +}, +{ +"text": "この間も", +"start": 683.22, +"end": 684.984 +}, +{ +"text": "ちょっと畳で爪を磨いだら細君が非常に怒って", +"start": 684.984, +"end": 688.9000000000001 +}, +{ +"text": "それから容易に座敷へ入れない。", +"start": 688.9000000000001, +"end": 691.8 +}, +{ +"text": "台所の板の間で", +"start": 691.8, +"end": 694.232 +}, +{ +"text": "他が顫えていても一向平気なものである。", +"start": 694.232, +"end": 697.944 +}, +{ +"text": "吾輩の尊敬する筋向の白君などは", +"start": 698.72, +"end": 702.648 +}, +{ +"text": "逢う度毎に人間ほど不人情なものはないと言っておらるる。", +"start": 702.648, +"end": 708.344 +}, +{ +"text": "白君は先日玉のような子猫を四疋産まれたのである。", +"start": 708.4000000000001, +"end": 713.52 +}, +{ +"text": "ところがそこの家の書生が三日目にそいつを裏の池へ持って行って", +"start": 713.52, +"end": 720.26 +}, +{ +"text": "四疋ながら棄てて来たそうだ。", +"start": 720.26, +"end": 722.616 +}, +{ +"text": "白君は涙を流して", +"start": 722.616, +"end": 724.94 +}, +{ +"text": "その一部始終を話した上、", +"start": 724.94, +"end": 727.3520000000001 +}, +{ +"text": "どうしても我等猫族が", +"start": 727.3520000000001, +"end": 730.136 +}, +{ +"text": "親子の愛を完くして", +"start": 730.136, +"end": 732.44 +}, +{ +"text": "美しい家族的生活をするには", +"start": 732.44, +"end": 735.288 +}, +{ +"text": "人間と戦ってこれを剿滅せねばならぬといわれた。", +"start": 735.288, +"end": 740.312 +}, +{ +"text": "一々もっともの議論と思う。", +"start": 740.62, +"end": 743.928 +}, +{ +"text": "また", +"start": 744.24, +"end": 745.5799999999999 +}, +{ +"text": "隣りの三毛君などは", +"start": 745.5799999999999, +"end": 747.72 +}, +{ +"text": "人間が所有権という事を解していないといって大に憤慨している。", +"start": 747.72, +"end": 754.0799999999999 +}, +{ +"text": "元来我々同族間では目刺の頭でも", +"start": 754.0799999999999, +"end": 758.232 +}, +{ +"text": "鰡の臍でも", +"start": 758.232, +"end": 759.8 +}, +{ +"text": "一番先に見付けたものがこれを食う権利があるものとなっている。", +"start": 759.8, +"end": 764.54 +}, +{ +"text": "もし相手がこの規約を守らなければ", +"start": 764.54, +"end": 768.504 +}, +{ +"text": "腕力に訴えて善いくらいのものだ。", +"start": 768.504, +"end": 771.4480000000001 +}, +{ +"text": "しかるに", +"start": 771.8199999999999, +"end": 773.4000000000001 +}, +{ +"text": "彼等人間は毫もこの観念がないと見えて", +"start": 773.4000000000001, +"end": 777.34 +}, +{ +"text": "我等が見付けた御馳走は必ず彼等のために掠奪せらるるのである。", +"start": 777.34, +"end": 783.8 +}, +{ +"text": "彼等はその強力を頼んで", +"start": 783.8, +"end": 786.01 +}, +{ +"text": "正当に吾人が食い得べきものを奪ってすましている。", +"start": 786.01, +"end": 790.76 +}, +{ +"text": "白君は軍人の家におり", +"start": 790.94, +"end": 793.54 +}, +{ +"text": "三毛君は代言の主人を持っている。", +"start": 793.54, +"end": 796.36 +}, +{ +"text": "吾輩は教師の家に住んでいるだけ、", +"start": 796.36, +"end": 799.288 +}, +{ +"text": "こんな事に関すると両君よりもむしろ楽天である。", +"start": 799.288, +"end": 804.0699999999999 +}, +{ +"text": "ただ", +"start": 804.0699999999999, +"end": 805.02 +}, +{ +"text": "その日その日がどうにかこうにか送られればよい。", +"start": 805.02, +"end": 809.88 +}, +{ +"text": "いくら人間だって、そういつまでも栄える事もあるまい。", +"start": 809.88, +"end": 814.74 +}, +{ +"text": "まあ気を永く", +"start": 814.74, +"end": 816.8240000000001 +}, +{ +"text": "猫の時節を待つがよかろう。", +"start": 816.8240000000001, +"end": 819.64 +}, +{ +"text": "我儘で思い出したから", +"start": 821.5840000000001, +"end": 824.6320000000001 +}, +{ +"text": "ちょっと吾輩の家の主人がこの我儘で失敗した話をしよう。", +"start": 824.6320000000001, +"end": 829.656 +}, +{ +"text": "元来この主人は何といって人に勝れて出来る事もないが、", +"start": 829.7760000000001, +"end": 835.3520000000001 +}, +{ +"text": "何にでもよく手を出したがる。", +"start": 835.3520000000001, +"end": 837.86 +}, +{ +"text": "俳句をやってほととぎすへ投書をしたり、", +"start": 837.86, +"end": 841.74 +}, +{ +"text": "新体詩を明星へ出したり、", +"start": 841.74, +"end": 845.1 +}, +{ +"text": "間違いだらけの英文をかいたり、", +"start": 845.1, +"end": 847.96 +}, +{ +"text": "時によると弓に凝ったり、", +"start": 847.96, +"end": 851.24 +}, +{ +"text": "謡を習ったり、", +"start": 851.24, +"end": 853.26 +}, +{ +"text": "またあるときはヴァイオリンなどをブーブー鳴らしたりするが、", +"start": 853.26, +"end": 857.528 +}, +{ +"text": "気の毒な事には、どれもこれも物になっておら", +"start": 857.528, +"end": 861.496 +}, +{ +"text": "ん。その癖やり出すと胃弱の癖にいやに熱心だ。", +"start": 861.496, +"end": 866.456 +}, +{ +"text": "後架の中で謡をうたって、", +"start": 866.736, +"end": 869.944 +}, +{ +"text": "近所で後架先生と渾名をつけられているにも関せず", +"start": 869.944, +"end": 874.46 +}, +{ +"text": "一向平気なもので、", +"start": 874.46, +"end": 876.9200000000001 +}, +{ +"text": "やはり", +"start": 876.9200000000001, +"end": 878.2 +}, +{ +"text": "これは平の宗盛にて候を繰返している。", +"start": 878.2, +"end": 883.4480000000001 +}, +{ +"text": "みんながそら宗盛だと吹き出すくらいである。この主人がどういう考になったものか吾輩の住み込んでから一月ばかり後のある月の月給日に、大きな包みを提げてあわただしく帰って来た。何を買って来たのかと思うと水彩絵具と毛筆とワットマンという紙で今日から謡や俳句をやめて絵をかく決心と見えた。果して翌日から当分の間というものは毎日毎日書斎で昼寝もしないで絵ばかりかいている。しかしそのかき上げたものを見ると何をかいたものやら誰にも鑑定がつかない。当人もあまり甘くないと思ったものか、ある日その友人で美学とかをやっている人が来た時に下のような話をしているのを聞いた。「どうも甘くかけないものだね。人のを見ると何でもないようだが自ら筆をとって見ると今更のようにむずかしく感ずる」これは主人の述懐である。なるほど詐りのない処だ。彼の友は金縁の眼鏡越に主人の顔を見ながら、「そう初めから上手にはかけないさ、第一室内の想像ばかりで画がかける訳のものではない。昔し以太利の大家アンドレア・デル・サルトが言った事がある。画をかくなら何でも自然その物を写せ。天に星辰あり。地に露華あり。飛ぶに禽あり。走るに獣あり。池に金魚あり。枯木に寒鴉あり。自然はこれ一幅の大活画なりと。どうだ君も画らしい画をかこうと思うならちと写生をしたら」「へえアンドレア・デル・サルトがそんな事をいった事があるかい。ちっとも知らなかった。なるほどこりゃもっともだ。実にその通りだ」と主人は無暗に感心している。金縁の裏には嘲けるような笑が見えた。", +"start": 883.4480000000001, +"end": 888.7 +} +], +"cues": [ +{ +"text": "*オーディブルでお届けします", +"start": 0.684, +"end": 3.0 +}, +{ +"text": "*夏メソーセキン", +"start": 9.58, +"end": 12.34 +}, +{ +"text": "*笑いはねこでや", +"start": 12.34, +"end": 14.42 +}, +{ +"text": "*1", +"start": 18.62, +"end": 20.1 +}, +{ +"text": "一", +"start": 25.64, +"end": 26.619999999999997 +}, +{ +"text": "吾輩は猫である。", +"start": 26.619999999999997, +"end": 28.78 +}, +{ +"text": "名前はまだ無い。", +"start": 28.991999999999997, +"end": 31.272 +}, +{ +"text": "どこで生れたかとんと見当がつかぬ。", +"start": 31.328000000000003, +"end": 35.4 +}, +{ +"text": "何でも薄暗いじめじめした所で", +"start": 35.712, +"end": 39.3 +}, +{ +"text": "ニャーニャー泣いていた事だけは記憶している。", +"start": 39.3, +"end": 42.376 +}, +{ +"text": "吾輩はここで始めて人間というものを見た。", +"start": 42.56, +"end": 47.048 +}, +{ +"text": "しかもあとで聞くとそれは書生という", +"start": 47.048, +"end": 51.22 +}, +{ +"text": "人間中で一番獰悪な種族であったそうだ。", +"start": 51.22, +"end": 55.368 +}, +{ +"text": "この書生というのは時々我々を捕えて煮て食うという話である。", +"start": 55.744, +"end": 62.056000000000004 +}, +{ +"text": "しかしその当時は何という考もなかったから", +"start": 62.056000000000004, +"end": 66.004 +}, +{ +"text": "別段恐しいとも思わなかった。", +"start": 66.004, +"end": 68.904 +}, +{ +"text": "ただ", +"start": 69.1, +"end": 70.5 +}, +{ +"text": "彼の掌に載せられてスーと持ち上げられた時", +"start": 70.5, +"end": 74.792 +}, +{ +"text": "何だかフワフワした感じがあったばかりである。", +"start": 74.792, +"end": 78.47200000000001 +}, +{ +"text": "掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。", +"start": 78.784, +"end": 86.696 +}, +{ +"text": "この時妙なものだと思った感じが今でも残っている。", +"start": 86.82000000000001, +"end": 92.22 +}, +{ +"text": "第一毛をもって装飾されべきはずの顔がつるつるして", +"start": 92.60000000000001, +"end": 98.28 +}, +{ +"text": "まるで薬缶だ。", +"start": 98.28, +"end": 100.424 +}, +{ +"text": "その後猫にもだいぶ逢ったが", +"start": 100.58, +"end": 103.464 +}, +{ +"text": "こんな片輪には一度も出会わした事がない。", +"start": 103.464, +"end": 106.888 +}, +{ +"text": "のみならず", +"start": 106.888, +"end": 108.552 +}, +{ +"text": "顔の真中があまりに突起している。", +"start": 108.552, +"end": 111.752 +}, +{ +"text": "そうしてその穴の中から時々ぷうぷうと煙を吹く。どうも咽せぽくて実に弱った。", +"start": 111.752, +"end": 119.304 +}, +{ +"text": "これが人間の飲む煙草というものである事はようやくこの頃知った。", +"start": 119.64, +"end": 125.992 +}, +{ +"text": "この書生の掌の裏で", +"start": 126.8, +"end": 129.832 +}, +{ +"text": "しばらくはよい心持に坐っておったが、", +"start": 129.832, +"end": 133.0 +}, +{ +"text": "しばらくすると非常な速力で運転し始めた。", +"start": 133.0, +"end": 136.94 +}, +{ +"text": "書生が動くのか自分だけが動くのか分らないが", +"start": 136.94, +"end": 142.024 +}, +{ +"text": "無暗に眼が廻る。胸が悪くなる。", +"start": 142.024, +"end": 145.86399999999998 +}, +{ +"text": "到底助からないと思っていると、どさりと音がして眼から火が出た。", +"start": 145.86399999999998, +"end": 151.72 +}, +{ +"text": "それまでは記憶しているがあとは何の事やらいくら考え出そうとしても分らない。", +"start": 152.512, +"end": 159.81599999999997 +}, +{ +"text": "ふと気が付いて見ると書生はいない。", +"start": 160.28799999999998, +"end": 163.84799999999998 +}, +{ +"text": "たくさんおった兄弟が一疋も見えぬ。", +"start": 163.89999999999998, +"end": 167.92 +}, +{ +"text": "肝心の母親さえ姿を隠してしまった。", +"start": 167.92, +"end": 171.208 +}, +{ +"text": "その上今までの所とは違って", +"start": 171.208, +"end": 175.07999999999998 +}, +{ +"text": "無暗に明るい。", +"start": 175.07999999999998, +"end": 176.7 +}, +{ +"text": "眼を明いていられぬくらいだ。", +"start": 176.7, +"end": 179.14399999999998 +}, +{ +"text": "はて", +"start": 179.232, +"end": 180.83999999999997 +}, +{ +"text": "な何でも容子がおかしいと、のそのそ這い出して見ると非常に痛い。", +"start": 180.83999999999997, +"end": 186.83999999999997 +}, +{ +"text": "吾輩は", +"start": 186.83999999999997, +"end": 188.42399999999998 +}, +{ +"text": "藁の上から急に笹原の中へ棄てられたのである。", +"start": 188.42399999999998, +"end": 192.87199999999999 +}, +{ +"text": "ようやくの思いで笹原を這い出すと向うに大きな池がある。", +"start": 193.82, +"end": 199.5 +}, +{ +"text": "吾輩は池の前に坐って", +"start": 199.61999999999998, +"end": 202.16 +}, +{ +"text": "どうしたらよかろうと考えて見た。", +"start": 202.16, +"end": 204.85999999999999 +}, +{ +"text": "別にこれという分別も出ない。", +"start": 204.85999999999999, +"end": 207.976 +}, +{ +"text": "しばらくして", +"start": 207.976, +"end": 209.60999999999999 +}, +{ +"text": "泣いたら書生がまた迎に来てくれるかと考え付いた。", +"start": 209.60999999999999, +"end": 214.248 +}, +{ +"text": "ニャー、ニャーと試みにやって見たが誰も来ない。", +"start": 214.83999999999997, +"end": 220.26 +}, +{ +"text": "そのうち池の上をさらさらと風が渡って日が暮れかかる。", +"start": 220.32, +"end": 225.92 +}, +{ +"text": "腹が非常に減って来た。", +"start": 225.92, +"end": 228.28 +}, +{ +"text": "泣きたくても声が出ない。仕方がない、", +"start": 228.28, +"end": 231.76399999999998 +}, +{ +"text": "何でもよいから食物のある所まであるこうと決心をして", +"start": 231.76399999999998, +"end": 236.08399999999997 +}, +{ +"text": "そろりそろりと池を左りに廻り始めた。", +"start": 236.08399999999997, +"end": 240.39 +}, +{ +"text": "どうも非常に苦しい。", +"start": 240.39, +"end": 242.792 +}, +{ +"text": "そこを我慢して無理やりに這って行くと", +"start": 242.792, +"end": 246.6 +}, +{ +"text": "ようやくの事で何となく人間臭い所へ出た。", +"start": 246.6, +"end": 251.07999999999998 +}, +{ +"text": "ここへ這入ったら、どうにかなると思って", +"start": 251.07999999999998, +"end": 254.72799999999998 +}, +{ +"text": "竹垣の崩れた穴から、とある邸内にもぐり込んだ。", +"start": 254.72799999999998, +"end": 258.984 +}, +{ +"text": "縁は不思議なもので、", +"start": 259.76, +"end": 262.344 +}, +{ +"text": "もしこの竹垣が破れていなかったなら、", +"start": 262.344, +"end": 266.056 +}, +{ +"text": "吾輩はついに路傍に餓死したかも知れんのである。", +"start": 266.056, +"end": 269.96 +}, +{ +"text": "一樹の蔭とはよく云ったものだ。", +"start": 269.96, +"end": 273.384 +}, +{ +"text": "この垣根の穴は今日に至るまで", +"start": 273.384, +"end": 276.744 +}, +{ +"text": "吾輩が隣家の三毛を訪問する時", +"start": 276.744, +"end": 280.18 +}, +{ +"text": "の通路になっている。", +"start": 280.18, +"end": 282.05600000000004 +}, +{ +"text": "さて", +"start": 283.296, +"end": 284.648 +}, +{ +"text": "邸へは忍び込んだものの", +"start": 284.648, +"end": 287.624 +}, +{ +"text": "これから先どうして善いか分らない。", +"start": 287.624, +"end": 290.024 +}, +{ +"text": "そのうちに暗くなる、腹は減る、", +"start": 290.024, +"end": 294.0 +}, +{ +"text": "寒さは寒し、", +"start": 294.0, +"end": 296.072 +}, +{ +"text": "雨が降って来るという始末でもう一刻の猶予が出来なくなった。", +"start": 296.072, +"end": 301.896 +}, +{ +"text": "仕方がないからとにかく明るくて暖かそうな方へ方へとあるいて行く。", +"start": 301.896, +"end": 307.88 +}, +{ +"text": "今から考えると", +"start": 307.94, +"end": 310.12 +}, +{ +"text": "その時はすでに家の内に這入っておったのだ。", +"start": 310.12, +"end": 313.74 +}, +{ +"text": "ここで吾輩は彼の書生以外の人間を再び見るべき機会に遭遇したのである。", +"start": 313.74, +"end": 321.16 +}, +{ +"text": "第一に逢ったのがおさんである。これは前の書生より一層乱暴な方", +"start": 322.48, +"end": 330.04 +}, +{ +"text": "で吾輩を見るや否や", +"start": 330.04, +"end": 332.148 +}, +{ +"text": "いきなり頸筋をつかんで表へ抛り出した。いやこれは駄目だと思ったから", +"start": 332.148, +"end": 339.188 +}, +{ +"text": "眼をねぶって運を天に任せていた。しかしひもじいのと寒いのにはどうしても我慢が出来ん。", +"start": 339.188, +"end": 347.54 +}, +{ +"text": "吾輩は再びおさんの隙を見て台所へ這い上った。", +"start": 347.54, +"end": 351.88 +}, +{ +"text": "すると間もなくまた投げ出された。", +"start": 351.88, +"end": 355.144 +}, +{ +"text": "吾輩は投げ出されては這い上り、", +"start": 355.32, +"end": 359.048 +}, +{ +"text": "這い上っては投げ出され、", +"start": 359.048, +"end": 361.16 +}, +{ +"text": "何でも同じ事を四五遍繰り返したのを記憶している。", +"start": 361.16, +"end": 365.94 +}, +{ +"text": "その時におさんと云う者はつくづくいやになった。", +"start": 365.98, +"end": 370.79200000000003 +}, +{ +"text": "この間おさんの三馬を偸んでこの返報をしてやってから、", +"start": 370.81600000000003, +"end": 375.49600000000004 +}, +{ +"text": "やっと胸の痞が下りた。", +"start": 375.49600000000004, +"end": 377.76800000000003 +}, +{ +"text": "吾輩が最後につまみ出されようとしたときに、この家の主人が騒々しい何だといいながら出て来た。", +"start": 378.28000000000003, +"end": 386.98400000000004 +}, +{ +"text": "下女は吾輩をぶら下げて主人の方へ向けてこの宿なしの小猫が", +"start": 386.98400000000004, +"end": 393.44800000000004 +}, +{ +"text": "いくら出しても出しても御台所へ上って来て困りますという。", +"start": 393.44800000000004, +"end": 398.696 +}, +{ +"text": "主人は", +"start": 398.696, +"end": 400.136 +}, +{ +"text": "鼻の下の黒い毛を撚りながら", +"start": 400.136, +"end": 402.56800000000004 +}, +{ +"text": "吾輩の顔をしばらく眺めておったが、やがて", +"start": 402.56800000000004, +"end": 406.12 +}, +{ +"text": "そんなら内へ置いてやれ", +"start": 406.12, +"end": 408.93600000000004 +}, +{ +"text": "といったまま奥へ這入ってしまった。", +"start": 408.93600000000004, +"end": 411.976 +}, +{ +"text": "主人はあまり口を聞かぬ人と見えた。", +"start": 412.28000000000003, +"end": 415.98 +}, +{ +"text": "下女は口惜しそうに", +"start": 416.288, +"end": 418.56800000000004 +}, +{ +"text": "吾輩を台所へ抛り出した。", +"start": 418.56800000000004, +"end": 420.808 +}, +{ +"text": "かくして吾輩は", +"start": 421.04, +"end": 423.336 +}, +{ +"text": "ついにこの家を自分の住家と極める事にしたのである。", +"start": 423.336, +"end": 428.74 +}, +{ +"text": "吾輩の主人は滅多に吾輩と顔を合せる事がない。", +"start": 430.032, +"end": 435.576 +}, +{ +"text": "職業は教師だそうだ。", +"start": 435.74, +"end": 438.488 +}, +{ +"text": "学校から帰ると終日書斎に這入ったぎりほとんど出て来る事がない。", +"start": 438.488, +"end": 444.728 +}, +{ +"text": "家のものは大変な勉強家だと思っている。", +"start": 444.728, +"end": 448.44 +}, +{ +"text": "当人も勉強家であるかのごとく見せている。", +"start": 448.46000000000004, +"end": 452.152 +}, +{ +"text": "しかし実際は", +"start": 452.2, +"end": 454.264 +}, +{ +"text": "うちのものがいうような勤勉家ではない。", +"start": 454.264, +"end": 457.81600000000003 +}, +{ +"text": "吾輩は時々忍び足に彼の書斎を覗いて見るが、彼はよく昼寝をしている事がある。", +"start": 457.872, +"end": 465.432 +}, +{ +"text": "時々読みかけてある本の上に涎をたらしている。", +"start": 465.432, +"end": 470.00800000000004 +}, +{ +"text": "彼は胃弱で皮膚の色が淡黄色を帯びて", +"start": 470.00800000000004, +"end": 474.32800000000003 +}, +{ +"text": "弾力のない不活溌な徴候をあらわしている。", +"start": 474.32800000000003, +"end": 477.88 +}, +{ +"text": "その癖に大飯を食う。", +"start": 477.9, +"end": 480.824 +}, +{ +"text": "大飯を食った後でタカジヤスターゼを飲む。", +"start": 480.824, +"end": 485.19 +}, +{ +"text": "飲んだ後で書物をひろげる。", +"start": 485.19, +"end": 487.672 +}, +{ +"text": "二三ページ読むと眠くなる。", +"start": 487.672, +"end": 490.98 +}, +{ +"text": "涎を本の上へ垂らす。", +"start": 490.98, +"end": 493.58000000000004 +}, +{ +"text": "これが彼の毎夜繰り返す日課である。", +"start": 493.58000000000004, +"end": 496.84000000000003 +}, +{ +"text": "吾輩は猫ながら時々考える事がある。", +"start": 497.584, +"end": 501.72 +}, +{ +"text": "教師というものは", +"start": 501.72, +"end": 503.98 +}, +{ +"text": "実に楽なものだ。", +"start": 503.98, +"end": 506.0 +}, +{ +"text": "人間と生れたら教師となるに限る。", +"start": 506.0, +"end": 509.432 +}, +{ +"text": "こんなに寝ていて勤まるものなら", +"start": 509.432, +"end": 512.292 +}, +{ +"text": "猫にでも出来ぬ事はないと。", +"start": 512.292, +"end": 515.192 +}, +{ +"text": "それでも主人に云わせると教師ほどつらいものはないそうで", +"start": 515.9200000000001, +"end": 520.952 +}, +{ +"text": "彼は友達が来る度に何とかかんとか不平を鳴らしている。", +"start": 520.952, +"end": 525.944 +}, +{ +"text": "吾輩がこの家へ住み込んだ当時は、主人以外のものにははなはだ不人望であった。", +"start": 526.6800000000001, +"end": 533.72 +}, +{ +"text": "どこへ行っても跳ね付けられて相手にしてくれ手がなかった。", +"start": 533.96, +"end": 539.352 +}, +{ +"text": "いかに珍重されなかったかは、今日に至るまで名前さえつけてくれないのでも分る。", +"start": 539.376, +"end": 546.936 +}, +{ +"text": "吾輩は仕方がないから、出来得る限り", +"start": 546.98, +"end": 550.7760000000001 +}, +{ +"text": "吾輩を入れてくれた主人の傍にいる事をつとめた。", +"start": 550.7760000000001, +"end": 554.456 +}, +{ +"text": "朝", +"start": 554.66, +"end": 556.056 +}, +{ +"text": "主人が新聞を読むときは", +"start": 556.056, +"end": 558.5840000000001 +}, +{ +"text": "必ず彼の膝の上に乗る。", +"start": 558.5840000000001, +"end": 561.4 +}, +{ +"text": "彼が昼寝をするときは必ずその背中に乗る。", +"start": 561.4, +"end": 566.744 +}, +{ +"text": "これはあながち主人が好きという訳ではないが", +"start": 566.744, +"end": 571.8 +}, +{ +"text": "別に構い手がなかったからやむを得んのである。", +"start": 571.8, +"end": 575.704 +}, +{ +"text": "その後いろいろ経験の上、", +"start": 575.94, +"end": 579.1 +}, +{ +"text": "朝は飯櫃の上、", +"start": 579.1, +"end": 581.3 +}, +{ +"text": "夜は炬燵の上、", +"start": 581.3, +"end": 583.02 +}, +{ +"text": "天気のよい昼は椽側へ寝る事とした。", +"start": 583.02, +"end": 586.52 +}, +{ +"text": "しかし一番心持の好いのは夜に入ってここのうちの小供の寝床へもぐり込んでいっしょにねる事である。", +"start": 586.62, +"end": 596.46 +}, +{ +"text": "この小供というのは五つと三つで夜になると二人が一つ床へ入って一間へ寝る。", +"start": 596.72, +"end": 604.696 +}, +{ +"text": "吾輩はいつでも", +"start": 604.86, +"end": 606.8720000000001 +}, +{ +"text": "彼等の中間に己れを容るべき余地を見出して", +"start": 606.8720000000001, +"end": 610.936 +}, +{ +"text": "どうにか、こうにか割り込むのであるが、", +"start": 610.936, +"end": 613.944 +}, +{ +"text": "運悪く小供の一人が眼を醒ますが最後大変な事になる。", +"start": 613.944, +"end": 619.12 +}, +{ +"text": "小供は――", +"start": 619.12, +"end": 620.5360000000001 +}, +{ +"text": "ことに小さい方が質がわるい――", +"start": 620.5360000000001, +"end": 623.096 +}, +{ +"text": "猫が来た猫が来たといって", +"start": 623.096, +"end": 626.072 +}, +{ +"text": "夜中でも何でも大きな声で泣き出すのである。", +"start": 626.072, +"end": 630.072 +}, +{ +"text": "すると", +"start": 630.072, +"end": 631.544 +}, +{ +"text": "例の神経胃弱性の主人は必ず眼をさまして次の部屋から飛び出してくる。", +"start": 631.544, +"end": 638.74 +}, +{ +"text": "現にせんだってなどは物指で尻ぺたをひどく叩かれた。", +"start": 638.74, +"end": 644.184 +}, +{ +"text": "吾輩は人間と同居して彼等を観察すればするほど、彼等は我儘なものだと断言せざるを得ないようになった。", +"start": 645.36, +"end": 656.12 +}, +{ +"text": "ことに", +"start": 656.2, +"end": 657.624 +}, +{ +"text": "吾輩が時々同衾する小供のごときに至っては言語同断である。", +"start": 657.624, +"end": 663.4159999999999 +}, +{ +"text": "自分の勝手な時は人を逆さにしたり、", +"start": 663.4200000000001, +"end": 667.2 +}, +{ +"text": "頭へ袋をかぶせたり、", +"start": 667.31, +"end": 670.16 +}, +{ +"text": "抛り出したり、", +"start": 670.16, +"end": 671.36 +}, +{ +"text": "へっついの中へ押し込んだりする。", +"start": 671.36, +"end": 674.6 +}, +{ +"text": "しかも", +"start": 674.6, +"end": 675.48 +}, +{ +"text": "吾輩の方で少しでも手出しをしようものなら", +"start": 675.48, +"end": 679.2 +}, +{ +"text": "家内総がかりで追い廻して迫害を加える。", +"start": 679.2, +"end": 682.86 +}, +{ +"text": "この間も", +"start": 683.22, +"end": 684.984 +}, +{ +"text": "ちょっと畳で爪を磨いだら細君が非常に怒って", +"start": 684.984, +"end": 688.9000000000001 +}, +{ +"text": "それから容易に座敷へ入れない。", +"start": 688.9000000000001, +"end": 691.8 +}, +{ +"text": "台所の板の間で", +"start": 691.8, +"end": 694.232 +}, +{ +"text": "他が顫えていても一向平気なものである。", +"start": 694.232, +"end": 697.944 +}, +{ +"text": "吾輩の尊敬する筋向の白君などは", +"start": 698.72, +"end": 702.648 +}, +{ +"text": "逢う度毎に人間ほど不人情なものはないと言っておらるる。", +"start": 702.648, +"end": 708.344 +}, +{ +"text": "白君は先日玉のような子猫を四疋産まれたのである。", +"start": 708.4000000000001, +"end": 713.52 +}, +{ +"text": "ところがそこの家の書生が三日目にそいつを裏の池へ持って行って", +"start": 713.52, +"end": 720.26 +}, +{ +"text": "四疋ながら棄てて来たそうだ。", +"start": 720.26, +"end": 722.616 +}, +{ +"text": "白君は涙を流して", +"start": 722.616, +"end": 724.94 +}, +{ +"text": "その一部始終を話した上、", +"start": 724.94, +"end": 727.3520000000001 +}, +{ +"text": "どうしても我等猫族が", +"start": 727.3520000000001, +"end": 730.136 +}, +{ +"text": "親子の愛を完くして", +"start": 730.136, +"end": 732.44 +}, +{ +"text": "美しい家族的生活をするには", +"start": 732.44, +"end": 735.288 +}, +{ +"text": "人間と戦ってこれを剿滅せねばならぬといわれた。", +"start": 735.288, +"end": 740.312 +}, +{ +"text": "一々もっともの議論と思う。", +"start": 740.62, +"end": 743.928 +}, +{ +"text": "また", +"start": 744.24, +"end": 745.5799999999999 +}, +{ +"text": "隣りの三毛君などは", +"start": 745.5799999999999, +"end": 747.72 +}, +{ +"text": "人間が所有権という事を解していないといって大に憤慨している。", +"start": 747.72, +"end": 754.0799999999999 +}, +{ +"text": "元来我々同族間では目刺の頭でも", +"start": 754.0799999999999, +"end": 758.232 +}, +{ +"text": "鰡の臍でも", +"start": 758.232, +"end": 759.8 +}, +{ +"text": "一番先に見付けたものがこれを食う権利があるものとなっている。", +"start": 759.8, +"end": 764.54 +}, +{ +"text": "もし相手がこの規約を守らなければ", +"start": 764.54, +"end": 768.504 +}, +{ +"text": "腕力に訴えて善いくらいのものだ。", +"start": 768.504, +"end": 771.4480000000001 +}, +{ +"text": "しかるに", +"start": 771.8199999999999, +"end": 773.4000000000001 +}, +{ +"text": "彼等人間は毫もこの観念がないと見えて", +"start": 773.4000000000001, +"end": 777.34 +}, +{ +"text": "我等が見付けた御馳走は必ず彼等のために掠奪せらるるのである。", +"start": 777.34, +"end": 783.8 +}, +{ +"text": "彼等はその強力を頼んで", +"start": 783.8, +"end": 786.01 +}, +{ +"text": "正当に吾人が食い得べきものを奪ってすましている。", +"start": 786.01, +"end": 790.76 +}, +{ +"text": "白君は軍人の家におり", +"start": 790.94, +"end": 793.54 +}, +{ +"text": "三毛君は代言の主人を持っている。", +"start": 793.54, +"end": 796.36 +}, +{ +"text": "吾輩は教師の家に住んでいるだけ、", +"start": 796.36, +"end": 799.288 +}, +{ +"text": "こんな事に関すると両君よりもむしろ楽天である。", +"start": 799.288, +"end": 804.0699999999999 +}, +{ +"text": "ただ", +"start": 804.0699999999999, +"end": 805.02 +}, +{ +"text": "その日その日がどうにかこうにか送られればよい。", +"start": 805.02, +"end": 809.88 +}, +{ +"text": "いくら人間だって、そういつまでも栄える事もあるまい。", +"start": 809.88, +"end": 814.74 +}, +{ +"text": "まあ気を永く", +"start": 814.74, +"end": 816.8240000000001 +}, +{ +"text": "猫の時節を待つがよかろう。", +"start": 816.8240000000001, +"end": 819.64 +}, +{ +"text": "我儘で思い出したから", +"start": 821.5840000000001, +"end": 824.6320000000001 +}, +{ +"text": "ちょっと吾輩の家の主人がこの我儘で失敗した話をしよう。", +"start": 824.6320000000001, +"end": 829.656 +}, +{ +"text": "元来この主人は何といって人に勝れて出来る事もないが、", +"start": 829.7760000000001, +"end": 835.3520000000001 +}, +{ +"text": "何にでもよく手を出したがる。", +"start": 835.3520000000001, +"end": 837.86 +}, +{ +"text": "俳句をやってほととぎすへ投書をしたり、", +"start": 837.86, +"end": 841.74 +}, +{ +"text": "新体詩を明星へ出したり、", +"start": 841.74, +"end": 845.1 +}, +{ +"text": "間違いだらけの英文をかいたり、", +"start": 845.1, +"end": 847.96 +}, +{ +"text": "時によると弓に凝ったり、", +"start": 847.96, +"end": 851.24 +}, +{ +"text": "謡を習ったり、", +"start": 851.24, +"end": 853.26 +}, +{ +"text": "またあるときはヴァイオリンなどをブーブー鳴らしたりするが、", +"start": 853.26, +"end": 857.528 +}, +{ +"text": "気の毒な事には、どれもこれも物になっておらん。", +"start": 857.528, +"end": 861.496 +}, +{ +"text": "その癖やり出すと胃弱の癖にいやに熱心だ。", +"start": 861.496, +"end": 866.456 +}, +{ +"text": "後架の中で謡をうたって、", +"start": 866.736, +"end": 869.944 +}, +{ +"text": "近所で後架先生と渾名をつけられているにも関せず", +"start": 869.944, +"end": 874.46 +}, +{ +"text": "一向平気なもので、", +"start": 874.46, +"end": 876.9200000000001 +}, +{ +"text": "やはり", +"start": 876.9200000000001, +"end": 878.2 +}, +{ +"text": "これは平の宗盛にて候を繰返している。", +"start": 878.2, +"end": 883.4480000000001 +}, +{ +"text": "みんながそら宗盛だと吹き出すくらいである。この主人がどういう考になったものか吾輩の住み込んでから一月ばかり後のある月の月給日に、大きな包みを提げてあわただしく帰って来た。何を買って来たのかと思うと水彩絵具と毛筆とワットマンという紙で今日から謡や俳句をやめて絵をかく決心と見えた。果して翌日から当分の間というものは毎日毎日書斎で昼寝もしないで絵ばかりかいている。しかしそのかき上げたものを見ると何をかいたものやら誰にも鑑定がつかない。当人もあまり甘くないと思ったものか、ある日その友人で美学とかをやっている人が来た時に下のような話をしているのを聞いた。「どうも甘くかけないものだね。人のを見ると何でもないようだが自ら筆をとって見ると今更のようにむずかしく感ずる」これは主人の述懐である。なるほど詐りのない処だ。彼の友は金縁の眼鏡越に主人の顔を見ながら、「そう初めから上手にはかけないさ、第一室内の想像ばかりで画がかける訳のものではない。昔し以太利の大家アンドレア・デル・サルトが言った事がある。画をかくなら何でも自然その物を写せ。天に星辰あり。地に露華あり。飛ぶに禽あり。走るに獣あり。池に金魚あり。枯木に寒鴉あり。自然はこれ一幅の大活画なりと。どうだ君も画らしい画をかこうと思うならちと写生をしたら」「へえアンドレア・デル・サルトがそんな事をいった事があるかい。ちっとも知らなかった。なるほどこりゃもっともだ。実にその通りだ」と主人は無暗に感心している。金縁の裏には嘲けるような笑が見えた。", +"start": 883.4480000000001, +"end": 888.7 +} +] +} \ No newline at end of file diff --git a/core/src/test/resources/golden/neko_003_006.json b/core/src/test/resources/golden/neko_003_006.json new file mode 100644 index 0000000..12b5666 --- /dev/null +++ b/core/src/test/resources/golden/neko_003_006.json @@ -0,0 +1,11203 @@ +{ +"name": "neko_003_006", +"language": "ja", +"prepend": "『「((《⦅[{\"'“¿'“\"¿([{-『「(〈《〔【{[⦅<<‘“〝※", +"append": "'\"・.。!!??::”>>⦆)]}』」)〉》〕】}]’〟/\~〜~;;─―–-➡* ,,、…", +"nopend": "うぁぃぅぇぉっゃゅょゎゕゖァィゥェォヵㇰヶㇱㇲッㇳㇴㇵㇶㇷㇷ゚ㇸㇹㇺャュョㇻㇼㇽㇾㇿヮ… ", +"transcript": [ +{ +"text": "この主人がどういう考えになったものか 長いのすみ込んでからひとつきばかりのちの あるつきの月9日に大きなつつみをさげてあわたたしく帰ってきた", +"start": 1.324, +"end": 14.868 +}, +{ +"text": "何をかってきたのかと思うと 水替えの具ともう一つとわっとまんとゆうかみで", +"start": 15.212, +"end": 23.092 +}, +{ +"text": "今日から、", +"start": 23.092, +"end": 24.532 +}, +{ +"text": "歌いや配価をやめて絵をかく決心と見えた。", +"start": 24.532, +"end": 28.7 +}, +{ +"text": "果たして欲実力とぶんの間と言う者は、毎日毎日、小さいで昼寝しないで、うぼくで書いている。", +"start": 29.1, +"end": 38.38 +}, +{ +"text": "しかし、その書き上げたものを見ると、", +"start": 38.38, +"end": 41.972 +}, +{ +"text": "何を書いたものやら誰にも観定がつかない。", +"start": 41.972, +"end": 46.164 +}, +{ +"text": "とにも、おもりうまくないと思ったものか。", +"start": 46.164, +"end": 50.26 +}, +{ +"text": "ある日、その友人でビガクとかをやっている人が来たときに、 シモのような話をしているのを聞いた。", +"start": 50.26, +"end": 58.548 +}, +{ +"text": "どうもうまくかけないものだね。", +"start": 58.98, +"end": 62.708 +}, +{ +"text": "人の見ると何でもないようだが、", +"start": 62.708, +"end": 65.908 +}, +{ +"text": " 水から不出を取ってみると、今さらのように難しく感じる。", +"start": 65.908, +"end": 71.284 +}, +{ +"text": "これは主人の10回である。", +"start": 71.34, +"end": 73.98 +}, +{ +"text": "なるほど、いつわりのないところだ。", +"start": 74.46, +"end": 77.972 +}, +{ +"text": "彼のともは、", +"start": 78.988, +"end": 80.948 +}, +{ +"text": "キンブチの目が寝越しに出品の顔を見ながら、", +"start": 80.948, +"end": 84.32 +}, +{ +"text": "そーはじめから上昇にはかけないそう。", +"start": 84.7, +"end": 88.084 +}, +{ +"text": "どいちしつないの想像ばかりで映画かけるわけのものではない。", +"start": 88.28, +"end": 93.3 +}, +{ +"text": "向こうし、", +"start": 93.3, +"end": 94.79 +}, +{ +"text": "一人のといこ、アンドレアを出るサルトがいったことがある。", +"start": 94.79, +"end": 99.16 +}, +{ +"text": "絵を隠なら、なんでも自然そのものをうつせ。", +"start": 99.16, +"end": 103.58 +}, +{ +"text": "天に精神がり、", +"start": 103.76, +"end": 105.86 +}, +{ +"text": "ちに労かあり、", +"start": 105.86, +"end": 107.668 +}, +{ +"text": "飛ぶに取りやり、", +"start": 107.668, +"end": 109.9 +}, +{ +"text": "走るにけものあり、", +"start": 109.9, +"end": 111.9 +}, +{ +"text": "いけに金行あり、", +"start": 111.9, +"end": 114.132 +}, +{ +"text": "こぼくに関があり、", +"start": 114.132, +"end": 116.5 +}, +{ +"text": "自然はこれ一つくの大活がなりと、", +"start": 116.5, +"end": 120.66 +}, +{ +"text": "どうだ?", +"start": 120.66, +"end": 121.684 +}, +{ +"text": "君も絵らしい絵を隠ろうと思うなら、", +"start": 121.684, +"end": 124.8 +}, +{ +"text": "人を写え起こしたら。", +"start": 124.8, +"end": 126.484 +}, +{ +"text": "へぇえ 本当れを出るサルトがそんなことを言ったことがあるかい", +"start": 127.404, +"end": 134.56 +}, +{ +"text": "ちっとも知らなかった", +"start": 134.56, +"end": 137.19 +}, +{ +"text": " なるほど", +"start": 137.19, +"end": 138.28 +}, +{ +"text": "これはもっともだ 実にその通りだ", +"start": 138.412, +"end": 142.836 +}, +{ +"text": "と主人は むやみに関心している", +"start": 142.836, +"end": 146.324 +}, +{ +"text": "金物の裏には 渦けるような笑いが見えた", +"start": 146.324, +"end": 151.24 +}, +{ +"text": "そのよく実", +"start": 152.38, +"end": 154.42 +}, +{ +"text": "わが配われのごとく円側に出て心持ちよく広がしていたら 主人が令に残したいから出てきて わが配の後ろで何か仕切りにあっておる", +"start": 154.42, +"end": 165.856 +}, +{ +"text": "普通目が染めて", +"start": 165.856, +"end": 167.76 +}, +{ +"text": "何をしているかと 一部分かり細めに目を開けてみる", +"start": 167.76, +"end": 173.38 +}, +{ +"text": "と これは4年もなく", +"start": 173.38, +"end": 175.84 +}, +{ +"text": " アンドレアでるサルトを決め込んでいる", +"start": 175.84, +"end": 178.58 +}, +{ +"text": "悪いはこのあり様を見て、覚えずしっ赤をするのを筋字へなかった。", +"start": 179.436, +"end": 185.78 +}, +{ +"text": "彼は彼のともにやゆせられたる結果として、", +"start": 186.64, +"end": 191.252 +}, +{ +"text": "まず手はじめに応揮をしゃせいしつつあるのである。", +"start": 191.252, +"end": 195.188 +}, +{ +"text": "わあはゆはすでに十分抜えた、", +"start": 195.28, +"end": 198.036 +}, +{ +"text": "あくびがしたくてたまらない。", +"start": 198.04, +"end": 200.66 +}, +{ +"text": "しかしせっかく主人が寝死に船を取っているのを動いてはきの毒だと思うと、", +"start": 200.66, +"end": 207.776 +}, +{ +"text": "ジットシンボーしてこった。", +"start": 207.776, +"end": 209.94 +}, +{ +"text": "彼は今、", +"start": 210.14, +"end": 211.668 +}, +{ +"text": "幅いの輪郭をかけ上げて、顔のあたりを色々だっている。", +"start": 211.668, +"end": 215.98 +}, +{ +"text": "幅いは違くする。", +"start": 216.18, +"end": 218.228 +}, +{ +"text": "幅いは猫として、", +"start": 219.0, +"end": 221.364 +}, +{ +"text": "決して上状の出来ではない?", +"start": 221.364, +"end": 223.764 +}, +{ +"text": "せとい、けなみとい、", +"start": 223.764, +"end": 225.972 +}, +{ +"text": "顔の増朽作とい、あえてたの猫にまさるとは決して思っておろ。", +"start": 225.972, +"end": 231.44 +}, +{ +"text": "しかし、いくらぶきれをの幅いでも、", +"start": 231.44, +"end": 234.72 +}, +{ +"text": "今、我が入の主人に映画来たされつつあるような見ような姿とは、どうしても思われな。", +"start": 234.72, +"end": 242.324 +}, +{ +"text": "第1色が違う。", +"start": 242.324, +"end": 245.14 +}, +{ +"text": "おばかいは、ペル者さんの猫のごとく、気を含める単解職に、うるしのごとき、増入りの火増を揺りしている。", +"start": 245.16, +"end": 254.484 +}, +{ +"text": "これだけは、誰が見ても歌が売れからざる事実と思う。", +"start": 254.484, +"end": 259.284 +}, +{ +"text": "しかるん、今主人の最識を見ると、", +"start": 259.284, +"end": 263.572 +}, +{ +"text": "きてもなければ苦労でもない。", +"start": 263.572, +"end": 266.74 +}, +{ +"text": "ハイ色でもなければ、飛び色でもない。", +"start": 266.74, +"end": 270.708 +}, +{ +"text": "さればとて、これらを混ぜた色でもない。", +"start": 270.72, +"end": 274.676 +}, +{ +"text": "ただ一周の色であるというよりほかに表し方のない色である。", +"start": 274.676, +"end": 280.06 +}, +{ +"text": "そのうえ不思議なことは、目がない。", +"start": 280.1, +"end": 283.412 +}, +{ +"text": "もっとも、", +"start": 283.412, +"end": 284.852 +}, +{ +"text": "これを抜いているところを写成したのだから無理もないが、", +"start": 284.852, +"end": 288.82 +}, +{ +"text": "メーラシイところさえ見えないから、", +"start": 288.82, +"end": 291.92 +}, +{ +"text": "メークラダかネテイルネクだか販売しないのである。", +"start": 291.92, +"end": 295.86 +}, +{ +"text": "ワーハイは震中一緒かに、", +"start": 297.12, +"end": 300.052 +}, +{ +"text": "イクラアンドレアデルサルトでも、", +"start": 300.052, +"end": 303.028 +}, +{ +"text": "これではしょうがないと思った。", +"start": 303.028, +"end": 305.844 +}, +{ +"text": "しかし、", +"start": 306.44, +"end": 307.98 +}, +{ +"text": "その年にはカンプクセザルを得ない。", +"start": 307.98, +"end": 311.508 +}, +{ +"text": "なるべくなら動かずによってやりたいと思ったな、", +"start": 311.508, +"end": 315.508 +}, +{ +"text": "さっきから消弁が燃やをしている。", +"start": 315.508, +"end": 318.356 +}, +{ +"text": "見うちの筋肉は物物する、もう早い、とんも余裕ができる刺激となったから、", +"start": 318.356, +"end": 325.332 +}, +{ +"text": "やむおえずしっけいして、両わしを前へ、存分のして、", +"start": 325.332, +"end": 330.644 +}, +{ +"text": "首を引く苦しだして。", +"start": 330.644, +"end": 332.692 +}, +{ +"text": "おーとダイナルは首をした。", +"start": 333.28, +"end": 335.988 +}, +{ +"text": "さて、こうなってみると、もうお隣しくしていても仕方がない。", +"start": 336.54, +"end": 342.484 +}, +{ +"text": "どわせ主人の予定はぶちこわしたのだから、", +"start": 342.484, +"end": 346.12 +}, +{ +"text": "ついでに裏へ行ってようをたそうと思って、のそもそ入だした。", +"start": 346.12, +"end": 351.348 +}, +{ +"text": "すると主人は、質望といかりをかき混ぜたような声をして、ざしきのなかから、このバーカイアローを届だった。", +"start": 351.4, +"end": 360.852 +}, +{ +"text": "この主人は人をのしる時は必ずばかやろうというのが癖で、", +"start": 360.852, +"end": 366.644 +}, +{ +"text": "他に悪くちのいいようを知らないのだからしかだがないが、", +"start": 366.644, +"end": 370.772 +}, +{ +"text": "今まで心募した人の気も知らないで、むやみにばかやろうよばわりはしっけいだと思う。", +"start": 370.772, +"end": 377.34 +}, +{ +"text": "それも、平静王が、", +"start": 377.8, +"end": 380.84 +}, +{ +"text": "これの背中へ乗る時に、少しはいい顔でもするなら、このまんばもあまんじて受けるが、", +"start": 380.84, +"end": 387.7 +}, +{ +"text": "こっちの便利になることは、何人一つ心よくしてくれたこともないのに、", +"start": 387.7, +"end": 393.364 +}, +{ +"text": "商便に立ったのをばかやろうとはひどい。", +"start": 393.364, +"end": 397.076 +}, +{ +"text": "がんだい人間というものは、", +"start": 397.076, +"end": 399.348 +}, +{ +"text": "事故の理器でおにまじて、みんな状況して、", +"start": 399.348, +"end": 403.34 +}, +{ +"text": "少し人間より強いものが出てきて、いじめてやらなくては、", +"start": 403.34, +"end": 407.924 +}, +{ +"text": "この先どこまで状況するかわからない。", +"start": 407.924, +"end": 411.124 +}, +{ +"text": "わがまま、このくらいならがまんするが、", +"start": 411.46, +"end": 414.868 +}, +{ +"text": "わがいは人間の太区について、これよりもうすばい悲しむべき報道を耳にしたことがある。", +"start": 414.868, +"end": 422.804 +}, +{ +"text": "お互いの家の裏にとつぼばかりの茶園がある 広くはないがサッパリとした心持ちよく日の当たるところだ", +"start": 423.904, +"end": 435.4 +}, +{ +"text": "うちの子どもがあまりさわいて", +"start": 435.4, +"end": 438.00399999999996 +}, +{ +"text": " ラクラクヒルネの出来ないときはあまり体積で払かげんのよくないよりなどは 互いはいつでもここへ出て構園の気をやしなうのが例である", +"start": 438.00399999999996, +"end": 449.484 +}, +{ +"text": "あるこはるのおだやかな日の日子のらであったが、", +"start": 449.72799999999995, +"end": 454.31199999999995 +}, +{ +"text": "おまいは中半後、", +"start": 454.31199999999995, +"end": 456.2 +}, +{ +"text": "心よくいっすい下のち、", +"start": 456.2, +"end": 458.344 +}, +{ +"text": "運動方々、このチャエンゲート方を破壊した。", +"start": 458.344, +"end": 462.63199999999995 +}, +{ +"text": "茶の木のネを一本一本書きながら、", +"start": 462.844, +"end": 466.91999999999996 +}, +{ +"text": "日子側の次が木のそばまでくると、カレーにくを押したわして、", +"start": 466.91999999999996, +"end": 472.26399999999995 +}, +{ +"text": "その上に大きなネコが全語深く認めている。", +"start": 472.544, +"end": 477.0 +}, +{ +"text": "これは、ワワワワイの近づくのもいい?", +"start": 477.37399999999997, +"end": 480.84 +}, +{ +"text": "こう、こころずかざるごとく。", +"start": 480.84, +"end": 482.74399999999997 +}, +{ +"text": "また、こころずくもむとんじゃくなるごとく。", +"start": 482.74399999999997, +"end": 486.024 +}, +{ +"text": "大きなイビキをして、", +"start": 486.024, +"end": 487.68399999999997 +}, +{ +"text": "のまのがと体を予いと寝むっている。", +"start": 487.68399999999997, +"end": 490.604 +}, +{ +"text": "人の天内にしのビーリータルものが、", +"start": 490.864, +"end": 494.472 +}, +{ +"text": "隠まで平気に寝られるものかと、", +"start": 494.472, +"end": 497.924 +}, +{ +"text": "ワワハンは一緒かに、", +"start": 497.924, +"end": 499.604 +}, +{ +"text": "その代端なる度共に踊るかざるがえなかった。", +"start": 499.604, +"end": 503.43199999999996 +}, +{ +"text": "彼は順水の黒ネコである", +"start": 504.096, +"end": 507.94399999999996 +}, +{ +"text": "わずかにゴースにたる対応は透明なる構成", +"start": 508.0, +"end": 513.124 +}, +{ +"text": "を彼のヒーフの上に", +"start": 513.124, +"end": 514.8439999999999 +}, +{ +"text": "長いかけてキラキラするにこげの間より目に見えの方の", +"start": 514.8439999999999, +"end": 519.9639999999999 +}, +{ +"text": "でももうえいずれように思われた", +"start": 519.9639999999999, +"end": 522.664 +}, +{ +"text": "彼はネコチューの大応とも言うべきほどの", +"start": 522.752, +"end": 527.4639999999999 +}, +{ +"text": "移動いのる対格を言うしている", +"start": 527.4639999999999, +"end": 529.96 +}, +{ +"text": "ワガハイの場合は確かにある。", +"start": 529.96, +"end": 533.384 +}, +{ +"text": "ワガハイは探証の年と攻撃の心に前後忘れて、", +"start": 533.424, +"end": 538.216 +}, +{ +"text": "カレーの前に丁立して、4年もなく流れていると、", +"start": 538.216, +"end": 542.856 +}, +{ +"text": "静かなるコハルの風がすぎがきの上から出たる、", +"start": 542.856, +"end": 548.328 +}, +{ +"text": "ご頭の枝を軽くさそってバラバラと2、3枚の花、", +"start": 548.328, +"end": 553.48 +}, +{ +"text": "コレギクの刺激に落ちた。", +"start": 553.48, +"end": 555.592 +}, +{ +"text": "代曜はカッとそのままるの目を開いた", +"start": 555.592, +"end": 560.304 +}, +{ +"text": " 今でも記憶している", +"start": 560.304, +"end": 562.312 +}, +{ +"text": "その目は人間の尽調するコファクというものよりも 歯るかに美しく考えていた", +"start": 562.644, +"end": 570.5039999999999 +}, +{ +"text": "彼は身を起きもしない", +"start": 570.5039999999999, +"end": 572.904 +}, +{ +"text": "そぼうの奥からいるのとき光を わがはいの愛想をなるしたいの上に集めて", +"start": 572.904, +"end": 579.944 +}, +{ +"text": "おめえはいったいなんだといった", +"start": 579.944, +"end": 583.432 +}, +{ +"text": "だいをおにしては少しお言葉がいやしいと思ったま", +"start": 583.432, +"end": 587.848 +}, +{ +"text": "何しろその声のそこに", +"start": 587.848, +"end": 590.424 +}, +{ +"text": "意味をもしんぐべき力が困っているので", +"start": 590.424, +"end": 594.024 +}, +{ +"text": "おまいは少なこらずを恐れを抱いた", +"start": 594.024, +"end": 596.872 +}, +{ +"text": "しかし 愛札をしないと懸飲んだと思ったから", +"start": 596.872, +"end": 601.928 +}, +{ +"text": "おまいは", +"start": 602.3679999999999, +"end": 604.168 +}, +{ +"text": "猫である", +"start": 604.168, +"end": 605.512 +}, +{ +"text": "名前はまだない", +"start": 605.512, +"end": 607.4639999999999 +}, +{ +"text": "となるべく平気を予想を照ってれずんと答えた", +"start": 607.4639999999999, +"end": 611.3679999999999 +}, +{ +"text": "しかしこのとき、", +"start": 611.7239999999999, +"end": 614.024 +}, +{ +"text": " わが日の心臓は確かに平時よりも 方向しく子供してこった。", +"start": 614.024, +"end": 619.544 +}, +{ +"text": "彼は多いに 経営する調子で、", +"start": 619.7239999999999, +"end": 623.3679999999999 +}, +{ +"text": "なに、", +"start": 623.3679999999999, +"end": 624.68 +}, +{ +"text": "ネコだ?", +"start": 624.68, +"end": 626.184 +}, +{ +"text": "ネコが聞いてあげれろ。", +"start": 626.184, +"end": 628.68 +}, +{ +"text": " 全てどこに住んでるんだ。", +"start": 628.68, +"end": 631.154 +}, +{ +"text": "ついぶん、ポーチャクプチンである。", +"start": 631.154, +"end": 633.672 +}, +{ +"text": "わがいは、", +"start": 634.184, +"end": 635.784 +}, +{ +"text": " 国の教師のうちにいるのだ。", +"start": 635.924, +"end": 638.4839999999999 +}, +{ +"text": "だあせそんなかとだらだと思った", +"start": 639.04, +"end": 642.3879999999999 +}, +{ +"text": "やにやせてるじゃねぇが", +"start": 642.3879999999999, +"end": 644.616 +}, +{ +"text": "とだいをだけに消えんを吹きかける", +"start": 644.616, +"end": 647.624 +}, +{ +"text": "言葉つきからさすると", +"start": 647.624, +"end": 650.264 +}, +{ +"text": "どうも量かのネコとも思われな", +"start": 650.264, +"end": 653.288 +}, +{ +"text": "しかしそのアブラギって", +"start": 653.288, +"end": 656.024 +}, +{ +"text": "ひまにしているところを見ると", +"start": 656.024, +"end": 658.2439999999999 +}, +{ +"text": "ごちそうくってらしい", +"start": 658.2439999999999, +"end": 660.3919999999999 +}, +{ +"text": "豊かに暮らしているらしい", +"start": 660.3919999999999, +"end": 662.9839999999999 +}, +{ +"text": "わーは", +"start": 662.9839999999999, +"end": 664.264 +}, +{ +"text": "そういう決めはいっぱい誰だい", +"start": 664.264, +"end": 667.264 +}, +{ +"text": "ときこぞる声のかった。", +"start": 667.264, +"end": 669.064 +}, +{ +"text": "俺は来る前野の黒いよ。", +"start": 669.884, +"end": 673.16 +}, +{ +"text": "こぜんたるものだ。", +"start": 673.364, +"end": 675.816 +}, +{ +"text": "黒前野の黒はこのキンペンで知らぬものなきらんぼう猫猫である。", +"start": 676.544, +"end": 682.2159999999999 +}, +{ +"text": "しかし、来る前野だけに強いばかりでちとも強いくがないから、", +"start": 682.444, +"end": 687.848 +}, +{ +"text": "あまり誰も考察しない。", +"start": 687.848, +"end": 689.992 +}, +{ +"text": "労命経営宿のまとになっているやつだ。", +"start": 689.992, +"end": 693.768 +}, +{ +"text": "我が入りは彼の名を聞いて、", +"start": 693.768, +"end": 696.328 +}, +{ +"text": "少少し知りこそばよき感じを起こすと同時に、一方では少少し大きい部の年も少事だのである。", +"start": 696.328, +"end": 704.712 +}, +{ +"text": "我が入りはまず、", +"start": 704.712, +"end": 706.554 +}, +{ +"text": "彼がどのくらいムーガクであるかを試してみようと思って、", +"start": 706.554, +"end": 711.1759999999999 +}, +{ +"text": "さのモンドをしてみた。", +"start": 711.1759999999999, +"end": 713.124 +}, +{ +"text": "一体、", +"start": 714.204, +"end": 715.664 +}, +{ +"text": "車屋と教室とはどっちがいらいだろう。", +"start": 715.664, +"end": 719.4839999999999 +}, +{ +"text": "車屋の方が強いに決まってらな。", +"start": 719.804, +"end": 723.496 +}, +{ +"text": "お姉のうちの主人を見ね、まるでほねとかばかりだぜ。", +"start": 723.496, +"end": 728.5519999999999 +}, +{ +"text": "君も車屋の猫だけに大物要そうだ。", +"start": 728.944, +"end": 733.2239999999999 +}, +{ +"text": "車屋にいると、ごちそうがくえると見えるね。", +"start": 733.364, +"end": 737.576 +}, +{ +"text": "なあに、", +"start": 738.0039999999999, +"end": 739.816 +}, +{ +"text": "俺なんじゃどこのくに行ったって食い物に不自由はしねえずもりだ。", +"start": 739.816, +"end": 744.68 +}, +{ +"text": "お雨なんかも、シャバーたけばかりグルグルマっていねえで、ちっと俺の後へくっついて来てみねえ。", +"start": 744.68, +"end": 752.584 +}, +{ +"text": "ひとつきと戦えをじに道がえるように太れるね。", +"start": 752.584, +"end": 756.712 +}, +{ +"text": "おって、そう願うことにしよう。", +"start": 757.2439999999999, +"end": 760.584 +}, +{ +"text": "しかし、うちは共識の方が車やより、", +"start": 760.584, +"end": 764.9359999999999 +}, +{ +"text": "大きいのに住んでるように思われる。", +"start": 764.9359999999999, +"end": 767.24 +}, +{ +"text": "ベータパーねーうちなんかイグラをひたって腹の出しになるもんが", +"start": 767.24, +"end": 772.9359999999999 +}, +{ +"text": "彼は多いに関石に触った様子で", +"start": 772.9359999999999, +"end": 776.808 +}, +{ +"text": "関地くおそいだような耳をしっきりとピクつかせて", +"start": 776.808, +"end": 781.588 +}, +{ +"text": "おろろかに立ちさった", +"start": 781.588, +"end": 783.4 +}, +{ +"text": "お腹はいいが車屋の黒と地気になったのはこれからでやる", +"start": 783.584, +"end": 791.0039999999999 +}, +{ +"text": "その後お腹はいいはたびたび黒と回行する", +"start": 791.0039999999999, +"end": 794.856 +}, +{ +"text": "回復をすることに彼は車や相当の危険を惑う。", +"start": 794.856, +"end": 799.924 +}, +{ +"text": "先に穴入が耳にしたという復族事件も実は黒から聞いたので。", +"start": 799.924, +"end": 806.324 +}, +{ +"text": "ある日、レーのごとく側がハイトクロは、あたたかい茶葉だけの中でネコロビながら、いろいろ雑談をしていると、", +"start": 807.804, +"end": 816.424 +}, +{ +"text": "彼はいつもの自慢バランシをさも新しそうに繰り返した後で、", +"start": 816.424, +"end": 821.5759999999999 +}, +{ +"text": "ワーハイに向かって死ものごとく質問でした。", +"start": 821.5759999999999, +"end": 824.872 +}, +{ +"text": "お姉は今まで", +"start": 825.856, +"end": 828.2439999999999 +}, +{ +"text": "にネズミを何弁き取ったことがある。", +"start": 828.2439999999999, +"end": 831.144 +}, +{ +"text": "知識は黒よりも幼働発達しているつもりだが、", +"start": 831.6039999999999, +"end": 836.136 +}, +{ +"text": "満力と言う人にいたっては、当て黒の比較にはならないと確もしていたものの。", +"start": 836.2239999999999, +"end": 843.2239999999999 +}, +{ +"text": "このといみせしたる時はさすがに決まりがよくはなかった。", +"start": 843.3639999999999, +"end": 848.6479999999999 +}, +{ +"text": "けれども、", +"start": 849.4639999999999, +"end": 851.048 +}, +{ +"text": "事実は事実でいつわるわけには言うかないから。", +"start": 851.048, +"end": 854.5039999999999 +}, +{ +"text": "笑いは、", +"start": 854.5039999999999, +"end": 856.072 +}, +{ +"text": "実は、", +"start": 856.072, +"end": 857.64 +}, +{ +"text": "トロをトロをと思ってまだとらないと答えた。", +"start": 857.64, +"end": 861.304 +}, +{ +"text": "黒は、", +"start": 861.5039999999999, +"end": 862.952 +}, +{ +"text": "これの花の先からピンと突っ張っている長い日によを、ビリビリとフロアせて、", +"start": 862.952, +"end": 869.096 +}, +{ +"text": "非常に笑った。", +"start": 869.096, +"end": 870.6959999999999 +}, +{ +"text": "ガンダイ、クロは自慢をするだけにどこか足りないところがあって、", +"start": 870.6959999999999, +"end": 876.6239999999999 +}, +{ +"text": "彼の綺麗を感信したように、", +"start": 876.6239999999999, +"end": 879.24 +}, +{ +"text": "ノードを頃ころならして緊張していれば、鼻肌気をしやすいね、こでやる。", +"start": 879.24, +"end": 885.384 +}, +{ +"text": "おばあいは、", +"start": 885.384, +"end": 886.384 +}, +{ +"text": "これと近づきになってから、数にこの呼吸を飲み込んだから、この場合にも、", +"start": 886.384, +"end": 891.944 +}, +{ +"text": "たまじ、おのれを便合して、", +"start": 891.944, +"end": 894.6959999999999 +}, +{ +"text": "マスマス形成を悪くするのもぐである。", +"start": 894.6959999999999, +"end": 897.6719999999999 +}, +{ +"text": "一緒のこと、", +"start": 897.7239999999999, +"end": 899.414 +}, +{ +"text": "彼に自慢の手がらばなしを喋らして、", +"start": 899.414, +"end": 902.664 +}, +{ +"text": "お茶を似ごすにしくはないとシアンをさらめた。", +"start": 902.664, +"end": 907.304 +}, +{ +"text": "そこでお隣しく、", +"start": 908.0319999999999, +"end": 910.4399999999999 +}, +{ +"text": "君などは、としがとしであるから、ダイブとったら、", +"start": 910.4399999999999, +"end": 915.304 +}, +{ +"text": "とそそのかしてみた。", +"start": 915.304, +"end": 917.16 +}, +{ +"text": "こずん彼は処平気の決勝にとっかんしてきた", +"start": 917.16, +"end": 921.6719999999999 +}, +{ +"text": "だんとでもねーがサインシジューはとったらとは特意園なる彼の答えであった", +"start": 922.084, +"end": 929.304 +}, +{ +"text": "彼は何をご映すがてねーずみの100円に役は一人でいつでも引き上げるが", +"start": 929.304, +"end": 936.634 +}, +{ +"text": "いたちって朝手にはわねー一度一地に向かってひどい目にあった", +"start": 936.634, +"end": 942.7919999999999 +}, +{ +"text": "へーなるほどと愛ずちをうつ", +"start": 942.7919999999999, +"end": 947.028 +}, +{ +"text": "黒大きな目をパチつかせて言う", +"start": 947.028, +"end": 950.2639999999999 +}, +{ +"text": "今日年の大阪に名たぎだ", +"start": 950.2639999999999, +"end": 952.9359999999999 +}, +{ +"text": "うちのテーションがいしばいいの袋を持って", +"start": 952.9359999999999, +"end": 956.564 +}, +{ +"text": "円の下へ入り込んだら", +"start": 956.564, +"end": 958.564 +}, +{ +"text": "おめ、", +"start": 958.564, +"end": 959.528 +}, +{ +"text": "大きないたちのやろんは", +"start": 959.528, +"end": 961.2639999999999 +}, +{ +"text": "メンクロって飛び出したと思いね", +"start": 961.2639999999999, +"end": 963.7199999999999 +}, +{ +"text": "はぁぁ", +"start": 963.7199999999999, +"end": 965.0239999999999 +}, +{ +"text": "とかんしんしてみせ", +"start": 965.0239999999999, +"end": 966.92 +}, +{ +"text": "いたちって言けども", +"start": 967.9639999999999, +"end": 970.2919999999999 +}, +{ +"text": "何粒水の少し大きいぐれいなもらった", +"start": 970.2919999999999, +"end": 973.3199999999999 +}, +{ +"text": "こんちくしゃーってきれおっかげで", +"start": 973.3199999999999, +"end": 976.18 +}, +{ +"text": "とーっとドブの中へ追い込んだと思いね", +"start": 976.18, +"end": 979.8159999999999 +}, +{ +"text": "うまくやったね", +"start": 979.8159999999999, +"end": 981.928 +}, +{ +"text": "どこかっさいしてよ", +"start": 981.928, +"end": 983.544 +}, +{ +"text": "トークゴロガメイザって何になると", +"start": 983.584, +"end": 987.064 +}, +{ +"text": "休む最後べこぎやった", +"start": 987.064, +"end": 989.512 +}, +{ +"text": "くっせーのくさくねえのって", +"start": 989.512, +"end": 992.404 +}, +{ +"text": "それからってもらいたちを編みると胸が悪くなら", +"start": 992.404, +"end": 996.776 +}, +{ +"text": "彼はここにいたって", +"start": 997.568, +"end": 1000.584 +}, +{ +"text": "あたかもきょう年の周期を今のコンズルごとく、", +"start": 1000.584, +"end": 1004.712 +}, +{ +"text": "もいを仕上げて、 ハノノアとも2-3弁な出ました。", +"start": 1004.712, +"end": 1008.7439999999999 +}, +{ +"text": "お前も少しお気のどくな感じがする。", +"start": 1008.8439999999999, +"end": 1012.1039999999999 +}, +{ +"text": "ちっと経験をつけてやろうと思って、", +"start": 1012.284, +"end": 1015.336 +}, +{ +"text": "しかしネズミなな、", +"start": 1015.336, +"end": 1017.544 +}, +{ +"text": " 君にニラマルテは100年目だろ、", +"start": 1017.544, +"end": 1020.3919999999999 +}, +{ +"text": "君はあまりネズミを取るのがメージんで、", +"start": 1020.3919999999999, +"end": 1023.324 +}, +{ +"text": "ネズミばかりくうものだから、", +"start": 1023.384, +"end": 1025.884 +}, +{ +"text": "そんなに人っていろつやがいいのだろ。", +"start": 1025.884, +"end": 1028.648 +}, +{ +"text": "黒のご企業を取るためのこの質問は、", +"start": 1029.504, +"end": 1033.3519999999999 +}, +{ +"text": " シニにも反対の結果を提出した、", +"start": 1033.384, +"end": 1036.712 +}, +{ +"text": " これは記憶として対策している。", +"start": 1036.712, +"end": 1039.4959999999999 +}, +{ +"text": "関係らとつまらね、", +"start": 1040.404, +"end": 1042.856 +}, +{ +"text": " いくらかせでネズミを取っとって、", +"start": 1042.856, +"end": 1045.96 +}, +{ +"text": " 言って、人間ほどふてやざいをのながにいねえぜ、", +"start": 1045.96, +"end": 1050.152 +}, +{ +"text": " 人の取ったネズミをみんの取り予言をあって、 コーバイを持っていきやら、", +"start": 1050.184, +"end": 1055.2839999999999 +}, +{ +"text": "コーバンじゃ誰が取ったかわからないから その短びに合戦図をくれるじゃないか", +"start": 1055.2839999999999, +"end": 1061.864 +}, +{ +"text": "うちのテイショナンが俺のおかげでもう一緒にご実践くらいもおけてやがるくせに", +"start": 1061.864, +"end": 1068.004 +}, +{ +"text": "ロークなものが壊せたこともあるやしね 人間でもな", +"start": 1068.004, +"end": 1074.056 +}, +{ +"text": "てのいいドロボーだぜ", +"start": 1074.056, +"end": 1076.52 +}, +{ +"text": "さすがむ学の黒もこのくらいのリクツが分かると見えて", +"start": 1077.536, +"end": 1083.214 +}, +{ +"text": " スカウブルおこった様子で背中の毛を刺かだてている", +"start": 1083.214, +"end": 1087.884 +}, +{ +"text": "おまいは少所を君が悪くなったから いい画現にその場をごまかして打ちへ帰った", +"start": 1088.032, +"end": 1095.208 +}, +{ +"text": "この時から わなはいは決してネズミを捉まいと決心した", +"start": 1096.7359999999999, +"end": 1102.248 +}, +{ +"text": "しかし、", +"start": 1102.464, +"end": 1104.168 +}, +{ +"text": "ふろのこぶんになって、", +"start": 1104.168, +"end": 1106.536 +}, +{ +"text": "ネズミ以外のごちそうを挟って歩くこともしなかった。", +"start": 1106.536, +"end": 1110.664 +}, +{ +"text": "ごちそうくやりも寝ていたほうがキラクディ、", +"start": 1110.704, +"end": 1115.204 +}, +{ +"text": "教師のうちにいると、ねこも教師のような性質になると見える。", +"start": 1115.204, +"end": 1121.192 +}, +{ +"text": "予定しないと、今に、", +"start": 1121.344, +"end": 1124.648 +}, +{ +"text": "いざくになるかもしれない。", +"start": 1124.648, +"end": 1127.144 +} +], +"paragraphs": [ +"吾輩は人間と同居して彼等を観察すればするほど、彼等は我儘なものだと断言せざるを得ないようになった。ことに吾輩が時々同衾する小供のごときに至っては言語同断である。自分の勝手な時は人を逆さにしたり、頭へ袋をかぶせたり、抛り出したり、へっついの中へ押し込んだりする。しかも吾輩の方で少しでも手出しをしようものなら家内総がかりで追い廻して迫害を加える。この間もちょっと畳で爪を磨いだら細君が非常に怒ってそれから容易に座敷へ入れない。台所の板の間で他が顫えていても一向平気なものである。吾輩の尊敬する筋向の白君などは逢う度毎に人間ほど不人情なものはないと言っておらるる。白君は先日玉のような子猫を四疋産まれたのである。ところがそこの家の書生が三日目にそいつを裏の池へ持って行って四疋ながら棄てて来たそうだ。白君は涙を流してその一部始終を話した上、どうしても我等猫族が親子の愛を完くして美しい家族的生活をするには人間と戦ってこれを剿滅せねばならぬといわれた。一々もっともの議論と思う。また隣りの三毛君などは人間が所有権という事を解していないといって大に憤慨している。元来我々同族間では目刺の頭でも鰡の臍でも一番先に見付けたものがこれを食う権利があるものとなっている。もし相手がこの規約を守らなければ腕力に訴えて善いくらいのものだ。しかるに彼等人間は毫もこの観念がないと見えて我等が見付けた御馳走は必ず彼等のために掠奪せらるるのである。彼等はその強力を頼んで正当に吾人が食い得べきものを奪ってすましている。白君は軍人の家におり三毛君は代言の主人を持っている。吾輩は教師の家に住んでいるだけ、こんな事に関すると両君よりもむしろ楽天である。ただその日その日がどうにかこうにか送られればよい。いくら人間だって、そういつまでも栄える事もあるまい。まあ気を永く猫の時節を待つがよかろう。", +"我儘で思い出したからちょっと吾輩の家の主人がこの我儘で失敗した話をしよう。元来この主人は何といって人に勝れて出来る事もないが、何にでもよく手を出したがる。俳句をやってほととぎすへ投書をしたり、新体詩を明星へ出したり、間違いだらけの英文をかいたり、時によると弓に凝ったり、謡を習ったり、またあるときはヴァイオリンなどをブーブー鳴らしたりするが、気の毒な事には、どれもこれも物になっておらん。その癖やり出すと胃弱の癖にいやに熱心だ。後架の中で謡をうたって、近所で後架先生と渾名をつけられているにも関せず一向平気なもので、やはりこれは平の宗盛にて候を繰返している。みんながそら宗盛だと吹き出すくらいである。この主人がどういう考になったものか吾輩の住み込んでから一月ばかり後のある月の月給日に、大きな包みを提げてあわただしく帰って来た。何を買って来たのかと思うと水彩絵具と毛筆とワットマンという紙で今日から謡や俳句をやめて絵をかく決心と見えた。果して翌日から当分の間というものは毎日毎日書斎で昼寝もしないで絵ばかりかいている。しかしそのかき上げたものを見ると何をかいたものやら誰にも鑑定がつかない。当人もあまり甘くないと思ったものか、ある日その友人で美学とかをやっている人が来た時に下のような話をしているのを聞いた。", +"「どうも甘くかけないものだね。人のを見ると何でもないようだが自ら筆をとって見ると今更のようにむずかしく感ずる」これは主人の述懐である。なるほど詐りのない処だ。彼の友は金縁の眼鏡越に主人の顔を見ながら、「そう初めから上手にはかけないさ、第一室内の想像ばかりで画がかける訳のものではない。昔し以太利の大家アンドレア・デル・サルトが言った事がある。画をかくなら何でも自然その物を写せ。天に星辰あり。地に露華あり。飛ぶに禽あり。走るに獣あり。池に金魚あり。枯木に寒鴉あり。自然はこれ一幅の大活画なりと。どうだ君も画らしい画をかこうと思うならちと写生をしたら」", +"「へえアンドレア・デル・サルトがそんな事をいった事があるかい。ちっとも知らなかった。なるほどこりゃもっともだ。実にその通りだ」と主人は無暗に感心している。金縁の裏には嘲けるような笑が見えた。", +"その翌日吾輩は例のごとく椽側に出て心持善く昼寝をしていたら、主人が例になく書斎から出て来て吾輩の後ろで何かしきりにやっている。ふと眼が覚めて何をしているかと一分ばかり細目に眼をあけて見ると、彼は余念もなくアンドレア・デル・サルトを極め込んでいる。吾輩はこの有様を見て覚えず失笑するのを禁じ得なかった。彼は彼の友に揶揄せられたる結果としてまず手初めに吾輩を写生しつつあるのである。吾輩はすでに十分寝た。欠伸がしたくてたまらない。しかしせっかく主人が熱心に筆を執っているのを動いては気の毒だと思って、じっと辛棒しておった。彼は今吾輩の輪廓をかき上げて顔のあたりを色彩っている。吾輩は自白する。吾輩は猫として決して上乗の出来ではない。背といい毛並といい顔の造作といいあえて他の猫に勝るとは決して思っておらん。しかしいくら不器量の吾輩でも、今吾輩の主人に描き出されつつあるような妙な姿とは、どうしても思われない。第一色が違う。吾輩は波斯産の猫のごとく黄を含める淡灰色に漆のごとき斑入りの皮膚を有している。これだけは誰が見ても疑うべからざる事実と思う。しかるに今主人の彩色を見ると、黄でもなければ黒でもない、灰色でもなければ褐色でもない、さればとてこれらを交ぜた色でもない。ただ一種の色であるというよりほかに評し方のない色である。その上不思議な事は眼がない。もっともこれは寝ているところを写生したのだから無理もないが眼らしい所さえ見えないから盲猫だか寝ている猫だか判然しないのである。吾輩は心中ひそかにいくらアンドレア・デル・サルトでもこれではしようがないと思った。しかしその熱心には感服せざるを得ない。なるべくなら動かずにおってやりたいと思ったが、さっきから小便が催うしている。身内の筋肉はむずむずする。最早一分も猶予が出来ぬ仕儀となったから、やむをえず失敬して両足を前へ存分のして、首を低く押し出してあーあと大なる欠伸をした。さてこうなって見ると、もうおとなしくしていても仕方がない。どうせ主人の予定は打ち壊わしたのだから、ついでに裏へ行って用を足そうと思ってのそのそ這い出した。すると主人は失望と怒りを掻き交ぜたような声をして、座敷の中から「この馬鹿野郎」と怒鳴った。この主人は人を罵るときは必ず馬鹿野郎というのが癖である。ほかに悪口の言いようを知らないのだから仕方がないが、今まで辛棒した人の気も知らないで、無暗に馬鹿野郎呼わりは失敬だと思う。それも平生吾輩が彼の背中へ乗る時に少しは好い顔でもするならこの漫罵も甘んじて受けるが、こっちの便利になる事は何一つ快くしてくれた事もないのに、小便に立ったのを馬鹿野郎とは酷い。元来人間というものは自己の力量に慢じてみんな増長している。少し人間より強いものが出て来て窘めてやらなくてはこの先どこまで増長するか分らない。", +"我儘もこのくらいなら我慢するが吾輩は人間の不徳についてこれよりも数倍悲しむべき報道を耳にした事がある。", +"吾輩の家の裏に十坪ばかりの茶園がある。広くはないが瀟洒とした心持ち好く日の当る所だ。うちの小供があまり騒いで楽々昼寝の出来ない時や、あまり退屈で腹加減のよくない折などは、吾輩はいつでもここへ出て浩然の気を養うのが例である。ある小春の穏かな日の二時頃であったが、吾輩は昼飯後快よく一睡した後、運動かたがたこの茶園へと歩を運ばした。茶の木の根を一本一本嗅ぎながら、西側の杉垣のそばまでくると、枯菊を押し倒してその上に大きな猫が前後不覚に寝ている。彼は吾輩の近づくのも一向心付かざるごとく、また心付くも無頓着なるごとく、大きな鼾をして長々と体を横えて眠っている。他の庭内に忍び入りたるものがかくまで平気に睡られるものかと、吾輩は窃かにその大胆なる度胸に驚かざるを得なかった。彼は純粋の黒猫である。わずかに午を過ぎたる太陽は、透明なる光線を彼の皮膚の上に抛げかけて、きらきらする柔毛の間より眼に見えぬ炎でも燃え出ずるように思われた。彼は猫中の大王とも云うべきほどの偉大なる体格を有している。吾輩の倍はたしかにある。吾輩は嘆賞の念と、好奇の心に前後を忘れて彼の前に佇立して余念もなく眺めていると、静かなる小春の風が、杉垣の上から出たる梧桐の枝を軽く誘ってばらばらと二三枚の葉が枯菊の茂みに落ちた。大王はかっとその真丸の眼を開いた。今でも記憶している。その眼は人間の珍重する琥珀というものよりも遥かに美しく輝いていた。彼は身動きもしない。双眸の奥から射るごとき光を吾輩の矮小なる額の上にあつめて、御めえは一体何だと云った。大王にしては少々言葉が卑しいと思ったが何しろその声の底に犬をも挫しぐべき力が籠っているので吾輩は少なからず恐れを抱いた。しかし挨拶をしないと険呑だと思ったから「吾輩は猫である。名前はまだない」となるべく平気を装って冷然と答えた。しかしこの時吾輩の心臓はたしかに平時よりも烈しく鼓動しておった。彼は大に軽蔑せる調子で「何、猫だ? 猫が聞いてあきれらあ。全てえどこに住んでるんだ」随分傍若無人である。「吾輩はここの教師の家にいるのだ」「どうせそんな事だろうと思った。いやに瘠せてるじゃねえか」と大王だけに気焔を吹きかける。言葉付から察するとどうも良家の猫とも思われない。しかしその膏切って肥満しているところを見ると御馳走を食ってるらしい、豊かに暮しているらしい。吾輩は「そう云う君は一体誰だい」と聞かざるを得なかった。「己れあ車屋の黒よ」昂然たるものだ。車屋の黒はこの近辺で知らぬ者なき乱暴猫である。しかし車屋だけに強いばかりでちっとも教育がないからあまり誰も交際しない。同盟敬遠主義の的になっている奴だ。吾輩は彼の名を聞いて少々尻こそばゆき感じを起すと同時に、一方では少々軽侮の念も生じたのである。吾輩はまず彼がどのくらい無学であるかを試してみようと思って左の問答をして見た。", +"「一体車屋と教師とはどっちがえらいだろう」", +"「車屋の方が強いに極っていらあな。御めえのうちの主人を見ねえ、まるで骨と皮ばかりだぜ」", +"「君も車屋の猫だけに大分強そうだ。車屋にいると御馳走が食えると見えるね」", +"「何におれなんざ、どこの国へ行ったって食い物に不自由はしねえつもりだ。御めえなんかも茶畠ばかりぐるぐる廻っていねえで、ちっと己の後へくっ付いて来て見ねえ。一と月とたたねえうちに見違えるように太れるぜ」", +"「追ってそう願う事にしよう。しかし家は教師の方が車屋より大きいのに住んでいるように思われる」", +"「箆棒め、うちなんかいくら大きくたって腹の足しになるもんか」", +"彼は大に肝癪に障った様子で、寒竹をそいだような耳をしきりとぴく付かせてあららかに立ち去った。吾輩が車屋の黒と知己になったのはこれからである。", +"その後吾輩は度々黒と邂逅する。邂逅する毎に彼は車屋相当の気焔を吐く。先に吾輩が耳にしたという不徳事件も実は黒から聞いたのである。", +"或る日例のごとく吾輩と黒は暖かい茶畠の中で寝転びながらいろいろ雑談をしていると、彼はいつもの自慢話しをさも新しそうに繰り返したあとで、吾輩に向って下のごとく質問した。「御めえは今までに鼠を何匹とった事がある」智識は黒よりも余程発達しているつもりだが腕力と勇気とに至っては到底黒の比較にはならないと覚悟はしていたものの、この問に接したる時は、さすがに極りが善くはなかった。けれども事実は事実で詐る訳には行かないから、吾輩は「実はとろうとろうと思ってまだ捕らない」と答えた。黒は彼の鼻の先からぴんと突張っている長い髭をびりびりと震わせて非常に笑った。元来黒は自慢をする丈にどこか足りないところがあって、彼の気焔を感心したように咽喉をころころ鳴らして謹聴していればはなはだ御しやすい猫である。吾輩は彼と近付になってから直にこの呼吸を飲み込んだからこの場合にもなまじい己れを弁護してますます形勢をわるくするのも愚である、いっその事彼に自分の手柄話をしゃべらして御茶を濁すに若くはないと思案を定めた。そこでおとなしく「君などは年が年であるから大分とったろう」とそそのかして見た。果然彼は墻壁の欠所に吶喊して来た。「たんとでもねえが三四十はとったろう」とは得意気なる彼の答であった。彼はなお語をつづけて「鼠の百や二百は一人でいつでも引き受けるがいたちってえ奴は手に合わねえ。一度いたちに向って酷い目に逢った」「へえなるほど」と相槌を打つ。黒は大きな眼をぱちつかせて云う。「去年の大掃除の時だ。うちの亭主が石灰の袋を持って椽の下へ這い込んだら御めえ大きないたちの野郎が面喰って飛び出したと思いねえ」「ふん」と感心して見せる。「いたちってけども何鼠の少し大きいぐれえのものだ。こん畜生って気で追っかけてとうとう泥溝の中へ追い込んだと思いねえ」「うまくやったね」と喝采してやる。「ところが御めえいざってえ段になると奴め最後っ屁をこきゃがった。臭えの臭くねえのってそれからってえものはいたちを見ると胸が悪くならあ」彼はここに至ってあたかも去年の臭気を今なお感ずるごとく前足を揚げて鼻の頭を二三遍なで廻わした。吾輩も少々気の毒な感じがする。ちっと景気を付けてやろうと思って「しかし鼠なら君に睨まれては百年目だろう。君はあまり鼠を捕るのが名人で鼠ばかり食うものだからそんなに肥って色つやが善いのだろう」黒の御機嫌をとるためのこの質問は不思議にも反対の結果を呈出した。彼は喟然として大息していう。「考げえるとつまらねえ。いくら稼いで鼠をとったって――一てえ人間ほどふてえ奴は世の中にいねえぜ。人のとった鼠をみんな取り上げやがって交番へ持って行きゃあがる。交番じゃ誰が捕ったか分らねえからそのたんびに五銭ずつくれるじゃねえか。うちの亭主なんか己の御蔭でもう壱円五十銭くらい儲けていやがる癖に、碌なものを食わせた事もありゃしねえ。おい人間てものあ体の善い泥棒だぜ」さすが無学の黒もこのくらいの理窟はわかると見えてすこぶる怒った容子で背中の毛を逆立てている。吾輩は少々気味が悪くなったから善い加減にその場を胡魔化して家へ帰った。この時から吾輩は決して鼠をとるまいと決心した。しかし黒の子分になって鼠以外の御馳走を猟ってあるく事もしなかった。御馳走を食 [diff truncated]