見出し画像

音声からプログラムを自動的に作るautocodeを作った

なんか吾輩の昔のブログを読みたいという酔狂な奴がいて、何でも最近会社を立ち上げたらしくて売上が1億を超えたところらしい。

他ならぬ友が会社を立ち上げて苦労している時に、吾輩の昔のブログのタイトルだけ覚えていて、それが見たいのだという。

吾輩は主にAI学習用に自分のブログのアーカイブを持っている。
持っているのだがHTML形式のため非常に読みにくい。

そこでHTMLタグ除去コードを書こうと思ったのだが、今からそんなもの書くのは芸がないので、まず音声入力を受け取って、それを音声認識した結果をClaude-3に投げてプログラムとして出力するプログラムを書いてみた。

これのミソは、喋るだけでコードが出来上がることである。

実際に使うとこうなる。

python autocode.py
Recording...
Recording finished.
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Due to a bug fix in https://github.com/huggingface/transformers/pull/28687 transcription using a multilingual Whisper will default to language detection followed by transcription instead of translation to English.This might be a breaking change for your use case. If you want to instead always translate your audio to English, make sure to pass `language='en'`.
Recognized prompt: インターネットで上級機関車の写真を検索して表示。
Generated code:
 はい、以下のPythonコードでインターネットから上級機関車の写真を検索して表示できます。

```python
import requests 
from bs4 import BeautifulSoup

url = 'https://www.google.com/search?q=high+speed+train&source=lnms&tbm=isch'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

images = soup.find_all('img')

for image in images:
    src = image['src']
    if 'http' in src:
        print(src)
        image_response = requests.get(src)
        with open('high_speed_train.jpg', 'wb') as f:
            f.write(image_response.content)
        from PIL import Image
        img = Image.open('high_speed_train.jpg')
        img.show()
```

このコードは次のことを行います:

1. インターネットで「high speed train」という検索クエリを使って画像検索を行う

2. 検索結果ページのHTMLを解析するためにBeautiful Soupを使う

3. HTMLからすべての<img>タグを取得する

4. src属性を持つ最初の画像のURLを取得する

5. そのURLから画像データを取得する

6. 画像データをlocalファイル'high_speed_train.jpg'に保存する

7. PIL/Pillowライブラリを使ってその画像を表示する

これでインターネットから上級機関車の写真を検索して表示するPythonプログラムが完成しました!

import requests 
from bs4 import BeautifulSoup

url = 'https://www.google.com/search?q=high+speed+train&source=lnms&tbm=isch'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

images = soup.find_all('img')

for image in images:
    src = image['src']
    if 'http' in src:
        print(src)
        image_response = requests.get(src)
        with open('high_speed_train.jpg', 'wb') as f:
            f.write(image_response.content)
        from PIL import Image
        img = Image.open('high_speed_train.jpg')
        img.show()

Code saved to generated_code.py
shi3z@shi3zettonoMacBook-Pro ~/p/autocode> python generated_code.py 
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTvd0GiENzdTzOx2w_NC5J48A_w0PV0RuVk_GnpZxIMiiUTvTMRdPtzLYCDuDg&s
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTdLmco6gn9ccngImzrWcZdun6mk3CnupqUqVxo0VL93oWNaKOYUTzdpohXyI8&s
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTnIu6IihWMrpEWFacIbtwnEmWiDxqWBE8kmTMT2va_G9RVZg-lZSRTiLJssw&s
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQPP6t1vHVj7MZ4scr9j54Lyox-MeeWr9ESr4rsI5xk0ZM212NSo-gRztXQqZQ&s
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSGDpnfA8OkHY0QC_zyt0aZXbxnYnQJ2K2-XdjhwjJQDkVmG3mXH6f28YQNAg&s
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT4iDf17p1LJvcgEW56RIL0JU4SUbhYDsmjqIz5wrDZnec9FCud5JyQU8QsBbo&s
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSVTM_fypxT0yi4K6aLG8jKo6kZ4J223kTmJFrzIRLL-rncddZ1-3GoyjJwqus&s
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRvsgOcdFxDxcsfR4RihbI-vTJA4wnXEPldpGt9qNhGp0YMr5He3TfbxJnmew&s
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcScZOK6KQw0HRMjAzM0_-qZ1lo2vIHl1v7On-FqiKILntYXabGpuTLaN9d-bQ&s
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRbDTMnkDJ1rVNwCOExLfLT2qHwVmcpuhHNPb87a7vfpNF9BiRNFsEukO9Wjgo&s
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTt86AuP_XU7yTqsJc8CEQ7xJm34eT5hAv05mLColC3JmInhcxilXoefUl8XCA&s
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQE1ZucXSGgbBZhx0vWrTdRGO-PpJElNB_VvWCiG_iIdnNAO4ctuDl23WuHSg&s
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRByYXQ8tpkBn-LEMh6xxd7AAsaoX3A1IWXxAckQtcIbO0UsqyADD2Aki1unQ&s
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRGzPSSJ1Vej0zDEJF-sc6f08IkI-5R8vB1BlPabuzFxe09deNPkNcqb78BRXg&s
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQmmIwI_Ta4tv5HbITvWdvY_wHfNBiHHtAHbY5gFYS1KyuJ2Rf8iLJnKEOr_A&s
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR5dkvWrKjdRSUlWHQw_qkREn3iPB68Y0hjKpXfs4t4IpkLqq2L4vUUrPUcqQ&s
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcScwPMOI41EJdZucWMBNIXDMQZr-4CW_KJ0SS9NmA12Fsym1W6_9yOcKiuDCw&s
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQgiNwUmqO4YLgVo45NFgfXfQZHE98SAOsHANGTwkQEGveeXKqZBov41mHhcg&s
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRPCsLM-NrHJIMVvOWMRfdYPqGJj3rhaQ-F-a-Vgrs-xCNOCS4DRwEjp5sxpQ&s
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSG5JnTfEtM_DSesOGLm24luhbB1AWs0IrTjXfZsc4VLPDbd2uHdGZ_FMPdiQ&s
発音が悪かったのか、上級機関車と解釈されてしまって違うものが出てきたが大体合ってる

実行後、「Recording…」と表示されたところで「インターネットから蒸気機関車の画像を検索して表示」とだけ指示している

要はOpenInterpreterと同じようなものなのだが、起点が音声というだけでだいぶ違った体験になる。

Whisperを使っているので、Whisperが対応している音声言語なら英語、日本語以外にも対応できる。

やはりプログラムを書かせるとなるとclaude-3が良さそうな気がする。好みの問題かもしれないが。