[{"data":1,"prerenderedAt":712},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Fc-translate":46,"\u002Fblog\u002Fc-translate-surround":707},[4],{"title":5,"path":6,"stem":7,"children":8,"page":45},"Blog","\u002Fblog","blog",[9,13,17,21,25,29,33,37,41],{"title":10,"path":11,"stem":12},"Audio Augmentation Techniques for Deep Learning","\u002Fblog\u002Faudio-augmentation","blog\u002Faudio-augmentation",{"title":14,"path":15,"stem":16},"Speed Up Whisper with CTranslate2","\u002Fblog\u002Fc-translate","blog\u002Fc-translate",{"title":18,"path":19,"stem":20},"Calling C++ and Go from Dart using FFI","\u002Fblog\u002Fdart-ffi-native-bridge","blog\u002Fdart-ffi-native-bridge",{"title":22,"path":23,"stem":24},"Russey Keo High School Memories","\u002Fblog\u002Fmemory","blog\u002Fmemory",{"title":26,"path":27,"stem":28},"My Dev Setup: Same Keys Everywhere","\u002Fblog\u002Fmy-dev-setup","blog\u002Fmy-dev-setup",{"title":30,"path":31,"stem":32},"Data Extraction with LangChain and Ollama Locally","\u002Fblog\u002Fpydantic-llm","blog\u002Fpydantic-llm",{"title":34,"path":35,"stem":36},"7-Segment LED Display with Proteus Simulation","\u002Fblog\u002Fseven-segment","blog\u002Fseven-segment",{"title":38,"path":39,"stem":40},"Understanding JWT Refresh Token Rotation & Revocation","\u002Fblog\u002Funderstand-refresh-token","blog\u002Funderstand-refresh-token",{"title":42,"path":43,"stem":44},"Khmer Speech Recognition","\u002Fblog\u002Fwhisper","blog\u002Fwhisper",false,{"id":47,"title":14,"author":48,"body":52,"date":697,"description":698,"extension":699,"image":262,"meta":700,"minRead":121,"navigation":704,"path":15,"seo":705,"stem":16,"__hash__":706},"blog\u002Fblog\u002Fc-translate.md",{"name":49,"avatar":50},"Phanith LIM",{"src":51,"alt":49},"\u002Fmyprofile.jpg",{"type":53,"value":54,"toc":690},"minimark",[55,59,62,67,89,93,129,138,142,202,214,225,253,256,263,268,272,282,296,299,395,420,597,600,603,608,659,663,666,686],[56,57,58],"p",{},"Whisper transcribes well, but the Python implementation is slow and eats memory. That is a problem when the goal is Khmer transcription running on a cheap device, close to real time.",[56,60,61],{},"CTranslate2 fixes most of it. Here is the conversion I use on my own fine-tuned model.",[63,64,66],"h3",{"id":65},"what-faster-whisper-is","What faster-whisper is",[56,68,69,76,77,82,83,88],{},[70,71,75],"a",{"href":72,"rel":73},"https:\u002F\u002Fgithub.com\u002FSYSTRAN\u002Ffaster-whisper",[74],"nofollow","faster-whisper"," reimplements Whisper on top of ",[70,78,81],{"href":79,"rel":80},"https:\u002F\u002Fopennmt.net\u002FCTranslate2\u002Findex.html#",[74],"CTranslate2",", an inference engine for Transformer models. It runs up to 4x faster than ",[70,84,87],{"href":85,"rel":86},"https:\u002F\u002Fhuggingface.co\u002Fopenai\u002Fwhisper-tiny",[74],"openai\u002Fwhisper"," on less memory, and 8-bit quantization buys you more on both CPU and GPU.",[63,90,92],{"id":91},"step-1-install-the-converter","Step 1: Install the converter",[94,95,100],"pre",{"className":96,"code":97,"language":98,"meta":99,"style":99},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pip install transformers\npip install ctranslate2\n","bash","",[101,102,103,119],"code",{"__ignoreMap":99},[104,105,108,112,116],"span",{"class":106,"line":107},"line",1,[104,109,111],{"class":110},"sBMFI","pip",[104,113,115],{"class":114},"sfazB"," install",[104,117,118],{"class":114}," transformers\n",[104,120,122,124,126],{"class":106,"line":121},2,[104,123,111],{"class":110},[104,125,115],{"class":114},[104,127,128],{"class":114}," ctranslate2\n",[56,130,131,132,137],{},"CTranslate2 only supports a subset of Hugging Face Transformers models, so check that yours is ",[70,133,136],{"href":134,"rel":135},"https:\u002F\u002Fopennmt.net\u002FCTranslate2\u002Fguides\u002Ftransformers.html",[74],"on the list"," before you go further.",[63,139,141],{"id":140},"step-2-convert-the-model","Step 2: Convert the model",[94,143,145],{"className":96,"code":144,"language":98,"meta":99,"style":99},"ct2-transformers-converter --model \u003Cmodel_id> --output_dir \u003Coutput_path> --copy_files tokenizer_config.json --quantization \u003Ctypes>\n",[101,146,147],{"__ignoreMap":99},[104,148,149,152,155,159,162,166,169,172,174,177,180,182,185,188,191,193,196,199],{"class":106,"line":107},[104,150,151],{"class":110},"ct2-transformers-converter",[104,153,154],{"class":114}," --model",[104,156,158],{"class":157},"sMK4o"," \u003C",[104,160,161],{"class":114},"model_i",[104,163,165],{"class":164},"sTEyZ","d",[104,167,168],{"class":157},">",[104,170,171],{"class":114}," --output_dir",[104,173,158],{"class":157},[104,175,176],{"class":114},"output_pat",[104,178,179],{"class":164},"h",[104,181,168],{"class":157},[104,183,184],{"class":114}," --copy_files",[104,186,187],{"class":114}," tokenizer_config.json",[104,189,190],{"class":114}," --quantization",[104,192,158],{"class":157},[104,194,195],{"class":114},"type",[104,197,198],{"class":164},"s",[104,200,201],{"class":157},">\n",[56,203,204,207,208,213],{},[101,205,206],{},"--quantization int8"," is where the size and speed win comes from, and ",[70,209,212],{"href":210,"rel":211},"https:\u002F\u002Fopennmt.net\u002FCTranslate2\u002Fquantization.html",[74],"the docs explain the trade-off",".",[56,215,216,217,224],{},"For my fine-tuned model, ",[70,218,221],{"href":219,"rel":220},"https:\u002F\u002Fhuggingface.co\u002FPhanithLIM\u002Fwhisper-tiny-aug-29dec",[74],[101,222,223],{},"PhanithLIM\u002Fwhisper-tiny-aug-29dec",":",[94,226,228],{"className":96,"code":227,"language":98,"meta":99,"style":99},"ct2-transformers-converter --model PhanithLIM\u002Fwhisper-tiny-aug-29dec --output_dir whisper-tiny-int8 --copy_files tokenizer_config.json --quantization int8\n",[101,229,230],{"__ignoreMap":99},[104,231,232,234,236,239,241,244,246,248,250],{"class":106,"line":107},[104,233,151],{"class":110},[104,235,154],{"class":114},[104,237,238],{"class":114}," PhanithLIM\u002Fwhisper-tiny-aug-29dec",[104,240,171],{"class":114},[104,242,243],{"class":114}," whisper-tiny-int8",[104,245,184],{"class":114},[104,247,187],{"class":114},[104,249,190],{"class":114},[104,251,252],{"class":114}," int8\n",[56,254,255],{},"The converted model lands in the output directory:",[56,257,258],{},[259,260],"img",{"alt":261,"src":262},"Converted model files stored in the output directory","\u002Fblog\u002Fc-translate\u002Fimage1.png",[56,264,265],{},[266,267,261],"em",{},[63,269,271],{"id":270},"step-3-transcribe-something","Step 3: Transcribe something",[56,273,274,275,281],{},"Install ",[70,276,279],{"href":277,"rel":278},"https:\u002F\u002Fpypi.org\u002Fproject\u002Ffaster-whisper\u002F",[74],[101,280,75],{}," to run the converted model:",[94,283,285],{"className":96,"code":284,"language":98,"meta":99,"style":99},"pip install faster-whisper\n",[101,286,287],{"__ignoreMap":99},[104,288,289,291,293],{"class":106,"line":107},[104,290,111],{"class":110},[104,292,115],{"class":114},[104,294,295],{"class":114}," faster-whisper\n",[56,297,298],{},"Then point it at the local directory:",[94,300,304],{"className":301,"code":302,"language":303,"meta":99,"style":99},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from faster_whisper import WhisperModel\nmodel_size = \"\u002Fcontent\u002Fwhisper-tiny-int8\"\nmodel = WhisperModel(model_size, device=\"cpu\", compute_type=\"int8\", local_files_only=True)\n","python",[101,305,306,321,338],{"__ignoreMap":99},[104,307,308,312,315,318],{"class":106,"line":107},[104,309,311],{"class":310},"s7zQu","from",[104,313,314],{"class":164}," faster_whisper ",[104,316,317],{"class":310},"import",[104,319,320],{"class":164}," WhisperModel\n",[104,322,323,326,329,332,335],{"class":106,"line":121},[104,324,325],{"class":164},"model_size ",[104,327,328],{"class":157},"=",[104,330,331],{"class":157}," \"",[104,333,334],{"class":114},"\u002Fcontent\u002Fwhisper-tiny-int8",[104,336,337],{"class":157},"\"\n",[104,339,341,344,346,350,353,356,359,363,365,368,371,373,375,378,380,382,385,387,389,392],{"class":106,"line":340},3,[104,342,343],{"class":164},"model ",[104,345,328],{"class":157},[104,347,349],{"class":348},"s2Zo4"," WhisperModel",[104,351,352],{"class":157},"(",[104,354,355],{"class":348},"model_size",[104,357,358],{"class":157},",",[104,360,362],{"class":361},"sHdIc"," device",[104,364,328],{"class":157},[104,366,367],{"class":157},"\"",[104,369,370],{"class":114},"cpu",[104,372,367],{"class":157},[104,374,358],{"class":157},[104,376,377],{"class":361}," compute_type",[104,379,328],{"class":157},[104,381,367],{"class":157},[104,383,384],{"class":114},"int8",[104,386,367],{"class":157},[104,388,358],{"class":157},[104,390,391],{"class":361}," local_files_only",[104,393,394],{"class":157},"=True)\n",[396,397,398,404,413],"blockquote",{},[56,399,400],{},[401,402,403],"strong",{},"Local or Hugging Face",[56,405,406,409,410,213],{},[101,407,408],{},"local_files_only=True"," loads from the directory on disk. If you pushed the converted model to Hugging Face instead, set it to ",[101,411,412],{},"False",[56,414,415,416,419],{},"For GPU, change ",[101,417,418],{},"device=\"cuda\"",". The difference is large.",[94,421,423],{"className":301,"code":422,"language":303,"meta":99,"style":99},"segments, info = model.transcribe(\"\u002Fcontent\u002F1_0.wav\", beam_size=8)\nprint(\"Detected language '%s' with probability %f\" % (info.language, info.language_probability))\nfor segment in segments:\n    print(\"[%.2fs -> %.2fs] %s\" % (segment.start, segment.end, segment.text))\n",[101,424,425,468,519,536],{"__ignoreMap":99},[104,426,427,430,432,435,437,440,442,445,447,449,452,454,456,459,461,465],{"class":106,"line":107},[104,428,429],{"class":164},"segments",[104,431,358],{"class":157},[104,433,434],{"class":164}," info ",[104,436,328],{"class":157},[104,438,439],{"class":164}," model",[104,441,213],{"class":157},[104,443,444],{"class":348},"transcribe",[104,446,352],{"class":157},[104,448,367],{"class":157},[104,450,451],{"class":114},"\u002Fcontent\u002F1_0.wav",[104,453,367],{"class":157},[104,455,358],{"class":157},[104,457,458],{"class":361}," beam_size",[104,460,328],{"class":157},[104,462,464],{"class":463},"sbssI","8",[104,466,467],{"class":157},")\n",[104,469,470,473,475,477,480,483,486,489,491,494,497,500,502,506,508,511,513,516],{"class":106,"line":121},[104,471,472],{"class":348},"print",[104,474,352],{"class":157},[104,476,367],{"class":157},[104,478,479],{"class":114},"Detected language '",[104,481,482],{"class":463},"%s",[104,484,485],{"class":114},"' with probability ",[104,487,488],{"class":463},"%f",[104,490,367],{"class":157},[104,492,493],{"class":157}," %",[104,495,496],{"class":157}," (",[104,498,499],{"class":348},"info",[104,501,213],{"class":157},[104,503,505],{"class":504},"swJcz","language",[104,507,358],{"class":157},[104,509,510],{"class":348}," info",[104,512,213],{"class":157},[104,514,515],{"class":504},"language_probability",[104,517,518],{"class":157},"))\n",[104,520,521,524,527,530,533],{"class":106,"line":340},[104,522,523],{"class":310},"for",[104,525,526],{"class":164}," segment ",[104,528,529],{"class":310},"in",[104,531,532],{"class":164}," segments",[104,534,535],{"class":157},":\n",[104,537,539,542,544,546,549,552,555,557,560,562,564,566,568,571,573,576,578,581,583,586,588,590,592,595],{"class":106,"line":538},4,[104,540,541],{"class":348},"    print",[104,543,352],{"class":157},[104,545,367],{"class":157},[104,547,548],{"class":114},"[",[104,550,551],{"class":463},"%.2f",[104,553,554],{"class":114},"s -> ",[104,556,551],{"class":463},[104,558,559],{"class":114},"s] ",[104,561,482],{"class":463},[104,563,367],{"class":157},[104,565,493],{"class":157},[104,567,496],{"class":157},[104,569,570],{"class":348},"segment",[104,572,213],{"class":157},[104,574,575],{"class":504},"start",[104,577,358],{"class":157},[104,579,580],{"class":348}," segment",[104,582,213],{"class":157},[104,584,585],{"class":504},"end",[104,587,358],{"class":157},[104,589,580],{"class":348},[104,591,213],{"class":157},[104,593,594],{"class":504},"text",[104,596,518],{"class":157},[56,598,599],{},"On a 3 minute 2 second file this took 1 minute on CPU and 5 seconds on GPU.",[56,601,602],{},"The Khmer output itself is rough. That is not CTranslate2's fault: this is the tiny model trained on a small dataset, and the conversion keeps whatever accuracy you started with.",[56,604,605],{},[401,606,607],{},"Transcription output",[94,609,613],{"className":610,"code":611,"language":612,"meta":99,"style":99},"language-txt shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","Detected language 'km' with probability 0.998886\n[0.00s -> 30.00s]ក្រសួងសុខាភិបាលកាលពីថ្ងៃចិន្នបានធ្វើការអំពីនាលដល់បង់ប្អូនប្រជាពលរត់ទាំងឱ្យមានការប្រុមប្រយៈការពីសុខភាពពី\n[30.00s -> 60.00s] ក្យមដូចជាក្រុមប្ដាសាយ ហូរសម្បរ ប្រលាក់បំពង្ករកកកន្តាស៍ ជួមមេនមេតភ្នោះមីតភ្នំពី ៦៦ឆ្នាំ ឬអ្នកមានពីរកម្ម ក\n[60.00s -> 90.00s] ាពី ភាគច្រើន បានជាសាស្ប្បីឡើងវិញ គាត់ វាជាសាស្ត្របន្នស្មានថា ប្រហែល ១១២០ ទៅ ១២០ នៃភាគច្រើន គឺស្រាល ប៉ុន្ត\n[90.00s -> 120.00s] ទីដែលមានមានរក បន្ទាប់មក ប៉ុន្មត្មម៉ុន ឬភ្នេះ ដ៏ល្លែងសញ្ញា នៃជំងឺនេះ រួមមាន ក៏ ក្រុងក្ដៅ ទឹងច្រម៉ុស ហូរសម្ប\n[120.00s -> 150.00s] កានអាណាម៉ៃ លានសម្អាតដៃឱ្យ បានមានញាប់ជាមួយសប្បូរ ឬទឹកឱ្យកដែលប៉ះពាល់ភ្នេកច្រុមមក និងមាត់ ប្រសិម្បល់មិនពាន\n[150.00s -> 180.00s] ទឹងបរិខា បុរិភោគជាមួយអ្នកដទ្រី នឹងពាក្យសុំស្លៀប ពាក់សម្លៀបសម្លៀបបំពាក្ក្នសំស្រប ដើម្បីបង្ការភាពប្រជាកព\n[180.00s -> 181.82s] សប្បនេះមិត្តសេរីការអាយ។\n","txt",[101,614,615,620,625,630,635,641,647,653],{"__ignoreMap":99},[104,616,617],{"class":106,"line":107},[104,618,619],{},"Detected language 'km' with probability 0.998886\n",[104,621,622],{"class":106,"line":121},[104,623,624],{},"[0.00s -> 30.00s]ក្រសួងសុខាភិបាលកាលពីថ្ងៃចិន្នបានធ្វើការអំពីនាលដល់បង់ប្អូនប្រជាពលរត់ទាំងឱ្យមានការប្រុមប្រយៈការពីសុខភាពពី\n",[104,626,627],{"class":106,"line":340},[104,628,629],{},"[30.00s -> 60.00s] ក្យមដូចជាក្រុមប្ដាសាយ ហូរសម្បរ ប្រលាក់បំពង្ករកកកន្តាស៍ ជួមមេនមេតភ្នោះមីតភ្នំពី ៦៦ឆ្នាំ ឬអ្នកមានពីរកម្ម ក\n",[104,631,632],{"class":106,"line":538},[104,633,634],{},"[60.00s -> 90.00s] ាពី ភាគច្រើន បានជាសាស្ប្បីឡើងវិញ គាត់ វាជាសាស្ត្របន្នស្មានថា ប្រហែល ១១២០ ទៅ ១២០ នៃភាគច្រើន គឺស្រាល ប៉ុន្ត\n",[104,636,638],{"class":106,"line":637},5,[104,639,640],{},"[90.00s -> 120.00s] ទីដែលមានមានរក បន្ទាប់មក ប៉ុន្មត្មម៉ុន ឬភ្នេះ ដ៏ល្លែងសញ្ញា នៃជំងឺនេះ រួមមាន ក៏ ក្រុងក្ដៅ ទឹងច្រម៉ុស ហូរសម្ប\n",[104,642,644],{"class":106,"line":643},6,[104,645,646],{},"[120.00s -> 150.00s] កានអាណាម៉ៃ លានសម្អាតដៃឱ្យ បានមានញាប់ជាមួយសប្បូរ ឬទឹកឱ្យកដែលប៉ះពាល់ភ្នេកច្រុមមក និងមាត់ ប្រសិម្បល់មិនពាន\n",[104,648,650],{"class":106,"line":649},7,[104,651,652],{},"[150.00s -> 180.00s] ទឹងបរិខា បុរិភោគជាមួយអ្នកដទ្រី នឹងពាក្យសុំស្លៀប ពាក់សម្លៀបសម្លៀបបំពាក្ក្នសំស្រប ដើម្បីបង្ការភាពប្រជាកព\n",[104,654,656],{"class":106,"line":655},8,[104,657,658],{},"[180.00s -> 181.82s] សប្បនេះមិត្តសេរីការអាយ។\n",[63,660,662],{"id":661},"worth-it","Worth it?",[56,664,665],{},"Yes, if you need speech recognition on a machine without a big GPU. The conversion takes a minute and the model gets smaller and faster for it. Accuracy still comes from your training data.",[94,667,669],{"className":301,"code":668,"language":303,"meta":99,"style":99},"print(\"Thank you for reading!\")\n",[101,670,671],{"__ignoreMap":99},[104,672,673,675,677,679,682,684],{"class":106,"line":107},[104,674,472],{"class":348},[104,676,352],{"class":157},[104,678,367],{"class":157},[104,680,681],{"class":114},"Thank you for reading!",[104,683,367],{"class":157},[104,685,467],{"class":157},[687,688,689],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":99,"searchDepth":121,"depth":121,"links":691},[692,693,694,695,696],{"id":65,"depth":340,"text":66},{"id":91,"depth":340,"text":92},{"id":140,"depth":340,"text":141},{"id":270,"depth":340,"text":271},{"id":661,"depth":340,"text":662},"2025-03-08","Converting Whisper with CTranslate2 so it runs faster and lighter.","md",{"tags":701},[702,703],"Machine Learning","Python",true,{"title":14,"description":698},"cu1Mi_XASSFchhQZamQlpT3UFnugSsCOJaltpeLeSJA",[708,710],{"title":10,"path":11,"stem":12,"description":709,"children":-1},"Six ways to stretch a small audio dataset, with the code I use.",{"title":18,"path":19,"stem":20,"description":711,"children":-1},"Calling native libraries from Dart with dart:ffi, and which languages work.",1791981009264]